-
- Эта оптимизация называется "loop-invariant code motion". В IAR ее можно отдельно отключить, насколько я помню. Но это неправильный путь. Правильно - объявлять твою primaryB как volatile il-2(1 знак., 26.12.2024 05:25, ссылка)
- Странный вопрос. То, что меняется вне контекста, вне страницы
исходного кода, обязано быть выкинуто компилятором, так как,
варианты: а) не меняется в пределах обозримого контекста; б) не
приводит к побочным эффектам. Nikolay_Po(847 знак., 25.12.2024 23:34)
- ХЗ, конешно, но, каг-то неубедительно. mse homjak(298 знак., 26.12.2024 10:36)
- Я как-то озаботился, пару раз посидел и глубоко подумал. И всё
понял. У меня никаких разногласий с компиляторами насчёт volatile
нет. Код большого конечного автомата, что я правил, на 6000 строк
(ну, так было удобно его автору), содержит всего штук 5 таких
переменных - когда обращается напрямую к данным, обновляемым в
прерываниях. Nikolay_Po(2612 знак., 26.12.2024 14:20)
- Недавно подымал тему с CH32V303. У которого внешняя шина глючит на нечотные полуслова. Разрешилось только так, пришлось ваять функцыю на чтение памяти: mse homjak(300 знак., 31.12.2024 17:18)
- Не... это понятно. Непонятно, почему нет какой-нить директивы, типа
#if-#endif только "#выкл-#вкл" оптимизаццыю. - mse homjak(26.12.2024 16:48)
- Зачем вкл/выкл? Вы просто напишите корректный код, а не с
"undefined behavior", как в случае данных, меняемых вне контекста.
А так - да, когда у школьника код глючит, так он оптимизацию
выключает - говорит, помогает. - Nikolay_Po(26.12.2024 17:23)
- А если у меня данные меняются вне контекста? - mse homjak(26.12.2024 17:45)
- Ну просто же. В том файле где меняются вне контекста - volatile, в
остальных без оного. Например при неприоритетной системе
прерываний, в файле прерывания определяем без volatile, в остальных файлах с volatile. А еще лучше использовать гетер, и волатильную
переменную не светить по всему проекту. Например так IBAH(439 знак., 26.12.2024 19:18)
- Ещё лучше исползовать локальную копию volatile там, где код в прерывании либо прерывания временно запрещены. - vpv.vpv(27.12.2024 06:55)
- Ну, скажэм так, зачем нужна переменная в прерывании, для передачи
данных из внешнего порта, если её нельзя пользовать в проекте? Т.е.
только волатильность. mse homjak(417 знак., 26.12.2024 19:55)
- Это АВР? 8бит? Волатильность не только оптимизация, это еще и
должно быть атомарное чтение - IBAH(26.12.2024 20:10)
- Не... Там даные идут регулярно и с запасом по времени. Т.е.
атомарность чтения соблюдать не надо. Об этом подумано изначально. - mse homjak(26.12.2024 20:23)
- Ну как не надо? два байта за одну команду не переслать, а если
модификация произойдет после чтение первого байта? - IBAH(26.12.2024 20:40)
- Месье намекает, что к моменту следующей модификации, его код из
main(), уже всё закончит и модификация ни на что не повлияет. А
после модификации будет поднят флаг и всё спокойно обработается
снова и завершиться раньше, чем наступит следующее обновление. - Nikolay_Po(26.12.2024 20:56)
- а к моменту первой модификации? - IBAH(26.12.2024 21:01)
- У ТС нет проблем с первой модификацией. - Nikolay_Po(26.12.2024 21:06)
- Хужэ того, если не будет успевать, то устройство принципиально неработоспособно. - mse homjak(26.12.2024 21:22)
- У ТС нет проблем с первой модификацией. - Nikolay_Po(26.12.2024 21:06)
- а к моменту первой модификации? - IBAH(26.12.2024 21:01)
- Месье намекает, что к моменту следующей модификации, его код из
main(), уже всё закончит и модификация ни на что не повлияет. А
после модификации будет поднят флаг и всё спокойно обработается
снова и завершиться раньше, чем наступит следующее обновление. - Nikolay_Po(26.12.2024 20:56)
- Ну как не надо? два байта за одну команду не переслать, а если
модификация произойдет после чтение первого байта? - IBAH(26.12.2024 20:40)
- Не... Там даные идут регулярно и с запасом по времени. Т.е.
атомарность чтения соблюдать не надо. Об этом подумано изначально. - mse homjak(26.12.2024 20:23)
- Во-во. Поэтому всегда тщательно анализируйте, какие переменные внутри контекста, а какие - из прерываний. И назначайте соответствующие квалификаторы. Я при каждом ревью кода внимательно смотрю, вплоть до составления списка, какие переменные у меня обновляются или вычитываются вне контекста. И объявляю их волатильными. Nikolay_Po(267 знак., 26.12.2024 20:01)
- Это АВР? 8бит? Волатильность не только оптимизация, это еще и
должно быть атомарное чтение - IBAH(26.12.2024 20:10)
- В общем, вредный совет насчёт там волатильная, а сям - нет. Когда-то так и делал. Нюанс в том, что запись тоже оптимизируется. Поэтому если в контексте, допустим, прерывания, запись в неволатильную память на этот контекст не влияет, она может быть упразднена. Nikolay_Po(290 знак., 26.12.2024 19:39)
- Значит, обращайтесь к ним с модификатором volatile. Если есть
уверенность, что на конкретном участке выполнения, значение
меняться не будет, то, чтобы не блокировать оптимизацию,
используйте временную не-волатильную переменную или просто
приведение типа к не-волатильному. - Nikolay_Po(26.12.2024 19:06)
- Тут неприятность возникла исключительно как частный случай. mse homjak(184 знак., 26.12.2024 20:01)
- Ну просто же. В том файле где меняются вне контекста - volatile, в
остальных без оного. Например при неприоритетной системе
прерываний, в файле прерывания определяем без volatile, в остальных файлах с volatile. А еще лучше использовать гетер, и волатильную
переменную не светить по всему проекту. Например так IBAH(439 знак., 26.12.2024 19:18)
- А если у меня данные меняются вне контекста? - mse homjak(26.12.2024 17:45)
- Как это нет? Вы плохо искали, наверное. - SciFi(26.12.2024 16:51)
- Зачем вкл/выкл? Вы просто напишите корректный код, а не с
"undefined behavior", как в случае данных, меняемых вне контекста.
А так - да, когда у школьника код глючит, так он оптимизацию
выключает - говорит, помогает. - Nikolay_Po(26.12.2024 17:23)
- Немного расширю первый пункт. Хорошо спроектированная программа не
нуждается в volatile. - IBAH(26.12.2024 14:49)
- Гы. У меня все программы просто идеальны. Иду за пивом, тащась от собственной крути. Бapбoc(57 знак., 26.12.2024 16:03)
- Подтверждаю. Идеальной программе не нужна аппаратура. Нет volatile-
регистровадресов памятипортов периферии. Поэтому volatile - да, не нужны. - Nikolay_Po(26.12.2024 16:01)- Это конечно передергивание. Я имел ввиду немного другое. Нужно
читать-писать из переменных и регистров ВВ таким образом, чтобы не
требовался модификатор volatile. Хорошим примером является FIFO буфер UART, нет
необходимости объявлять указатели головы/хвоста и регистр ВВ Уарт
волатильными, не смотря на то, что они меняется вне
контекста. - IBAH(26.12.2024 16:19)
- Если что, без volatile нет гарантии, что порядок доступа к
переменным не будет изменён. Это бывает реже, чем кеширование,
поэтому и баг будете искать дольше. - SciFi(26.12.2024 19:47)
- а как это изменение порядка доступа к переменным? то есть читаю А,
читаю В, а по факту может быть наоборот? - IBAH(26.12.2024 20:45)
- Так точно. Сам такое видел. - SciFi(26.12.2024 21:30)
- Интересно узнать, на каком процессоре? - IBAH(26.12.2024 21:49)
- На любом, лишь бы компилятор был современный, навороченный. Nikolay_Po(1005 знак., 26.12.2024 22:46)
- У нас тут Cortex-M обычно, вот он и был. - SciFi(26.12.2024 22:34)
- Интересно узнать, на каком процессоре? - IBAH(26.12.2024 21:49)
- Так точно. Сам такое видел. - SciFi(26.12.2024 21:30)
- а как это изменение порядка доступа к переменным? то есть читаю А,
читаю В, а по факту может быть наоборот? - IBAH(26.12.2024 20:45)
- Так у вас получится сделать
одинконечный автомат с одним приоритетом задач. Что-то более сложное, с разными приоритетами задач, вынудит вас использовать volatile или скрыть это в ОСРВ, которая внутри пользуется volatile-источниками и приёмниками данных. - Nikolay_Po(26.12.2024 17:25)
- Если что, без volatile нет гарантии, что порядок доступа к
переменным не будет изменён. Это бывает реже, чем кеширование,
поэтому и баг будете искать дольше. - SciFi(26.12.2024 19:47)
- Это конечно передергивание. Я имел ввиду немного другое. Нужно
читать-писать из переменных и регистров ВВ таким образом, чтобы не
требовался модификатор volatile. Хорошим примером является FIFO буфер UART, нет
необходимости объявлять указатели головы/хвоста и регистр ВВ Уарт
волатильными, не смотря на то, что они меняется вне
контекста. - IBAH(26.12.2024 16:19)
- Чтобы не заморачиваться с volatile, можно просто отключить
оптимизацию. И проблеме конец. Включить оптимизацию, это как
заточить нож. Острый режет хорошо и быстро, но им можно по
неопытности порезать палец. Тупой режет долго и плохо, зато все
пальцы целые. )) - vpv.vpv(26.12.2024 10:54)
- Я не против заморочиться с волатильностью. Но совать её по любому
поводу, каг-та не фэншуйно. Компилятор под это выделяет слишком
много ресурса. Тем более, что текст однозначно показывает, чо надо.
Тупым ножом, кстате, можно нехило порезаться. - mse homjak(26.12.2024 11:10)
- См. моё сообщение выше. Nikolay_Po(287 знак., 26.12.2024 14:26, ссылка)
- Никто не запрещает использовать разную волатильность в разных
единицах компиляции. В одном файле int a; в другом extern volatile
int a; или даже extern const volatile int a - IBAH(26.12.2024 14:14)
- Да. const volatile int приходилось объявлять, чтобы компилятор понял, что от него
требуется прочесть значение из указанных ячеек FLASH, а не просто
"захардкодить". Но на счёт разного объявления в разных единицах
компиляции не согласен. Если включить предупреждения, компилятор
будет ругаться на разницу в объявлениях одного и того же объекта. - Nikolay_Po(26.12.2024 14:24)
- Компилятор не знает как переменная объявленная в другом файле,
поэтому и не ругается. На этапе линковки может ругнутся, если
объявления противоречат друг-другу, но этот случай к этому не
относится. Делаю так IBAH(555 знак., 26.12.2024 14:45)
- Я делаю иначе. Если в конкетном участке кода, волатильность
переменной не требуется, то чтобы не мешать оптимизатору, я просто
присваиваю её значение временной переменной, с которой потом и
работаю и которая максимально оптимизируется без жонглирования
иф-дефами. - Nikolay_Po(26.12.2024 15:58)
- Именно так! - vpv.vpv(27.12.2024 06:47)
- Я делаю иначе. Если в конкетном участке кода, волатильность
переменной не требуется, то чтобы не мешать оптимизатору, я просто
присваиваю её значение временной переменной, с которой потом и
работаю и которая максимально оптимизируется без жонглирования
иф-дефами. - Nikolay_Po(26.12.2024 15:58)
- Компилятор не знает как переменная объявленная в другом файле,
поэтому и не ругается. На этапе линковки может ругнутся, если
объявления противоречат друг-другу, но этот случай к этому не
относится. Делаю так IBAH(555 знак., 26.12.2024 14:45)
- Да. const volatile int приходилось объявлять, чтобы компилятор понял, что от него
требуется прочесть значение из указанных ячеек FLASH, а не просто
"захардкодить". Но на счёт разного объявления в разных единицах
компиляции не согласен. Если включить предупреждения, компилятор
будет ругаться на разницу в объявлениях одного и того же объекта. - Nikolay_Po(26.12.2024 14:24)
- Это предновогодний троллинг такой? :))) Даже и не знаю, что
возразить. На то, что под volatile компилятор выделяет много
ресурса. )) - vpv.vpv(26.12.2024 13:50)
- Это правда, что volatile зачастую слишком грубый инструмент.
Пригодились бы и дополнительные варианты с различной
избирательностью. Но мсье хомяк от этого только больше запутается. - SciFi(26.12.2024 14:29)
- Volatile прекрасный инструмент. Просто пользоваться им надо с умом. Где-то сделать локальную копию, если нужны вычисления и модификация, и прерывания можно запретить. Надо просто представлять, как работает процессор. - vpv.vpv(27.12.2024 06:44)
- Да. Я бы сказал, что компилятор выделяет ресурс. А точнее, не удаляет лишнее выделение ресурса для объявленного volatile. - Nikolay_Po(26.12.2024 14:21)
- Это правда, что volatile зачастую слишком грубый инструмент.
Пригодились бы и дополнительные варианты с различной
избирательностью. Но мсье хомяк от этого только больше запутается. - SciFi(26.12.2024 14:29)
- Я не против заморочиться с волатильностью. Но совать её по любому
поводу, каг-та не фэншуйно. Компилятор под это выделяет слишком
много ресурса. Тем более, что текст однозначно показывает, чо надо.
Тупым ножом, кстате, можно нехило порезаться. - mse homjak(26.12.2024 11:10)
- Я как-то озаботился, пару раз посидел и глубоко подумал. И всё
понял. У меня никаких разногласий с компиляторами насчёт volatile
нет. Код большого конечного автомата, что я правил, на 6000 строк
(ну, так было удобно его автору), содержит всего штук 5 таких
переменных - когда обращается напрямую к данным, обновляемым в
прерываниях. Nikolay_Po(2612 знак., 26.12.2024 14:20)
- ХЗ, конешно, но, каг-то неубедительно. mse homjak(298 знак., 26.12.2024 10:36)