-
- моя версия, касается gcc - может но не будет! ибо это криминал. начиная с 10 версии gcc кроет матом на конструкцию a+=b ; если а и b имеют volatile тип. до этого забивался болт, в следующей версии скорее всего это будет ошибка, во всяком случае я бы запретил и понудил пОграммиста написать a=a+b или a=b+a и чтоб он потом не плакал что не понимает в чем большая разница этих выражений. физика процесса - если не volotile то пишите как хотите и оптимизатор тоже как захочет так и за оптимизирует - нарушения klen(460 знак., 17.03.2020 16:01)
- каждый день удивляет. Можете дать ссылку на случай a+=b ? - _Constantin24(18.03.2020 07:33)
- Проблема решается ручным прописыванием последовательности с помощью локальных переменных. Заодно и предупреждения уходят. - VLLV(17.03.2020 10:16)
- Читать не последовательно, в другом порядке? Не уверен, не должен. А вот вынести запись в конец функции и выполнить в последнюю очередь, на выходе -- запросто может. Т.е. переупорядочить относительно других инструкций и, в частности, относительно обращений к памяти (по указателям и т.п.) Если порядок относительно других обращений к памяти важен, то следует использовать memory barriers. На сахаре уже 10 раз писали: fk0(63 знак., 17.03.2020 10:07, ссылка)
- Если я правильно понимаю то, что написано на cppreference, компилятор не может изменять порядок доступа к двум volatile, но может переставлять запись/чтение volatile и обычной переменной. йцyкeн(542 знак., 17.03.2020 15:48, ссылка)
- то что я хотел услышать, спасибо. - _Constantin24(18.03.2020 07:35)
- stm, LL драйвера написаны с использованием __STATIC_INLINE. Для настройки периферии необходимо ее отключать. Нужен ли здесь барьер? Пример: отключаем периферию - барьер - настройка - барьер - включаем периферию. - _Constantin24(17.03.2020 10:45)
- По-моему, барьеры актуальны для взрослых процов. У стм32 - начиная с CortexM7. Там ещё кеши и тому подобный геморрой. - SciFi(17.03.2020 10:47)
- Барьеры актуальны даже для AVR, если компилятор GCC. Не помнишь эпичный тред на microcontroller.net, где переупорядочивались запрет прерывания и обращение к SFR-регистру? - fk0(18.03.2020 00:47)
- сори, stm32h7. Кеши пока не используются - _Constantin24(17.03.2020 11:35)
- По-моему, барьеры актуальны для взрослых процов. У стм32 - начиная с CortexM7. Там ещё кеши и тому подобный геморрой. - SciFi(17.03.2020 10:47)
- Если я правильно понимаю то, что написано на cppreference, компилятор не может изменять порядок доступа к двум volatile, но может переставлять запись/чтение volatile и обычной переменной. йцyкeн(542 знак., 17.03.2020 15:48, ссылка)
- Последовательность вычислений не всегда расписана правилами языка, в иных случаях написано "бывает по-всякому". Там, где она расписана, отклонения для volatile не допускаются. Более того, яр даже предупреждает "вот тут у тебя volatile, а последовательность правилами языка не задана, если что, сам дурак". - SciFi(17.03.2020 08:52)
- моя версия, касается gcc - может но не будет! ибо это криминал. начиная с 10 версии gcc кроет матом на конструкцию a+=b ; если а и b имеют volatile тип. до этого забивался болт, в следующей версии скорее всего это будет ошибка, во всяком случае я бы запретил и понудил пОграммиста написать a=a+b или a=b+a и чтоб он потом не плакал что не понимает в чем большая разница этих выражений. физика процесса - если не volotile то пишите как хотите и оптимизатор тоже как захочет так и за оптимизирует - нарушения klen(460 знак., 17.03.2020 16:01)