我想调试我的代码并且无法在此过程中访问内部层,因为这会干扰与硬件的通信。 (在监视列表干扰基本读访问的情况下执行易失性操作。)
所以我测试了接口的返回值,但IAR编译器甚至会优化掉未使用的volatile变量。
和这样的声明:
i = object.foo();
if (i)i=i;
也没有帮助。
我在SO上找到了这个案例的建议,以便使用i / o操作。但这也没有选择,因为我不能选择包含C标准库。并且项目本身并不需要i / o,没有输入/输出功能的变体。
那么除了禁用优化器之外我还有什么选择?
答案 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
,使指针本身易失,这意味着禁止编译器优化掉写入它。)