首页 文章

隐式声明所有变量volatile

提问于
浏览
0

gcc是否有一个选项可以禁用未明确定义为volatile的全局变量的读/写优化?

我的团队在使用gcc构建的嵌入式C项目中耗尽了程序内存 . 当我启用优化来减少代码大小时,代码不再按预期工作,因为我们没有使用我们应该使用的volatile关键字 . 也就是说,我能够通过声明在ISR中访问的一些变量volatile来解决呈现问题 . 但是,我没有任何确定性,那些是我需要声明volatile的唯一变量,我还没有注意到其他错误 .

我听说"some compilers"有一个标志来隐含地声明一切都是易变的,但我应该抵制诱惑,因为它是"substitute for thought"(见https://barrgroup.com/Embedded-Systems/How-To/C-Volatile-Keyword) .

是的,但是想的很贵 . 请随意尝试在评论部分中与我讨论,但我希望快速修复以在不破坏应用程序的情况下降低代码大小 .

2 回答

  • 0

    你的意思是 -O0

    我希望通过快速实验攻击GCC并不困难 . gcc/c/c-decl.cgrokdeclarator 中的这个地方可能是无条件为有趣的 storage_class 值注入 volatile 限定符的好地方(在你的情况下可能是 csc_nonecsc_externcsc_static ) .

    /* It's a variable.  */
    /* An uninitialized decl with `extern' is a reference.  */
    int extern_ref = !initialized && storage_class == csc_extern;
    
    type = c_build_qualified_type (type, type_quals, orig_qual_type,
                       orig_qual_indirect);
    

    从性能/代码大小的角度来看,实验应该告诉您这是否可行,如果是,您可能希望将其作为正确的上游补丁提交 .

  • 2

    可以通过例如将所有基本类型重新定义为相同但使用volatile说明符来实现 . 无论如何,如果代码中的所有变量都是volatile,我希望应用程序的大小会比优化之前的大 .

    My solution is :为部分代码启用优化 . 如果您的应用程序具有某种功能架构,则可以开始启用优化并测试此功能是否正常工作 . 它比优化所有内容和分析无效的原因要容易得多 .

相关问题