优化、全局变量与内存屏障相关技术问题咨询
AVR编译器中断变量优化疑问
场景描述
- 示例代码中,初始状态下变量
v位于匿名命名空间内,无法被当前翻译单元(TU)外部访问:- 编译器在
-O3优化级别下,会将main()中的循环直接优化为空循环; - 在
-Os优化级别下,循环保留,但v的加载操作被移到循环外部,实际变成无意义的死循环。
- 编译器在
isr()函数模拟中断服务程序(ISR),原本可能被优化移除,但因为带有__used__属性而被保留。- 即便将
v改为外部可见的全局变量,生成的汇编代码也完全没有变化!
核心问题
- 编译器为何会判定该场景下
v不会被修改? - 插入内存屏障确实能解决两种场景下的问题,但为何仅将
v设为外部可见并不足够?
示例代码
#include <avr/cpufunc.h> //int v; namespace { int v; void isr() __asm__("__vector_5") __attribute__ ((__signal__, __used__ )); void isr() { v += 1; } } int main() { while(true) { // _MemoryBarrier(); if (v == 42) { v += 1; } } }
内容的提问来源于stack exchange,提问作者wimalopaan
相关产品推荐
相关产品推荐

