打印

IAR 真有点无法相信你啊?!

[复制链接]
1792|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
TRUE_ARM|  楼主 | 2011-1-28 09:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
代码如下:

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 的优化算法。

相关帖子

沙发
TRUE_ARM|  楼主 | 2011-1-28 09:27 | 只看该作者
IAR 4.42A 32K 限制版本,优化等级是中等。

使用特权

评论回复
板凳
xinzha| | 2011-1-28 09:32 | 只看该作者
这个为什么不能优化掉呢,局部变量并且只有一次运算赋值,以后再没用到,在优化规则中就是要优化掉的吧。

使用特权

评论回复
地板
TRUE_ARM|  楼主 | 2011-1-28 09:56 | 只看该作者
在第三步计算式需要用到,怎么能把第二步的计算忽略呢?忽略了,第三步的计算结果就错了?

使用特权

评论回复
5
wljs012| | 2011-1-28 10:29 | 只看该作者
一样,KEIL的优化也会出问题。

使用特权

评论回复
6
sjnh| | 2011-1-28 10:52 | 只看该作者
建议你看结果:
dV2 = (double)vOffset * 1.332 - (cVSIGBASE / cgnGain3) ;
dG = (dV1-dV2)/(VREF-dV1) + 1;
dV2只用了1次,有可能优化成
dG = (dV1-(double)vOffset * 1.332 - (cVSIGBASE / cgnGain3) )/(VREF-dV1) + 1;
这样就去掉dV2

我下面的程序,因为为了保持程序统一,用了个结构体,内部的指针后面都没有用 例如&gSDev.num都没有
ADS里编译把结构体都优化掉了,后来查看lst看,后面的函数set_cur(vfLand[0].x,vfLand[0].y);直接用了结构体中的数代替,执行正确
const LcdVal vfLand[24] = {
        {19,  0, &gSDev.num},
        {17, 16, &gSDev.sm},
        ......
        {0,0,NULL}
};

void show_fj_land(short fj)
{
        set_cur(vfLand[0].x,vfLand[0].y);
        sPrint(0,"%d",gfDev[fj].num);
        set_cur(vfLand[1].x,vfLand[1].y);
        sPrint(0,"%d",gfDev[fj].sm);
        ......
}

使用特权

评论回复
7
QQTony| | 2011-1-28 10:54 | 只看该作者
不相信编译器会出错! LZ不妨把对应的汇编代码贴出来看看.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

124

主题

454

帖子

1

粉丝