ST MCU Finder
安装免费手机应用,
寻找理想的ST MCU

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

[复制链接]
1155|30
 楼主 | 2019-5-28 10: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;
}

使用特权

评论回复
| 2019-5-28 11:08 | 显示全部楼层
那说明你的判定条件没有满足啊

使用特权

评论回复

评论

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

使用特权

评论回复

评论

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

使用特权

评论回复

评论

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

使用特权

评论回复
| 2019-5-28 11:56 | 显示全部楼层
给它一个触发条件 或者更改判定条件

使用特权

评论回复
| 2019-5-28 12:12 | 显示全部楼层
修改if语句的条件

使用特权

评论回复
| 2019-5-28 12:43 | 显示全部楼层
好像没有满足要求啊

使用特权

评论回复
| 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) 
 楼主 | 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;
        }
       
}

使用特权

评论回复
| 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)












无标题.png


使用特权

评论回复

评论

紫气东升 2019-5-28 16:38 回复TA
函数的Rx变量我是这么定义的:u8 Rx = 0; 优化等级设为0不太好吧 
| 2019-5-29 08:58 | 显示全部楼层
11楼是对的

使用特权

评论回复
| 2019-5-29 17:45 | 显示全部楼层
去掉编译优化试试

使用特权

评论回复
| 2019-5-29 20:43 | 显示全部楼层
直接被跳过,或者无法设置断点的代码,很有可能是被优化掉了

使用特权

评论回复
| 2019-5-29 22:49 | 显示全部楼层
被编译器优化掉了

使用特权

评论回复
| 2019-5-30 07:22 | 显示全部楼层
个人认为,调试初期最好将优化等级设定为NONE(IAR),否则出现奇奇怪怪的问题都不好排查
IAR 选项.png

使用特权

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

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

使用特权

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

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

使用特权

评论回复
 楼主 | 2019-5-30 09:08 | 显示全部楼层
感谢各位的鼎力支持,根据你们的建议修改等级优先级后,问题得到了解决

使用特权

评论回复
| 2019-5-30 09:29 | 显示全部楼层
判断条件没有满足,编译软件对它进行了优化。

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

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