keil 让我很郁闷

[复制链接]
2747|5
 楼主| 因特网用户 发表于 2009-10-23 17:05 | 显示全部楼层 |阅读模式
//////////  


  tmp = input_str[0];
    if(input_str[0]== 0xcc){
     Sync_Flag = 1;
     }
    if(tmp == 0xcc){
     Sync_Flag = 2;
     }
    if(input_str[1]==0x55 ){
     Sync_Flag = 3;
     }
////////////////////////////

input_str是一个定义的unsinged char的串口接收缓冲区,在keil中调试发现当
input_str[0]=0xcc,input_str[1]时,在判断 if(input_str[0]== 0xcc)时条件结果竟然为零,没有执行    Sync_Flag = 1;而 通过  tmp = input_str[0]赋值,在判断    if(tmp == 0xcc)结果为1,执行了     Sync_Flag = 2;在判断    if(input_str[1]==0x55 )时结果正确
天呐,这到底咋回事啊
hyg1984 发表于 2009-10-23 20:03 | 显示全部楼层
tmp = input_str[0];
    if(input_str[0]== 0xcc){
     Sync_Flag = 1;
     }
    if(tmp == 0xcc){
     Sync_Flag = 2;
     }
这个是什么意思?把2个相同值分别比较,难道你是传说中的-----牛角王----或者是没事找事
jerkoh 发表于 2009-10-23 21:14 | 显示全部楼层
哈哈 编译器 比你聪明多了

叫它做这种傻事 它当然不干
dad123123 发表于 2009-10-23 21:46 | 显示全部楼层
上面两位,你们没碰到过这样的问题
楼主,我一年前用51的时候,碰到过类似的问题,没有猜错的话,你提供的代码应该是在中断ISR里面调用的,
我的问题也是出现在ISR中,那个程序我还保留在,有空研究下,
对这样的问题,我猜想
tmp = input_str[0];  //MCU会通过地址input_str来访问input_str[0]变量,然后将其值赋给tmp
if(input_str[0]== 0xcc)   //注意:这里很有可能是访问input_str[0]原先保存在寄存器中的值,MCU为了速度,在中断里面,要访问的全局变量,在下次中断时会,直接访问他上次中断时放在寄存器中的变量,所以 if(input_str[0]== 0xcc)  很有可能不成立,建议楼主把input_str[0]加volatile试试
个人猜想
jerkoh 发表于 2009-10-23 21:58 | 显示全部楼层
楼上 分析应该对的

看了下以为优化掉了一句 Sync_Flag = 1;

试了下 会执行这句
saiyiluqi 发表于 2009-10-24 09:51 | 显示全部楼层
????c程序看不太懂
您需要登录后才可以回帖 登录 | 注册

本版积分规则

161

主题

1040

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部