You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

内存屏障为何禁止静态全局变量优化?如何优化静态全局变量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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 21:15:35