打印

C8051F 的C51的问题!快崩溃了

[复制链接]
2117|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xilinxer|  楼主 | 2009-1-8 13:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
代码如下:
unsigned char CalTempFromADCResult(unsigned int TempADCResult)
{
  unsigned char CalTemp;
  signed int tempvalue;
  signed int temp2;

   tempvalue=(int)(((float)TempADCResult/100.0)*((float) SystemPara.TempS));
   temp2=SystemPara.TemperOffset;
   tempvalue-=temp2;
  
   CalTemp=(unsigned char)tempvalue;
   return CalTemp;
  
}
我把SystemPara.TemperOffset付给temp2,temp2的类型和SystemPara.TemperOffset一样。SystemPara.TemperOffset的值为307,
为什么赋值给temp2,而temp2的值为51或-205,51是305的高8位全变成0,-205高8位全为1。而低8位不变。用的是C8051F413。编译器为KEIL-C。搞了一整天也看不出哪儿有错!不会是编译器问题吧!
大伙帮我看看啊!


SystemPara的声明如下
typedef struct 
{
 unsigned char Mode1; //0
 unsigned char Mode2; //1
 unsigned int  Modset;//2,3
 unsigned int  APCset;// 4,5
 signed int    TemperOffset;//6,7
 unsigned char TempS;       //8
 unsigned char SupplyO;  //9
 unsigned char VcompS;   //10
 unsigned char KFactorSH;  //11
 unsigned char KFactorSL;  //12
 unsigned char K2Temp;   //13
 unsigned int  TemperV;  //14,15 ADC temperature result
 unsigned int  SupplyV;  //16,17 ADC supply result
 unsigned int  IBiasV;   //18,19 ADC bias current result
 unsigned int  Imd1V;    //20, 21 ADC monitor current result
 unsigned int  RSSIV;  //22,23  ADC RSSI result
 unsigned char    CalTemp; //24
 //unsigned int  Biasset;   // for test

} SysPara;

相关帖子

沙发
computer00| | 2009-1-8 13:51 | 只看该作者

keil应该不会出这么低级的错误啊...

使用特权

评论回复
板凳
xilinxer|  楼主 | 2009-1-8 13:56 | 只看该作者

可我但不运行,然后监视变量确实是这样的!

55555!咋办啊!绊住了

使用特权

评论回复
地板
computer00| | 2009-1-8 14:14 | 只看该作者

被优化掉了

因为你的代码中
   temp2=SystemPara.TemperOffset;
   tempvalue-=temp2;

temp2没啥用,keil直接给你生成了tempvalue-=SystemPara.TemperOffset的语句。
只要你的tempvalue结果正确就行了。temp2值是多少不用管它。

使用特权

评论回复
5
xilinxer|  楼主 | 2009-1-8 14:26 | 只看该作者

本来我的代码里是没有temp2的!

就因为减法出的结果不对!我的tempvalue是610,SystemPara=307,减法运算后应该是303,可结果是559。我把最后一句改成tempvalue-=307;得到的结果也是559!看来int的减法也不行!
真的要崩溃了!

使用特权

评论回复
6
computer00| | 2009-1-8 14:40 | 只看该作者

还是因为优化的原因,结果还是正确的。

看看你的代码:
   tempvalue=(int)(((float)TempADCResult/100.0)*((float) SystemPara.TempS));
   temp2=SystemPara.TemperOffset;
   tempvalue-=temp2;
  
   CalTemp=(unsigned char)tempvalue;
   return CalTemp;

因为你要返回的是CalTemp,而它的值又是tempvalue的低8位。也就是说,tempvalue的高8位是没用的。
结果编译器就将高8位优化掉了,只剩下了低8位有用,而303(0x12F)的低8位是0x2F,559(0x22F)的低8位也是0x2F,
所以你函数的返回值还是正确的。
其实编译器编译出来之后,
   temp2=SystemPara.TemperOffset;
   CalTemp=(unsigned char)tempvalue;
这两句都被优化掉了,并没有给它们赋值,甚至连
   tempvalue-=temp2;
这一句,也优化掉了一部分,并没有将计算结果的高字节写回,而直接将结果的低8位返回了。

使用特权

评论回复
7
xilinxer|  楼主 | 2009-1-8 15:04 | 只看该作者

牛人啊!

还真是这么回事!太感谢了!终于解决了!谢谢诶计算机00啊!

使用特权

评论回复
8
computer00| | 2009-1-8 15:23 | 只看该作者

遇到问题一定要找到原因,不要只看到结果。

使用特权

评论回复
9
ayb_ice| | 2009-1-8 20:45 | 只看该作者

又发现有人怀疑KEIL了

比KEIL更牛的C编译器是很少的

使用特权

评论回复
10
zpc| | 2009-1-16 15:50 | 只看该作者

据说IAR比KEIL牛啊

使用特权

评论回复
11
ayb_ice| | 2009-1-16 20:08 | 只看该作者

IAR其它的比KEIL牛

51的话还是KEIL牛

使用特权

评论回复
12
hotpower| | 2009-1-16 20:10 | 只看该作者

KEIL的软件仿真好,IAR支持C++

俺都喜欢~~~

使用特权

评论回复
13
mugenwon| | 2009-1-17 13:30 | 只看该作者

近期也开始怀疑keil了

同样是c8051f,电脑调试一点问题也没有,上电复位必跑飞,而且飞得很有规律,几乎要砸机器了!

使用特权

评论回复
14
computer00| | 2009-1-17 13:43 | 只看该作者

换个版本的吧...有些版本的keil的确有bug。

使用特权

评论回复
15
李冬发| | 2009-1-17 23:21 | 只看该作者

早期的keil C51是没法用的,我在51里只用PLM!

使用特权

评论回复
16
catwill| | 2009-1-19 18:50 | 只看该作者

13楼的兄弟不会没喂狗吧……

使用特权

评论回复
17
oumi| | 2009-1-20 11:01 | 只看该作者

程序跑飞的话还是要找自己的问题

摸清楚编译器的脾气会觉得keil还是很耐用的。

使用特权

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

本版积分规则

38

主题

170

帖子

1

粉丝