代码如下:
unsigned char CalD(unsigned short vamb,unsigned short vOffset)
{
double dV1,dV2,dG;
if(vamb < NormalVforV1)
{
return(255);
}
if(vamb >= VREF)
{
return(0);
}
//1,
dV1 = (vamb-NormalVforV1)*NormalRforV1;
//2,cal V2-Target
dV2 = (double)vOffset * 1.332 - (cVSIGBASE / cgnGain3) ;
//3,
dG = (dV1-dV2)/(VREF-dV1) + 1;
if(dG <=0) return(255);
//4,
dV1=(double)(256)/dG - 1;
if(dV1>255)dV1=255;
else if(dV1<1)dV1=1;
return( (unsigned char)dV1 );
}
就这个程序,大家有没有想过居然有问题呢?
使用IAR4.42A的编译器,
经过汇编代码发现,红色部分的语句居然被优化掉了(忽略了),
没有办法,只有强制把dV2 定义为 volatile 类型,问题解决了;
真不明白IAR 的优化算法。 |