内存屏障为何禁止静态全局变量优化?如何优化静态全局变量g的访问?
问题:如何让静态全局变量g的访问被avr-gcc优化?
这段代码包含中断服务程序isr与普通函数func,二者共用全局变量flag,同时定义了静态全局变量g:
- 无内存屏障时,由于
flag会被中断异步修改,代码存在逻辑问题 - 添加全局内存屏障
<1>可以修复该问题,但会同时抑制对g的优化——g是当前翻译单元(TU)私有、外部不可访问的变量,原本应该被编译器完全优化掉 - 全局内存屏障的效果和调用非内联函数
f()``<3>一致,但存在疑问:既然g对外不可见,为什么编译器无法优化它的访问操作? - 尝试使用针对
flag的特定内存屏障<2>,也没能解决问题(未给flag添加volatile修饰,因为该关键字仅应用于硬件寄存器的访问场景)
核心需求:如何让编译器对g的访问操作进行优化?使用的编译器为avr-gcc。
#include <stdint.h> uint8_t flag; void isr() __asm__("__vector_5") __attribute__ ((__signal__, __used__, __externally_visible__)); void isr() { flag = 1; } static uint8_t g; void f(); void func(void) { for (uint8_t i=0; i<20; i++) { // f(); // <3> // __asm__ __volatile__ ("" : : : "memory"); // <1> // __asm__ __volatile__ ("" : "=m" (flag)); // <2> ++g; if (flag) { flag = 0; } } } //void f(){}
内容的提问来源于stack exchange,提问作者wimalopaan
相关产品推荐
相关产品推荐

