打印

Keil51仿真的问题

[复制链接]
3026|29
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
deng_1976|  楼主 | 2007-12-2 17:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
恩保| | 2007-12-2 19:08 | 只看该作者

把所有的程序发过来看看

把整个程序搞过来看看啦。为什么m==5的时候从num3[4]开始,而m==4的时候也是从num3[4]开始。是不是分号出了问题

使用特权

评论回复
板凳
computer00| | 2007-12-2 19:25 | 只看该作者

估计是那几个变量后面都没用到,所以编译器认为你这语句

所以就将这些语句给删除了...也就是说被优化掉了....

使用特权

评论回复
地板
deng_1976|  楼主 | 2007-12-2 21:51 | 只看该作者

谢谢上面2位的回复。

部分程序如下,想了半天,后来我把ELSE删除就ok了。 想不通为什么这样就不通,估计可能是优化的问题,但优化不至于不管IF-ELSE吧。。。。

  if(m==5)
   {
      Num3[4]=0xff;
      Num3[3]=0xff;
      Num3[2]=0xff;
      Num3[1]=0xff;
      Num3[0]=0xff;
   }

   if(m==4)
   {
      Num3[4]=0xff;
      Num3[3]=0xff;
      Num3[2]=0xff;
      Num3[1]=0xff;
      if(n==0) Num3[0]=0x00;
      if(n==1) Num3[0]=0x80;
      if(n==2) Num3[0]=0xc0;
      if(n==3) Num3[0]=0xe0;
      if(n==4) Num3[0]=0xf0;
      if(n==5) Num3[0]=0xf8;
      if(n==6) Num3[0]=0xfc;
      if(n==7) Num3[0]=0xfe;
   }

使用特权

评论回复
5
computer00| | 2007-12-2 22:03 | 只看该作者

优化的事情可难说了,只要是无用的语句,编译器通常会帮

使用特权

评论回复
6
mapleyang| | 2007-12-2 22:39 | 只看该作者

还有一种可能

你的这两个case里面给这几个元素赋值都是一样的,编译器认为不管哪种情况都执行同样的结果,就给优化了

使用特权

评论回复
7
xwj| | 2007-12-2 22:47 | 只看该作者

还有个可能

合并到其他地方去了,你先跟一遍看看

使用特权

评论回复
8
deng_1976|  楼主 | 2007-12-3 08:44 | 只看该作者

中间分割条白色区域所对应地方是执行不到的

中间分割条白色区域所对应地方是执行不到的。一点启动调试的时候,这些区域都能自动分出来

使用特权

评论回复
9
computer00| | 2007-12-3 09:45 | 只看该作者

不是执行不到,而是在编译的时候,根本就已经将这些语句

不信你自己看看编译后的汇编。

使用特权

评论回复
10
古道热肠| | 2007-12-3 09:55 | 只看该作者

优化的可能性最大,关注运行结果

只要结果是对的,可以认为是优化的缘固,可将优化等级设定为2级试试。

使用特权

评论回复
11
ayb_ice| | 2007-12-3 09:55 | 只看该作者

这是优化的问题,很正常

和其它的公共部分合并了,所以在其它地方执行了,不影响功能的

使用特权

评论回复
12
deng_1976|  楼主 | 2007-12-3 09:58 | 只看该作者

呵呵。

computer00说的对,调试的时候我看过汇编的地方,执行不到的地方语句在汇编里面压根就没有了,估计被优化掉了。。。。

使用特权

评论回复
13
deng_1976|  楼主 | 2007-12-3 10:00 | 只看该作者

11楼: 这是优化的问题,很正常

11楼的兄弟,这个影响功能的,结果是执行到了不该执行的地方去了。
 
    

使用特权

评论回复
14
computer00| | 2007-12-3 10:04 | 只看该作者

虽然执行到了不该执行到的地方去了,但是结果还是可能是

不一定要按照你的流程执行才是正确的,编译器改个方法执行,换个地方执行,只要结果是正确的,就算OK。

使用特权

评论回复
15
deng_1976|  楼主 | 2007-12-3 10:30 | 只看该作者

在这里,结果不对,所以我只好将ELSE删除了。

在这里,结果不对,所以我只好将ELSE删除了,并联几个IF语句。

使用特权

评论回复
16
ayb_ice| | 2007-12-3 11:42 | 只看该作者

我用KEIL也有好几年了,还没有发现什么优化错误

使用特权

评论回复
17
mapleyang| | 2007-12-3 13:27 | 只看该作者

re

楼主用个switch试试?
按理keil不会那么弱的,因为优化带来功能的问题。把代码再贴完整一些看看,看你的代码也没啥好保密的。

使用特权

评论回复
18
deng_1976|  楼主 | 2007-12-3 13:39 | 只看该作者

LS的,我准备晚上回家弄个SWITCH-CASE看看。

里面的代码就是这样,不知道是否有问题。后面的IF前面加ELSE就会那样。

   Num4[0]=Data/10000;
   Num4[1]=(Data-Num4[0]*10000)/1000;
   Num4[2]=(Data-Num4[0]*10000-Num4[1]*1000)/100;
   Num4[3]=(Data-Num4[0]*10000-Num4[1]*1000-Num4[2]*100)/10;
   Num4[4]=Data-Num4[0]*10000-Num4[1]*1000-Num4[2]*100-Num4[3]*10;

   TankHeight=Tank_Height[0]*100+Tank_Height[1];
   TankHeight=5000;
   k=(int)(Data*40.0/TankHeight+0.5);
   if(k>40) k=40;
   m=k/8;
   n=k%8;

   if(m==5)
   {
      Num3[4]=0xff;
      Num3[3]=0xff;
      Num3[2]=0xff;
      Num3[1]=0xff;
      Num3[0]=0xff;
   }

   if(m==4)
   {
      Num3[4]=0xff;
      Num3[3]=0xff;
      Num3[2]=0xff;
      Num3[1]=0xff;
      if(n==0) Num3[0]=0x00;
      if(n==1) Num3[0]=0x80;
      if(n==2) Num3[0]=0xc0;
      if(n==3) Num3[0]=0xe0;
      if(n==4) Num3[0]=0xf0;
      if(n==5) Num3[0]=0xf8;
      if(n==6) Num3[0]=0xfc;
      if(n==7) Num3[0]=0xfe;
   }

   if(m==3)
   {
      Num3[4]=0xff;
      Num3[3]=0xff;
      Num3[2]=0xff;
      if(n==0) Num3[1]=0x00;
      if(n==1) Num3[1]=0x80;
      if(n==2) Num3[1]=0xc0;
      if(n==3) Num3[1]=0xe0;
      if(n==4) Num3[1]=0xf0;
      if(n==5) Num3[1]=0xf8;
      if(n==6) Num3[1]=0xfc;
      if(n==7) Num3[1]=0xfe;
      Num3[0]=0x00;
   }

   if(m==2)
   {
      Num3[4]=0xff;
      Num3[3]=0xff;
      if(n==0) Num3[2]=0x00;
      if(n==1) Num3[2]=0x80;
      if(n==2) Num3[2]=0xc0;
      if(n==3) Num3[2]=0xe0;
      if(n==4) Num3[2]=0xf0;
      if(n==5) Num3[2]=0xf8;
      if(n==6) Num3[2]=0xfc;
      if(n==7) Num3[2]=0xfe;
      Num3[1]=0x00;
      Num3[0]=0x00;
   }

   if(m==1)
   {
      Num3[4]=0xff;
      if(n==0) Num3[3]=0x00;
      if(n==1) Num3[3]=0x80;
      if(n==2) Num3[3]=0xc0;
      if(n==3) Num3[3]=0xe0;
      if(n==4) Num3[3]=0xf0;
      if(n==5) Num3[3]=0xf8;
      if(n==6) Num3[3]=0xfc;
      if(n==7) Num3[3]=0xfe;
      Num3[2]=0x00;
      Num3[1]=0x00;
      Num3[0]=0x00;
   }

   if(m==0)
   {
      if(n==0) Num3[4]=0x00;
      if(n==1) Num3[4]=0x80;
      if(n==2) Num3[4]=0xc0;
      if(n==3) Num3[4]=0xe0;
      if(n==4) Num3[4]=0xf0;
      if(n==5) Num3[4]=0xf8;
      if(n==6) Num3[4]=0xfc;
      if(n==7) Num3[4]=0xfe;
      Num3[3]=0x00;
      Num3[2]=0x00;
      Num3[1]=0x00;
      Num3[0]=0x00;
   }

使用特权

评论回复
19
dld2| | 2007-12-3 14:43 | 只看该作者

把楼主的程序改简单些

int i;
for (i = 0; i < 5; i++)
{
    if (i < (4 - m))
        Num3 = 0x00;
    else if (i == (4 - m))
        Num3 = 0xff << (8 - n);
    else
        Num3 = 0xff;
}

使用特权

评论回复
20
xwj| | 2007-12-3 14:55 | 只看该作者

唉,这程序写得...

要是按行数算钱或大小那就发了...

使用特权

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

本版积分规则

7

主题

45

帖子

0

粉丝