Недавно я столкнулся с проблемой, когда переменная изменялась только в обработчике прерываний. Сама переменная не была объявлена нестабильной, поэтому при более высоких уровнях оптимизации компилятор нарушил код. Однако компилятор достаточно умен, чтобы скомпилировать код прерывания, потому что прерывание все еще срабатывает.Почему компилятор не оптимизирует код прерывания?
Так вот мои вопросы:
Если компилятор достаточно умен, чтобы скомпилировать код прерывания, почему он не достаточно умен, чтобы понять, что переменные изменяются внутри, что прерывание?
На более высоких уровнях оптимизации функции, которые не называются, оптимизируются. Поскольку никакой код не вызывает обработчик прерываний, он должен быть оптимизирован. Что заставляет компилятор компилировать код прерывания в любом случае?
Разместите код и, возможно, соответствующий демонтаж – Sinkingpoint
Какой компилятор вы используете (это свежая версия [GCC] (http://gcc.gnu.org/))? Какие флаги оптимизации? Какова целевая платформа и процессор? И почему бы вам не использовать 'volatile' (вы действительно должны в своем случае)? –
Может быть, потому что на него ссылаются, когда вы загружаете векторный контроллер прерываний по адресу? Если ссылается адрес обработчика, то компилятор предположит, что он может быть вызван. –