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 标准库的选项。并且项目本身不需要输入/输出,没有自己的输入/输出功能变体。
那么除了禁用优化器之外,我还有哪些选择?
一种常见的方法是通过宏将其放入 while 循环中。
#define KEEP_UNUSED(var) do { (void)var; } while(false);
Run Code Online (Sandbox Code Playgroud)
IAR 还有一个扩展名为__root:
http ://supp.iar.com/FilesPublic/UPDINFO/004350/manuals.htm
__root 属性可以用在函数或变量上,以确保当链接包含该函数或变量的模块时,也包含该函数或变量,无论它是否被程序的其余部分引用。
最可靠的方法是在链接器文件中找到一个强制某个变量链接的设置。但这当然完全取决于系统。
否则,可移植的标准解决方案只是(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使指针本身易变,这意味着禁止编译器优化写入。)
| 归档时间: |
|
| 查看次数: |
3269 次 |
| 最近记录: |