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

优化、全局变量与内存屏障相关技术问题咨询

AVR编译器中断变量优化疑问

场景描述

  • 示例代码中,初始状态下变量v位于匿名命名空间内,无法被当前翻译单元(TU)外部访问:
    • 编译器在-O3优化级别下,会将main()中的循环直接优化为空循环;
    • 在-Os优化级别下,循环保留,但v的加载操作被移到循环外部,实际变成无意义的死循环。
  • isr()函数模拟中断服务程序(ISR),原本可能被优化移除,但因为带有__used__属性而被保留。
  • 即便将v改为外部可见的全局变量,生成的汇编代码也完全没有变化!

核心问题

  1. 编译器为何会判定该场景下v不会被修改?
  2. 插入内存屏障确实能解决两种场景下的问题,但为何仅将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 22:16:41