打印
[STM8]

IAR单步仿真出现跳过语句不执行的问题

[复制链接]
3112|30
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
下面的代码在我执行单步仿真时,它直接跳过判断语句,执行下一条语句。比如说,我当前仿真到Rx = 0这里,然后下一步它会直接跳到了Spk_Mute = 0了,中间的if()语句都直接跳过去了,而且还不能在该语句设置断点。然后我继续下一步,它又跳到了Mic_Mute = 0这里,中间的if()语句也是直接跳过去了。我查看CX20709[3]的值是0x18。前几天测还好好的,今天测就出现这种令人抓狂的事,有哪位兄弟知道这是怎么回事??求帮忙指点!!bool IRcvStr(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin_SDA,GPIO_Pin_TypeDef GPIO_Pin_SCL,uchar sla,uchar suba1,uchar suba2,uchar *s,uchar no)
//读取麦克风和喇叭状态
while (!Rx)
{
        IWDG->KR = 0xAA;
        Rx = IRcvStr(GPIOB, SDA, SDL, 0x28, 0x10, 0x18, &CX20709[3], 1);  
}
Rx = 0;

if ((0x01 & CX20709[3]) == 0x01)
{
        Spk_Mute = 1;
}
else
{
        Spk_Mute = 0;
}

if ((0x08 & CX20709[3]) == 0x08)
{
        Mic_Mute = 1;
}
else
{
        Mic_Mute = 0;
}

使用特权

评论回复
沙发
gwsan| | 2019-5-28 11:08 | 只看该作者
那说明你的判定条件没有满足啊

使用特权

评论回复
评论
紫气东升 2019-5-28 13:32 回复TA
不对啊,他应该也是首先执行到if()语句,然后判断,如果不满足就不进入if()语句里面才对啊。现在是它连判断都没有,直接执行else()语句里的指令了。 
板凳
kxsi| | 2019-5-28 11:12 | 只看该作者
说明没有满足条件啊

使用特权

评论回复
评论
紫气东升 2019-5-28 13:32 回复TA
不对啊,他应该也是首先执行到if()语句,然后判断,如果不满足就不进入if()语句里面才对啊。现在是它连判断都没有,直接执行else()语句里的指令了。 
地板
nawu| | 2019-5-28 11:32 | 只看该作者
不满足判定依据 当然不跳进去了

使用特权

评论回复
评论
紫气东升 2019-5-28 13:38 回复TA
现在的问题是,它连判定都没有。而且还不能在if()语句这里设置断点,如果设置它会自动放到else()语句里的指令 
5
qcliu| | 2019-5-28 11:37 | 只看该作者
外部引脚没有响应的信号接进来吧

使用特权

评论回复
6
tfqi| | 2019-5-28 11:56 | 只看该作者
给它一个触发条件 或者更改判定条件

使用特权

评论回复
7
zljiu| | 2019-5-28 12:12 | 只看该作者
修改if语句的条件

使用特权

评论回复
8
coshi| | 2019-5-28 12:43 | 只看该作者
好像没有满足要求啊

使用特权

评论回复
9
sky.sun.zz| | 2019-5-28 13:05 | 只看该作者
C++编译的优化等级太高的缘故

使用特权

评论回复
评论
紫气东升 2019-5-30 09:02 回复TA
我把优化等级设为低等(Low),单步仿真就可以了。问题解决了 
紫气东升 2019-5-28 13:39 回复TA
我先试着把它改成低等(low),看看结果怎么样 
紫气东升 2019-5-28 13:34 回复TA
我IAR工程设置的是中等(medium) 
10
紫气东升|  楼主 | 2019-5-28 13:44 | 只看该作者
这是我整个函数的所有代码,单步仿真就只有读取麦克风和喇叭状态这部分的判断出现这个问题。
//从CX20709读取USB,麦克风,喇叭状态
void Read_Status(void)
{
        //读取USB状态
        while (!Rx)
        {
                IWDG->KR = 0xAA;
                Rx = I2CRcvStr(BQ24168_IIC_PORT, POW_SDA, POW_SCL, 0xd6, 0x00, CX20709, 2);  //   2
        }
        Rx = 0;

        if (((0x40 & CX20709[0]) == 0x40) || ((0x20 & CX20709[0]) == 0x20))
        {
                USB_Reg = 1;     //USB存在
        }
        else
        {
                USB_Reg = 0;     //USB不存在
                USB_Output = 1;  //USB拔出状态,没有检测到USB
        }
       

        //读取音量等级状态
        if (IRcvStr(GPIOB, SDA, SDL, 0x28, 0x12, 0xCE, &CX20709[4], 1))
        {
                if (IRcvStr(GPIOB, SDA, SDL, 0x28, 0x12, 0xCF, &CX20709[5], 1))
                {
                        Spk_Sign = (CX20709[5] << 8) | CX20709[4];
                }
        }
       
        //读取麦克风和喇叭状态
        while (!Rx)
        {
                IWDG->KR = 0xAA;
                Rx = IRcvStr(GPIOB, SDA, SDL, 0x28, 0x10, 0x18, &CX20709[3], 1);  //   2
        }
        Rx = 0;
       
        if ((0x01 & CX20709[3]) == 0x01)
        {
                Spk_Mute = 1;
        }
        else
        {
                Spk_Mute = 0;
        }

        if ((0x08 & CX20709[3]) == 0x08)
        {
                Mic_Mute = 1;
        }
        else
        {
                Mic_Mute = 0;
        }

        if (Spk_Mute == 1)
        {
                if (Mic_Mute == 1)
                {
                        flash = 2; //蓝灯红灯闪烁
                }
                else
                {
                        flash = 1; //蓝灯闪烁
                }
        }
        else
        {
                flash = 0;
        }
       
        //同时连接所有外设
        if ((Blu_Reg == 1) && (USB_Reg == 1))
        {
                Phone_Job = 3;
        }
        //只有蓝牙连接
        else if ((Blu_Reg == 1) && (USB_Reg == 0))
        {
                Phone_Job = 2;
        }
        //只有USB连接
        else if ((Blu_Reg == 0) && (USB_Reg == 1))
        {
                Phone_Job = 1;
        }
        //没有外设连接
        else
        {
                Phone_Job = 0;
        }
       
}

使用特权

评论回复
11
sky.sun.zz| | 2019-5-28 15:00 | 只看该作者
本帖最后由 sky.sun.zz 于 2019-5-28 15:05 编辑
紫气东升 发表于 2019-5-28 13:44
这是我整个函数的所有代码,单步仿真就只有读取麦克风和喇叭状态这部分的判断出现这个问题。
//从CX20709读 ...

这里优化等级如果设置太高,编译器会直接把函数优化掉:
还有函数中Rx好像不是位变量,那么Rx在判断为0值时应该写成while(Rx==0x00),而不应该是:while(!Rx)















使用特权

评论回复
评论
紫气东升 2019-5-28 16:38 回复TA
函数的Rx变量我是这么定义的:u8 Rx = 0; 优化等级设为0不太好吧 
12
梦幻泡影| | 2019-5-29 08:58 | 只看该作者
11楼是对的

使用特权

评论回复
13
xiaofei558008| | 2019-5-29 17:45 | 只看该作者
去掉编译优化试试

使用特权

评论回复
14
dirtwillfly| | 2019-5-29 20:43 | 只看该作者
直接被跳过,或者无法设置断点的代码,很有可能是被优化掉了

使用特权

评论回复
15
Prry| | 2019-5-29 22:49 | 只看该作者
被编译器优化掉了

使用特权

评论回复
16
lyb1986| | 2019-5-30 07:22 | 只看该作者
个人认为,调试初期最好将优化等级设定为NONE(IAR),否则出现奇奇怪怪的问题都不好排查

使用特权

评论回复
17
紫气东升|  楼主 | 2019-5-30 09:04 | 只看该作者
sky.sun.zz 发表于 2019-5-28 15:00
这里优化等级如果设置太高,编译器会直接把函数优化掉:
还有函数中Rx好像不是位变量,那么Rx在判断为0值 ...

我把优化等级设为低等(Low),没有设为最低(0),单步仿真也可以了。问题解决了

使用特权

评论回复
18
紫气东升|  楼主 | 2019-5-30 09:06 | 只看该作者
sky.sun.zz 发表于 2019-5-28 15:00
这里优化等级如果设置太高,编译器会直接把函数优化掉:
还有函数中Rx好像不是位变量,那么Rx在判断为0值 ...

我把优化等级设为低等(Low),没有设为最低(none),单步仿真也可以了。问题解决了

使用特权

评论回复
19
紫气东升|  楼主 | 2019-5-30 09:08 | 只看该作者
感谢各位的鼎力支持,根据你们的建议修改等级优先级后,问题得到了解决

使用特权

评论回复
20
海中水| | 2019-5-30 09:29 | 只看该作者
判断条件没有满足,编译软件对它进行了优化。

使用特权

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

本版积分规则

17

主题

97

帖子

0

粉丝