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

时间:2015-09-16 11:50:59

标签: c++ embedded volatile iar

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

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

和这样的声明:

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

也没有帮助。

我在SO上找到了这个案例的建议,以便使用i / o操作。但这也没有选择,因为我不能选择包含C标准库。并且项目本身并不需要i / o,没有输入/输出功能的变体。

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

2 个答案:

答案 0 :(得分:3)

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

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

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

  

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

答案 1 :(得分:3)

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

否则,便携式标准解决方案只是在代码中的某处写入(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,使指针本身易失,这意味着禁止编译器优化掉写入它。)