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

dhe*_*ein 6 c++ embedded volatile iar

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

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

和这样的声明:

i = object.foo();
if (i)i=i;
Run Code Online (Sandbox Code Playgroud)

也没有帮助。

我在这里找到了 SO 只是回答了该案例使用 i/o 操作的建议。但这也不是选项,因为我没有包含 C 标准库的选项。并且项目本身不需要输入/输出,没有自己的输入/输出功能变体。

那么除了禁用优化器之外,我还有哪些选择?

Hel*_*rld 5

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

#define KEEP_UNUSED(var) do { (void)var; } while(false);
Run Code Online (Sandbox Code Playgroud)

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

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


Lun*_*din 5

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

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

#ifdef DEBUG_BUILD
volatile int dummy;

// all variables you would like to have linked:
dummy = i; 
dummy = j;
...
#endif
Run Code Online (Sandbox Code Playgroud)

或者,如果您喜欢晦涩的宏:

#define FORCE_LINKING(x) { void* volatile dummy = &x; }
Run Code Online (Sandbox Code Playgroud)

void*因为这是类型泛型并且适用于每种变量。* volatile使指针本身易变,这意味着禁止编译器优化写入。)