ysa*_*sap 5 c embedded compilation c99 iar
在我的嵌入式项目中,使用IAR EWARM开发工具(v7.10.3),我有以下代码:
/* 1 */ uint32_t packet_sync = 0;
/* 2 */ uint32_t synced = 0;
/* 3 */ uint32_t gpio = 0;
/* 4 */ while (1) {
/* 5 */ if ((packet_sync != 0) && ((packet_sync = gpio) == 0)) {
/* 6 */ if (synced < 2) {
/* 7 */ synced++;
/* 8 */ }
/* 9 */ }
/* 10 */ };
Run Code Online (Sandbox Code Playgroud)
出于某种原因,当我编译代码时,编译器会在编译过程中陷入困境.我尝试使用各种构造,似乎我做了任何微小的改变,消除了问题(但也可能使代码不正确).例如,在#6a中添加NOP,代码确实成功编译:
/* 6 */ if (synced < 2) {
/* 6a */ __NOP();
/* 7 */ synced++;
/* 8 */ }
Run Code Online (Sandbox Code Playgroud)
成功更改的其他示例是删除第7行或更改第5行:
/* 5 */ if ((packet_sync != 0) && ((gpio) == 0)) {
Run Code Online (Sandbox Code Playgroud)
以及更多的变化.
我没有在有问题的代码中看到C规则违规,并且它在Visual Studio 2013中编译得很好.我想念一些东西吗?为什么这段代码不能编译?
*注意:提供的代码是实际代码的摘录,在逻辑上毫无意义.
更新:代码使用"高"/"平衡"优化级别进行编译.使用较低的优化级别,编译结束就好了.
当使用"高"级别但在"启用的转换:"框中删除优化选项时,它也会卡住.此外,卡住"速度"和"大小"选项.
如果编译器确实“卡住”,即冻结,因此您必须终止该进程,那么这当然是编译器错误。
弄清楚为什么一段代码(=编译器)我们没有看到特定输入的中断是非常困难的。
另一方面,如果您的意思是编译器因报告代码中的错误而停止,那么了解这一点及其内容当然会很有用。