我想调试我的代码,但无法访问进程中的内部层,因为这会干扰与硬件的通信。 (在监视列表会干扰基本读取访问的情况下执行易失性操作。)
因此,我正在测试接口的返回值,但 IAR 编译器甚至会优化未使用的易失性变量。
和这样的声明:
i = object.foo();
if (i)i=i;
也没有帮助。
我发现这里只是回答了针对该情况使用 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
使指针本身易失性,这意味着禁止编译器优化对其的写入。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)