gcc是否有一个选项可以禁用未明确定义为volatile的全局变量的读/写优化?
我的团队在使用gcc构建的嵌入式C项目中耗尽了程序内存。当我启用优化来减少代码大小时,代码不再按预期工作,因为我们没有使用我们应该使用的volatile关键字。也就是说,我能够通过声明在ISR中访问的一些变量volatile来解决呈现问题。但是,我没有任何确定性,那些是我需要声明volatile的唯一变量,我还没有注意到其他错误。
我听说“一些编译器”有一个标志来隐含地声明一切都是不稳定的,但我应该抵制诱惑,因为它是“思想的替代品”(见https://barrgroup.com/Embedded-Systems/How-To/C-Volatile-Keyword)。
是的,但是想的很贵。请随意尝试在评论部分中与我讨论,但我希望能够快速修复代码大小,而不会破坏应用程序。
答案 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,我希望应用程序的大小会比优化之前的大。
我的解决方案:为部分代码启用优化。如果您的应用程序具有某种功能架构,则可以开始启用优化并测试此功能是否正常工作。它比优化所有内容和分析无效的原因要容易得多。