如何停止优化器丢弃未使用的变量

How to stop optimizer discard unused variables?

本文关键字:未使用 变量 何停止 优化      更新时间:2023-10-16

我想调试我的代码,不能访问进程中的内层,因为这会干扰与硬件的通信。(易失性操作是在监视列表会干扰基本读访问的地方执行的。)

所以我正在测试接口的返回值,但IAR编译器甚至会优化未使用的易失性变量。

和这样的语句:

i = object.foo();
if (i)i=i;

也没用

我在SO上找到的只是回答了使用I/o操作的建议。但这也没有选择,因为我没有包含C标准库的选项。并且项目本身不需要I/O,也没有自己的输入/输出函数的变体。

那么除了禁用优化器,我还有什么选择呢?

最可靠的方法是在链接器文件中找到强制链接某个变量的设置。但这当然完全取决于系统。

否则,可移植的标准解决方案就是简单地在代码的某个地方编写(void)i;。这适用于大多数编译器。如果没有,你可以更进一步:

#ifdef DEBUG_BUILD
volatile int dummy;
// all variables you would like to have linked:
dummy = i; 
dummy = j;
...
#endif

或者如果你喜欢晦涩的宏:

#define FORCE_LINKING(x) { void* volatile dummy = &x; }

(void*,因为它是类型泛型,适用于所有类型的变量。* volatile使指针本身易失性,这意味着编译器被禁止优化掉对它的写操作。

一种常见的方法是通过宏将其放入while循环中。

#define KEEP_UNUSED(var) do { (void)var; } while(false);

IAR还有一个扩展名为__root:http://supp.iar.com/FilesPublic/UPDINFO/004350/manuals.htm

__root属性既可以用在函数上,也可以用在变量上确保,当包含函数或变量的模块是链接,函数或变量也包括在内,无论它是否由程序的其余部分引用。