打印

keil的switch问题

[复制链接]
5846|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
laosong|  楼主 | 2007-5-31 16:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用 keil7.50 调试下面代码,模拟时竟然乱选择,请各位神仙驻足过目:#include <reg51.h>
unsigned char W;
OPSE(unsigned char t)
{ switch(t)
   {    case 1:
             W=0x26;
             break;   //不执行上一句,会跳到这里!!奇怪。
        case 2:
             W=0x4c;
             break;
        case 3:
             W=0x98;
             break;
        case 4:
             W=0x98;
             break;
        case 5:
             W=0x26;
             break;
        case 6:
             W=0x26;
             break;
        default:break; 
  }
}
main()
{
  OPSE(1);
  while(1);
}

相关帖子

沙发
xzhenggen| | 2007-5-31 16:40 | 只看该作者

用OPSE(0x01);试一下。

使用特权

评论回复
板凳
laosong|  楼主 | 2007-5-31 16:59 | 只看该作者

不行的

不行的,我用keil7.20 7.50 8.02 版本都试了。
望各位将这段代码拖到你的keil中试一下就感觉到奇怪了。

使用特权

评论回复
地板
Autine| | 2007-5-31 17:20 | 只看该作者

确实是哦 怎么回事

除了你说的那行  我的下面还有几行也是这样

使用特权

评论回复
5
laosong|  楼主 | 2007-5-31 17:32 | 只看该作者

1、3、5不行,2、4、6可以;

1、3、5不行,2、4、6可以;

使用特权

评论回复
6
Explor| | 2007-5-31 19:29 | 只看该作者

回复

没遇到这种问题,是不是执行到while中,程序飞了,
改为:while(1)
      {OPSE(1);} 试试

使用特权

评论回复
7
lele1511| | 2007-5-31 19:56 | 只看该作者

试了不行

使用特权

评论回复
8
lbx_00| | 2007-5-31 21:04 | 只看该作者

插入无用码

例如这样插入:

case 1: 
       w =0x26;
       w =0x26;
       break;

使用特权

评论回复
9
awey| | 2007-5-31 21:52 | 只看该作者

W在main中没使用,可能被编译器优化掉了

使用特权

评论回复
10
王紫豪| | 2007-5-31 22:55 | 只看该作者

编译器优化。。。。你这个不如用if else

使用特权

评论回复
11
Autine| | 2007-6-1 08:09 | 只看该作者

不是 编译器优化 吧 我2个都选

使用特权

评论回复
12
laosong|  楼主 | 2007-6-1 08:29 | 只看该作者

是被编译器优化掉了!

经过反复查看编译结果,发现keil优化的强大!
因为选择结构中 1、5、6执行内容一样,3、4执行内容也一样,实际只有3个选择,keil就直接将重复的代码给去掉编译了。
大家可以看见最终的结果是正确的。
这就提醒我们,用keil调试或仿真时,很多地方不会按你原程序一句一句走的!

使用特权

评论回复
13
gyt| | 2007-6-1 09:45 | 只看该作者

厉害

果然有优化的效果

使用特权

评论回复
14
Autine| | 2007-6-1 10:15 | 只看该作者

那里能设置不让它优化掉代码吗???

使用特权

评论回复
15
emailli| | 2007-6-1 10:22 | 只看该作者

定义用关键字volatile

比如:
volatile  unsigned char W;

这样定义以后就不会被优化了。

我以前也遇到过。有时优化结果是对的。有时又不是。

所以,后来我很多参数定义都用了关键字volatile定义。

结果是牺牲了一些空间。

使用特权

评论回复
16
zxq1234508| | 2007-6-1 11:04 | 只看该作者

是被编译器优化掉了

调试的时候编译级别选择低一点的,不要过高了,不然会出问题的,我试了一下,选择级别2就可以了。选择8就不行

使用特权

评论回复
17
nevsayno| | 2007-6-1 13:17 | 只看该作者

编译器优化的问题。。。

在优化一栏勾选 0级优化。。。
当仿真完没有问题后,再改成8级优化。

使用特权

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

本版积分规则

3

主题

15

帖子

0

粉丝