ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
22 июля
1107516 Топик полностью
Nikolay_Po (08.06.2021 14:48, просмотров: 264) ответил misyachniy на Ну в том то и вопрос, как гарантировано определить, что для компилятора " текущий процесс", и "контекст текущей страницы исходного кода".
Буквально. DMA-модуль микроконтроллера тоже компилятор скомпилировал? Похоже, вы не понимаете, как работает код, который вы пытаетесь "улучшить". В противном случае вам было бы ясно, может измениться значение или нет. Ещё раз: если память, где находится массив, может быть изменена в прерывании или аппаратно (DMA), то код, в котором идёт обращение к этим данным, этого не знает. Компиляторы пока не отслеживают прерываний. И, без модификатора volatile, не станут писать в 

память

или перечитывать значение, если код можно выполнить и без этого.

Если не стоит volatile, то записи данных в переменную может не произойти. И другой процесс (прерывание, модуль периферии и т.п.), делая своё чтение, не получит актуальных данных - код, которому не сообщили о волатильности объекта, просто не сделал своевременной записи - она была ему не нужна.


На счёт контекста. Речь идёт о текущем процессе, о коде на текущей странице. Если процесс непрерывный (один поток, без прерываний), то все вызванные им функции, пусть даже они находятся в других исходниках, попадают в контекст. И если переменную меняют только они (нет прерываний или аппаратных изменений), то volatile не надо.


Дополню: если есть прерывания и аппарантые изменения, но они не затрагивают объект (включая чтение), то для этого объекта не требуется модификатора volatile. Если же код прерывания или аппаратный модуль читает данные и должен получать их актуальное значение, которое меняется в коде, то для этого кода применение модификатора volatile необходимо.


Так понятно?