IAR编译优化

IAREWARM编译器和其他厂家的C编译器相比非常高效,但是当程序里面包含对时序要求比较严格的代码的时候,IAR常常会把这些代码过渡优化,破坏了时序的要求,造成程序错误,在程序代码比较紧的时候又必须优化。

可以在要求比较严格的代码的函数前面,用#pragmaoptimize=none不进行优化或者#pragma optimize=low进行低级优化。要注意的是:设置优化等级要小于初始options默认设置的优化等级。Optimization can only belowered from the default, not raise.

例如,工程中配置了优化级别,代码中可以通过下面方法再次改变优化级别:

#pragmaoptimize=none

void fun()

{

}

不对fun()函数优化

 

下面代码,如果设置了高优化,可能循环部分就给优化掉,直接跳过了循环。

void delay()

{

inti;

for(i = 0; i < 1000; i++);

}

因为什么都不做的循环,是个编译器都该给优化去掉。应该在循环体里面用一个nop之类的。可以有以下解决办法:第一个在工程的option中修改optimize等级,第二种是在函数前面加上#pragma optimize=none,第三种修改循环的变量值定义类型为volatile

IAR编译优化

IAR编译优化