-
- Телепаты подсказывают что принудительное размещение константы во флеш нужно, скорее всего, чтобы иметь возможность поменять ее программатором. Скрипач(22 знак., 04.05.2019 20:35)
- Интересная мысль. И она не имеет никакого отношения к подмене адреса переменной её значением. Можно порассуждать о массах чёрных дыр в этом контексте, будет столь же продуктивно. - SciFi(04.05.2019 21:15)
- Имеет. Прямое. - Nikolay_Po(04.05.2019 21:33)
- Имеет. Искать место в коде и писать программатором часть команды - плохой дзен. - Скрипач(04.05.2019 21:29)
- Это да. Для этого нужен volatile. Но это не объясняет подмену адреса переменной её значением. SciFi(37 знак., 04.05.2019 21:59)
- Компилятор - в своем праве. Если адрес константы и ее значение одного размера, то схера писать адрес. - Скрипач(04.05.2019 22:02)
- +1. В этом и корень проблемы. Когда компилятор точно знает, что определённое на этапе компиляции значение неизменно (константа), зачем ему использовать косвенную адресацию, которая требует больше времени и кода? Он будет использовать значение, Nikolay_Po(532 знак., 04.05.2019 22:11)
- Это фантазии. Не надо фантазировать, когда есть нормативные документы. Советую в них заглядывать, кстати. Там есть ещё один соскок: "undefined behavior". В этом случае возможно всё. Но вряд ли это тот случай. - SciFi(04.05.2019 22:16)
- Не фантазии, а реальность. И документы тут не при чём. Никакая оптимизация, дающая тот же результат, что и не оптимизированный вариант, стандартом не запрещена. Постоянно вижу такое, работая с Microchip XC16 и GNU Arm Embedded. Nikolay_Po(1579 знак., 04.05.2019 22:39 - 22:46)
- Вполне возможно что это отклонение от стандарта.
При желании, можно забиться в угол и поплакать.Скрипач(86 знак., 04.05.2019 22:19)- Вы, главное, свой волшебный volatile-бубен не потеряйте. А то еще действительно расплачетесь ;) - s_h_e(04.05.2019 23:10)
- Искрометный юмор. Скрипач(233 знак., 05.05.2019 08:37)
- Вы, главное, свой волшебный volatile-бубен не потеряйте. А то еще действительно расплачетесь ;) - s_h_e(04.05.2019 23:10)
- Это фантазии. Не надо фантазировать, когда есть нормативные документы. Советую в них заглядывать, кстати. Там есть ещё один соскок: "undefined behavior". В этом случае возможно всё. Но вряд ли это тот случай. - SciFi(04.05.2019 22:16)
- Без цитаты текста стандарта языка Си нещитово. И вообще бред. - SciFi(04.05.2019 22:09)
- Стандарт не накладывает ограничений на оптимизацию за исключением объектов, объявленных volatile. Возражения без цитаты текста стандарта языка Си нещитво. - Nikolay_Po(04.05.2019 22:47)
- Не буду разубеждать, да и зачем? Можете верить во что угодно, только не сгубите иной неокрепший ум. Но тут я спокоен, VLLV тёртый калач :-) - SciFi(05.05.2019 06:45)
- Мой посыл "неокрепшим умам" - прост. Скрипач(309 знак., 05.05.2019 08:30 - 08:39)
- Вы же понимаете, что этот аргумент можно довести до неприличного абсурда. Адурина будет казаться вершиной знания :-) - SciFi(05.05.2019 08:45)
- Любой аргумент можно довести до абсурда. Этот - не исключение. Скрипач(193 знак., 05.05.2019 08:46 - 08:50)
- А я не отстану. Конкретно этот вопрос решается достаточно легко. Просто соотнести со стандартом и прийти к выводу, что имеет место баг. Юриспруденция, так сказать. Рассуждать о логике работы бага довольно тупо. - SciFi(05.05.2019 08:53)
- И? Дальше что? Что делать в одном случае (баг) и в другом (фича)? Скрипач(95 знак., 05.05.2019 09:00)
- а вообще можно написать "volatile const"? Можно написать все, кроме сочетаний, разрушающих разум) - VLLV(05.05.2019 11:54)
- SciFi был прав, насчет неподготовленных умов :) - Скрипач(05.05.2019 12:02)
- Можно, но имеет смысл только для регистров, изменяемых аппаратно в процессе работы программы. - s_h_e(05.05.2019 12:00, ссылка)
- Не только. Как раз константы (например настройки), лежащие во флеше и изменяемые путем специальных процедур - хорошие кандидаты на volatile const. - LightElf(05.05.2019 14:29)
- Каких специальных процедур, можно уточнить? М.б. есть пример, когда просто const во флеше может не работать? s_h_e(230 знак., 05.05.2019 15:37)
- Во флеше, в специально выделенной области, хранятся настройки. Эти настройки могут быть изменены средствами самой прошивки. Стирание/Запись данных во флеше обычно представляет из себя набор неочевидных для компилятора манипуляций с регистрами. В LightElf(186 знак., 05.05.2019 16:44 - 16:54)
- Специальная процедура - модификация hex. Когда компилятор не может учесть изменения константы, так как это изменение происходит уже после сборки. - Nikolay_Po(05.05.2019 15:51)
- Т.е. вы даете компоновщику положить константу во флешь по неизвестному заранее адресу (и не указывая явно секцию), потом как-то ищете и модифицируете? Это интересно, никогда так не делал. - s_h_e(05.05.2019 16:00 - 16:02)
- Человек пишет, что место определяет средствами линкера, поэтому знает, где. - Nikolay_Po(05.05.2019 16:03)
- Ну хорошо, что же все-таки может случиться с константой, которая есть в hex, но при этом без volatile? - s_h_e(05.05.2019 16:18)
- Компилятор может оптимизировать обращение к ней, заменив обращение литералом в инструкции. Линкер ведь не сообщил компилятору, что константу программист специально положил по особому адресу и она программисту зачем-то очень нужна. Nikolay_Po(321 знак., 05.05.2019 17:14)
- Адрес/куда положить обычно явно указывается модификаторами при определении объекта, других вариантов не припомню. Так что компилятор всегда в курсе. Замена таких констант литералами не попадалась. s_h_e(92 знак., 05.05.2019 17:53)
- Не, не. Компилятор положит константу в ту секцию, куда надо. Но в исполняемом коде подставит значение константы вместо ссылки на секцию. Разумеете? - Хитрый Китаец(08.05.2019 03:13)
- Да понятно, что именно это подразумевается. Но как бы не очень логично занимать память под неиспользуемые константы. Прецеденты были? s_h_e(139 знак., 08.05.2019 08:32 - 08:35)
- Она может быть линкером выкинута как неиспользуемая, сплошь и рядом. - Хитрый Китаец(10.05.2019 01:08)
- Вот у меня константы с явно заданным размещением линкер никогда не выкидывал. Если такое делает купленный компилятор - это повод, как минимум, для ругани с техподдержкой. Поэтому и просил примеры. - s_h_e(10.05.2019 09:34)
- ПМСМ, кроме того, чтобы явно задать размещение константы, нужно объяснить компилятору, что она нужна тебе зачем-то ещё, чего компилятор не видит. Я за агрессивную оптимизацию. Пусть выкидывает. Nikolay_Po(959 знак., 10.05.2019 12:06 - 12:09)
- Не расстраивайте меня. 1)ну не дает компилятор создать переменную volatile const! 2)hardfault - это последствия неправильного выполнения операции взятия адреса, мы же не последствия разбираем, а причину. - VLLV(10.05.2019 12:56)
- 1) Из инструкции к Microchip XC16 v1.36b: Nikolay_Po(2053 знак., 10.05.2019 13:56 - 14:01)
- А что, компиляторы к контроллерам профессионального уровня тоже переходят в разряд профессиональных и устанавливают планку для всех остальных? Объясните это скандинавам, у тех один ответ на все претензии - "У нас ANSI C компилятор" - VLLV(10.05.2019 14:00 - 14:08)
- Если так, то это означает, что компилятор не обеспечивает поддержку аппаратного обеспечения. Си - сями, но для полного использования железа, копиляторостроители вынуждены (и должны, ПМСМ) добавлять нужные костыли в виде дополнительных атрибутов, Nikolay_Po(176 знак., 10.05.2019 14:22)
- Бывают бесплатные:) Скрипач(392 знак., 10.05.2019 15:28 - 16:11)
- Ну придумал же fkO мем "контроллеры профессионального уровня" :) - VLLV(10.05.2019 16:06)
- Если так, то это означает, что компилятор не обеспечивает поддержку аппаратного обеспечения. Си - сями, но для полного использования железа, копиляторостроители вынуждены (и должны, ПМСМ) добавлять нужные костыли в виде дополнительных атрибутов, Nikolay_Po(176 знак., 10.05.2019 14:22)
- А что, компиляторы к контроллерам профессионального уровня тоже переходят в разряд профессиональных и устанавливают планку для всех остальных? Объясните это скандинавам, у тех один ответ на все претензии - "У нас ANSI C компилятор" - VLLV(10.05.2019 14:00 - 14:08)
- 1) Из инструкции к Microchip XC16 v1.36b: Nikolay_Po(2053 знак., 10.05.2019 13:56 - 14:01)
- Не расстраивайте меня. 1)ну не дает компилятор создать переменную volatile const! 2)hardfault - это последствия неправильного выполнения операции взятия адреса, мы же не последствия разбираем, а причину. - VLLV(10.05.2019 12:56)
- ПМСМ, кроме того, чтобы явно задать размещение константы, нужно объяснить компилятору, что она нужна тебе зачем-то ещё, чего компилятор не видит. Я за агрессивную оптимизацию. Пусть выкидывает. Nikolay_Po(959 знак., 10.05.2019 12:06 - 12:09)
- Вот у меня константы с явно заданным размещением линкер никогда не выкидывал. Если такое делает купленный компилятор - это повод, как минимум, для ругани с техподдержкой. Поэтому и просил примеры. - s_h_e(10.05.2019 09:34)
- Она может быть линкером выкинута как неиспользуемая, сплошь и рядом. - Хитрый Китаец(10.05.2019 01:08)
- Да понятно, что именно это подразумевается. Но как бы не очень логично занимать память под неиспользуемые константы. Прецеденты были? s_h_e(139 знак., 08.05.2019 08:32 - 08:35)
- Не, не. Компилятор положит константу в ту секцию, куда надо. Но в исполняемом коде подставит значение константы вместо ссылки на секцию. Разумеете? - Хитрый Китаец(08.05.2019 03:13)
- Адрес/куда положить обычно явно указывается модификаторами при определении объекта, других вариантов не припомню. Так что компилятор всегда в курсе. Замена таких констант литералами не попадалась. s_h_e(92 знак., 05.05.2019 17:53)
- Компилятор может оптимизировать обращение к ней, заменив обращение литералом в инструкции. Линкер ведь не сообщил компилятору, что константу программист специально положил по особому адресу и она программисту зачем-то очень нужна. Nikolay_Po(321 знак., 05.05.2019 17:14)
- Ну хорошо, что же все-таки может случиться с константой, которая есть в hex, но при этом без volatile? - s_h_e(05.05.2019 16:18)
- Человек пишет, что место определяет средствами линкера, поэтому знает, где. - Nikolay_Po(05.05.2019 16:03)
- Т.е. вы даете компоновщику положить константу во флешь по неизвестному заранее адресу (и не указывая явно секцию), потом как-то ищете и модифицируете? Это интересно, никогда так не делал. - s_h_e(05.05.2019 16:00 - 16:02)
- Каких специальных процедур, можно уточнить? М.б. есть пример, когда просто const во флеше может не работать? s_h_e(230 знак., 05.05.2019 15:37)
- Не только. Как раз константы (например настройки), лежащие во флеше и изменяемые путем специальных процедур - хорошие кандидаты на volatile const. - LightElf(05.05.2019 14:29)
- volatile - говно (пардон за мой французский). Бывает множество способов обойти баг, и смена компилятора, порой, возможна. Ответственные товарищи пишут в
спортлотоСкандинавию, но если это не самая свежая версия, то и говорить не о чем - а SciFi(25 знак., 05.05.2019 09:30)- На счёт говна не согласен. Применение volatile для решения задачи ТС - корректно и оптимально. Не вижу никаких противопоказаний и доказательств вины компилятора. Правда, я фантазёр ещё тот! - Nikolay_Po(05.05.2019 17:17)
- В параллель - да. Тупо сидеть и ждать ответа от этнического турка студента "из Скандинавии" - нет. - Скрипач(05.05.2019 09:37)
- а вообще можно написать "volatile const"? Можно написать все, кроме сочетаний, разрушающих разум) - VLLV(05.05.2019 11:54)
- И? Дальше что? Что делать в одном случае (баг) и в другом (фича)? Скрипач(95 знак., 05.05.2019 09:00)
- А я не отстану. Конкретно этот вопрос решается достаточно легко. Просто соотнести со стандартом и прийти к выводу, что имеет место баг. Юриспруденция, так сказать. Рассуждать о логике работы бага довольно тупо. - SciFi(05.05.2019 08:53)
- Любой аргумент можно довести до абсурда. Этот - не исключение. Скрипач(193 знак., 05.05.2019 08:46 - 08:50)
- Вы же понимаете, что этот аргумент можно довести до неприличного абсурда. Адурина будет казаться вершиной знания :-) - SciFi(05.05.2019 08:45)
- Мой посыл "неокрепшим умам" - прост. Скрипач(309 знак., 05.05.2019 08:30 - 08:39)
- Не буду разубеждать, да и зачем? Можете верить во что угодно, только не сгубите иной неокрепший ум. Но тут я спокоен, VLLV тёртый калач :-) - SciFi(05.05.2019 06:45)
- Стандарт не накладывает ограничений на оптимизацию за исключением объектов, объявленных volatile. Возражения без цитаты текста стандарта языка Си нещитво. - Nikolay_Po(04.05.2019 22:47)
- +1. В этом и корень проблемы. Когда компилятор точно знает, что определённое на этапе компиляции значение неизменно (константа), зачем ему использовать косвенную адресацию, которая требует больше времени и кода? Он будет использовать значение, Nikolay_Po(532 знак., 04.05.2019 22:11)
- Компилятор - в своем праве. Если адрес константы и ее значение одного размера, то схера писать адрес. - Скрипач(04.05.2019 22:02)
- нормальный дзен, патчится хекс перед прошивкой каждого устройства - VLLV(04.05.2019 21:40)
- Нюансы. У меня отдельный "люк" поверх Modbus. Беру из map адрес и пишу. Скрипач(53 знак., 04.05.2019 22:01)
- ваша практика не совпадает с моей - у меня десятки тысяч устройств разных версий, не вижу смысла заниматься ненужной поддержкой версионности, если все решается фиксированным расположением, которое предусмотрено штатными средствами линкера. - VLLV(05.05.2019 10:46)
- Тогда непонятно какая вам разница как компилятор передал в функцию константу. - Скрипач(05.05.2019 11:09)
- Потому что функция, работающая в других местах, в этом не работает - она ожидает адрес, начинает считывает байт по несуществующему адресу и ядро улетает в hardfault. Да можно написать другую функцию, но речь идет о том, как в серьезном VLLV(155 знак., 05.05.2019 12:00)
- Тогда (volatile const)* ptr. Или void func(const char* const param, ...), чтобы передавало константу вместо указателя везде. - Скрипач(05.05.2019 12:03 - 12:10)
- Вы таки будете смеяться, но эта конструкция не передаёт константу вместо указателя. Она передаёт именно что указатель. Константный указатель на константу, но не саму константу. - йцукен(05.05.2019 13:20)
- Только в этом месте извращение в части длины 4 байта, в остальных нормальный буфер в ОЗУ. Собственно решение я нашел, решение получше предложил il-2, volatile компилятор исключает : incompatible declarations. Вопрос остается простой: подмена VLLV(377 знак., 05.05.2019 12:47)
- Тогда (volatile const)* ptr. Или void func(const char* const param, ...), чтобы передавало константу вместо указателя везде. - Скрипач(05.05.2019 12:03 - 12:10)
- Потому что функция, работающая в других местах, в этом не работает - она ожидает адрес, начинает считывает байт по несуществующему адресу и ядро улетает в hardfault. Да можно написать другую функцию, но речь идет о том, как в серьезном VLLV(155 знак., 05.05.2019 12:00)
- Тогда непонятно какая вам разница как компилятор передал в функцию константу. - Скрипач(05.05.2019 11:09)
- ваша практика не совпадает с моей - у меня десятки тысяч устройств разных версий, не вижу смысла заниматься ненужной поддержкой версионности, если все решается фиксированным расположением, которое предусмотрено штатными средствами линкера. - VLLV(05.05.2019 10:46)
- Нюансы. У меня отдельный "люк" поверх Modbus. Беру из map адрес и пишу. Скрипач(53 знак., 04.05.2019 22:01)
- Это да. Для этого нужен volatile. Но это не объясняет подмену адреса переменной её значением. SciFi(37 знак., 04.05.2019 21:59)
- Именно! - Nikolay_Po(04.05.2019 20:54)
- Интересная мысль. И она не имеет никакого отношения к подмене адреса переменной её значением. Можно порассуждать о массах чёрных дыр в этом контексте, будет столь же продуктивно. - SciFi(04.05.2019 21:15)
- На время отладки полезно. Потом не забыть убрать - пусть выкидывает, если не нужно. Кстати, а какие есть варианты, кроме как объявить volatile, для исключения оптимизации? Вывести на печать? - Nikolay_Po(04.05.2019 19:55)
- Для исключения оптимизации можно просто выключить оптимизацию. Ну и с каких пор volatile или нет подменяет адрес переменной её значением? С тем же успехом можно сплясать с бубном. - SciFi(04.05.2019 20:22)
- ПМСМ, отключение оптимизации при отладке слишком сильно меняет код и время его выполнения, что делает отладку слишком оторванной от конечного продукта. Не согласен на счёт бесполезности volatile для предотвращения подмены адреса. Nikolay_Po(691 знак., 04.05.2019 20:40)
- Ну как вы себе представляете замену адреса значением? Пусть написано n=strlen("abc"), тогда очень умный компилятор, знающий, что делает strlen, может заменить этот код на n=3, но не на n=strlen(3). Если функция имеет прототип strlen(const char *), йцукен(94 знак., 04.05.2019 22:16)
- Если во всех местах вызова функция принимает параметр, вычисление которого дает константу, то и передавать в нее константу. Скрипач(65 знак., 05.05.2019 09:21)
- Если функция используется только для строк с длиной 3, то компилятор просто подставит 3, выкинув остальное нафиг. Безотносительно прототипа функции. Похоже, вы отстали от жизни. Или мне попадаются исключительно передовые компиляторы. - Nikolay_Po(04.05.2019 22:30)
- Может, я и отстал от жизни, но ТС утверждает, что функция CRC(char*,int) вызывается, но ей с качестве параметра вместо адреса передаётся значение. Я так и написал, что если компилятор знает, что вернёт чистая функция, он имеет право её не йцукен(75 знак., 04.05.2019 22:54 - 22:58)
- А я не исключаю того, что если функция в примере ТС вызывается с передачей параметра вместо адреса, то она вызывается с передачей параметра вместо адреса во всех остальных местах вызова. Nikolay_Po(219 знак., 04.05.2019 23:01)
- Во всех остальных местах вызова чего? На каком этапе, пардон, принимается решение о замене адреса значением, компиляции модуля или линковки? s_h_e(100 знак., 04.05.2019 23:24)
- LTO? Хороший вопрос. Для начала нужно проверить моё предположение. ТС не пояснил, проверял ли он в отладке оба варианта, с константой ПЗУ и с переменной в одном исходнике, при отладке одной сборки? Nikolay_Po(700 знак., 05.05.2019 00:09)
- Настолько упоротая LTO пока не попадалась. Выкинуть неиспользуемые функции, например - другое дело. s_h_e(406 знак., 05.05.2019 07:46)
- LTO? Хороший вопрос. Для начала нужно проверить моё предположение. ТС не пояснил, проверял ли он в отладке оба варианта, с константой ПЗУ и с переменной в одном исходнике, при отладке одной сборки? Nikolay_Po(700 знак., 05.05.2019 00:09)
- Во всех остальных местах вызова чего? На каком этапе, пардон, принимается решение о замене адреса значением, компиляции модуля или линковки? s_h_e(100 знак., 04.05.2019 23:24)
- А я не исключаю того, что если функция в примере ТС вызывается с передачей параметра вместо адреса, то она вызывается с передачей параметра вместо адреса во всех остальных местах вызова. Nikolay_Po(219 знак., 04.05.2019 23:01)
- Может, я и отстал от жизни, но ТС утверждает, что функция CRC(char*,int) вызывается, но ей с качестве параметра вместо адреса передаётся значение. Я так и написал, что если компилятор знает, что вернёт чистая функция, он имеет право её не йцукен(75 знак., 04.05.2019 22:54 - 22:58)
- volatile означает ровно то, что написано в стандарте языка Си, и там написано совсем не то, что вы тут придумали. Можно придумать соскок "нестандартная прагма означает, что стандарт языка неприменим, творим что хотим", но это совсем неприлично. То SciFi(107 знак., 04.05.2019 21:10)
- завтра на работу не пойду, не надо провоцировать!) - VLLV(04.05.2019 21:29)
- Ну как вы себе представляете замену адреса значением? Пусть написано n=strlen("abc"), тогда очень умный компилятор, знающий, что делает strlen, может заменить этот код на n=3, но не на n=strlen(3). Если функция имеет прототип strlen(const char *), йцукен(94 знак., 04.05.2019 22:16)
- ПМСМ, отключение оптимизации при отладке слишком сильно меняет код и время его выполнения, что делает отладку слишком оторванной от конечного продукта. Не согласен на счёт бесполезности volatile для предотвращения подмены адреса. Nikolay_Po(691 знак., 04.05.2019 20:40)
- Для исключения оптимизации можно просто выключить оптимизацию. Ну и с каких пор volatile или нет подменяет адрес переменной её значением? С тем же успехом можно сплясать с бубном. - SciFi(04.05.2019 20:22)
- Телепаты подсказывают что принудительное размещение константы во флеш нужно, скорее всего, чтобы иметь возможность поменять ее программатором. Скрипач(22 знак., 04.05.2019 20:35)