Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么IAR编译器会卡住?_C_Compilation_Embedded_C99_Iar - Fatal编程技术网

C 为什么IAR编译器会卡住?

C 为什么IAR编译器会卡住?,c,compilation,embedded,c99,iar,C,Compilation,Embedded,C99,Iar,在我的嵌入式项目中,使用IAR EWARM开发工具(v7.10.3),我有以下代码: /*1*/uint32数据包同步=0; /*2*/uint32\u t synched=0; /*3*/uint32\u t gpio=0; /*4*/while(1){ /*5*/如果((数据包同步!=0)和((数据包同步=gpio)==0)){ /*6*/if(同步

在我的嵌入式项目中,使用IAR EWARM开发工具(v7.10.3),我有以下代码:

/*1*/uint32数据包同步=0;
/*2*/uint32\u t synched=0;
/*3*/uint32\u t gpio=0;
/*4*/while(1){
/*5*/如果((数据包同步!=0)和((数据包同步=gpio)==0)){
/*6*/if(同步<2){
/*7*/同步++;
/*  8 */       }
/*  9 */     }
/* 10 */   };

由于某种原因,当我编译代码时,编译器会被困在编译的中间。我尝试了各种构造,似乎我所做的任何微小更改都可以消除问题(但也可能使代码不正确)。例如,在#6a中添加NOP,代码编译成功:

/*6*/if(已同步<2){
/*6a*/_NOP();
/*7*/同步++;
/*  8 */       }
成功更改的其他示例包括删除第7行或将第5行更改为:

/*5*/if((数据包同步!=0)和((gpio)==0)){
还有一些变化

我在有问题的代码中没有看到违反C规则的情况,并且它在Visual Studio 2013中编译得很好。我遗漏了什么吗?为什么这段代码没有编译

*注意:提供的代码是实际代码的摘录,在逻辑上没有意义。


更新:代码是以“高”/“平衡”优化级别编译的。如果优化级别较低,编译结果就很好

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

如果编译器真的“卡住”,即冻结,因此您必须终止进程,那么这当然是一个编译器错误

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


另一方面,如果你的意思是编译器停止,因为它在代码中报告一个错误,当然,知道它和它所说的是有用的。

< P>我怀疑这是一个编译器错误。考虑向编译器供应商提交一个bug,并确保附加错误的源代码,这样它们就可以复制编译器bug。你。现在就试着解决这个bug。

优化是任何编译器中最复杂的部分,因此也是最有可能出现编译器bug的地方——特别是对于一个开发团队规模较小的“狭隘市场”编译器,如果用户需要桌面系统编译器,则数量较少

优化的应用有两个后果,您需要小心:编译器本身可能有缺陷(在本例中很可能如此),以及任何“未定义行为”的区域在优化下,您自己的代码可能会改变行为。如果您需要使用优化,您需要准备进行广泛的测试-生成的代码不一定等同于调试/开发构建

在这种情况下,您当然应该向供应商报告问题,最好是使用一个真正可编译的示例和项目配置。为了解决眼前的问题,明智地使用
volatile
关键字可以解决问题-如果可以的话,优化者将努力消除看起来没有任何影响的变量避免乐观主义者采用相同的路径,您可能会避免错误。如果您没有正确使用
volatile
,在任何情况下都处于优化状态。在您的示例中,某些变量当然需要声明为volatile,但由于示例不是“真实的”而是“说明性的”,因此无法给出建议


另一种可能的解决方法是有选择地禁用此代码节或源文件的优化。您真的需要优化才能使代码正常工作吗?如果不需要,我建议在任何情况下都避免使用优化-不使用优化可以避免调试和发布代码之间的行为变化,并在第一阶段使调试更简单例如,我建议在出现代码大小或性能相关问题时,使用优化作为解决方案,而不仅仅是作为一件理所当然的事情。

该过程陷入困境,我必须单击“停止构建”按钮停止。没有给出错误报告。当然这很难…否则,我不会在这里发布问题;-)@ysap我有点讽刺。我想说你所问的基本上是不可能远程理解的。编译器有商业支持吗?因此;-)。是的,有支持,但很多时候我发现它是错误的o响应速度更快,效率更高。谢谢。你基本上是对的,但请查看我对@unwind的评论。制作一个MCVE,显示错误以获得供应商的良好支持,如果他们无法复制你使用的编译器选项,他们将无法修复它或花费任何时间在它上,如果你切换opt,结果是否会改变I/O还是使用C++编译,而不是C?因为你不知道问题是什么,你怎么能确定呈现一个“抽象”是足够的信息来重现这个问题?代码肯定不是“SSCCE”。正如您所说!在第一个片段中,
gpio
是循环不变的。如果它可能在其他上下文中被更改,则必须声明为
volatile
。根据代码中其他地方的用法,可能还需要声明其他变量。@Clifford-我没有声明SSCCE。一个“C”已删除,因为此代码需要用适当的函数包装。
gpio
确实是不变的(在提取代码中)。代码是按照项目中的定义呈现的。没有变量是易变的。你是对的,我没有提到代码是经过大小优化的。不幸的是,在项目上进行大量返工的情况下很难删除优化。抱歉,优化级别是“高”/“平衡的”。@Clif