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。