为什么IAR编译器卡住了?

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中编译得很好.我想念一些东西吗?为什么这段代码不能编译?

*注意:提供的代码是实际代码的摘录,在逻辑上毫无意义.


更新:代码使用"高"/"平衡"优化级别进行编译.使用较低的优化级别,编译结束就好了.

当使用"高"级别但在"启用的转换:"框中删除优化选项时,它也会卡住.此外,卡住"速度"和"大小"选项.

unw*_*ind 2

如果编译器确实“卡住”,即冻结,因此您必须终止该进程,那么这当然是编译器错误。

弄清楚为什么一段代码(=编译器)我们没有看到特定输入的中断是非常困难的。

另一方面,如果您的意思是编译器因报告代码中的错误而停止,那么了解这一点及其内容当然会很有用。

  • 因此;-)。是的,有支持,但很多时候我发现 SE 的响应能力和生产力要高得多。 (2认同)