隐式声明所有变量volatile

时间:2017-07-21 18:48:16

标签: c gcc volatile

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

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

我听说“一些编译器”有一个标志来隐含地声明一切都是不稳定的,但我应该抵制诱惑,因为它是“思想的替代品”(见https://barrgroup.com/Embedded-Systems/How-To/C-Volatile-Keyword)。

是的,但是想的很贵。请随意尝试在评论部分中与我讨论,但我希望能够快速修复代码大小,而不会破坏应用程序。

2 个答案:

答案 0 :(得分:2)

除了-O0之外,您的意思是什么?

我希望通过快速实验来攻击GCC并不困难。 grokdeclarator gcc/c/c-decl.c volatile中的这个位置可能是无条件为有趣storage_class值注入csc_none限定符的好地方(可能是csc_extern,{{1}在您的情况下,{,csc_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);

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

答案 1 :(得分:0)

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

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