你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

iar选择不优化,但编译后一部分代码没有对应的汇编代码

[复制链接]
iyumi 提问时间:2018-8-30 09:28 /
本帖最后由 iyumi 于 2018-8-31 10:09 编辑

问题已经解决了,见12楼,麻烦懂的大神解释一下原因

iar的优化选项里选的“NONE”,函数前我也加了个#pragma optimize=none(编号1),但是感觉这个可能不是优化的问题

问题:图中打红大括号的代码(编号5)在汇编窗口没有对应的代码,1237行过后就直接是1261行了(编号4),把1239和1243两处的if语句注释掉以后就正常,单步执行时,执行完1236行,中间观察窗口addr_h变量的Value列对应的值没有显示出来(编号2),把鼠标放到addr_h上可以看到有值(编号3),1237行执行完后直接跳到1261行,我觉得应该是addr_h和data_h这两个变量的问题,addr_h和data_h这两个变量之前是局部变量,改成全局变量还是有这样。大神帮忙看看这个是什么原因?先谢谢了

addr_h.jpg

ir_revdata的值是:0x00FF10EF
1237行的代码是:addr_h = (u8)(ir_revdata>>16);


红外键值判断的函数代码:两个按键,每个按键分单击,双击,长按
如果可以的话,大神下载下来用IAR for STM8编译一下,看有我上面说的问题没?


  1. void IR_GetKeyVal(u8 *LastKeyCode, u8 *ClickCnt,    //{{{获取红外遥控器的键值
  2.                            u8 *KeyNum,        u8 *KeyVal)     //LastKeyCode:上次按键编码值
  3.                                                                             //ClikcCnt:单击次数
  4.                                                                             //KeyNum:按键号
  5.                                                                             //KeyVal:按键值
  6. {
  7.     u8  addr_h, addr_l, data_h, data_l;

  8.     *KeyNum = 0;
  9.     *KeyVal = 0;
  10.     if(ir_bitcnt>=32)
  11.     {
  12.         ir_bitcnt = 0;
  13.         addr_l = (u8)(ir_revdata>>24);
  14.         addr_h = (u8)(ir_revdata>>16);
  15.         //if(addr_l==(~data_h)&&addr_l==EQ_ID)//EQ_ID,设备ID
  16.         if(addr_l==(~addr_h))
  17.         {
  18.             data_l = (u8)(ir_revdata>>8);
  19.             data_h = (u8)ir_revdata;
  20.             if(data_l==(~data_h))
  21.             {
  22.                 if(*LastKeyCode!=data_l)
  23.                 {
  24.                     *ClickCnt = 0;       //本次按键和上次按键值不同,ClickCnt清0
  25.                 }
  26.                 if(data_l==0x94||data_l==0x95)
  27.                 {
  28.                     *LastKeyCode = data_l;
  29.                     (*ClickCnt)++;
  30.                 }
  31.                 else
  32.                 {
  33.                     *LastKeyCode = 0;
  34.                 }
  35.             }
  36.         }
  37.     }
  38.     if(ir_keycomplete==1)
  39.     {
  40.         ir_keycomplete = 0;
  41.         if(*LastKeyCode == 0x94)
  42.         {
  43.             *KeyNum = 1;
  44.         }
  45.         else if(*LastKeyCode == 0x95)
  46.         {
  47.             *KeyNum = 2;
  48.         }
  49.         else
  50.         {
  51.             *KeyNum = 0;
  52.         }
  53.         if(ir_repcnt<18)
  54.         {
  55.             if(*ClickCnt==1)
  56.             {
  57.                 *KeyVal = KEY_SHORT_CLICK;
  58.             }
  59.             else if(*ClickCnt>=2)
  60.             {
  61.                 *KeyVal = KEY_DOUBLE_CLICK;
  62.             }
  63.         }
  64.         else
  65.         {
  66.             *KeyVal = KEY_LONG_CLICK;
  67.         }
  68.     }
  69. }//}}}
复制代码


收藏 评论11 发布时间:2018-8-30 09:28

举报

11个回答
wenyangzeng 回答时间:2018-8-30 09:58:50
IAR编译的时候并不一定按照你的C函数的顺序来安排汇编字节。你用单步跟踪应该能够找到丢失的代码段。
andey 回答时间:2018-8-30 10:47:17
提示: 作者被禁止或删除 内容自动屏蔽
tyhjrwx2011 回答时间:2018-8-30 13:22:31
没有ir_revdata变量相关的代码,无法知道你是否有改变这个值

代码不全,无法分析原因
iyumi 回答时间:2018-8-30 13:38:08
wenyangzeng 发表于 2018-8-30 09:58
IAR编译的时候并不一定按照你的C函数的顺序来安排汇编字节。你用单步跟踪应该能够找到丢失的代码段。 ...

单步就是直接跳到编号4指向的C和汇编代码行啊
iyumi 回答时间:2018-8-30 14:11:49
本帖最后由 iyumi 于 2018-8-30 14:24 编辑
andeyqi 发表于 2018-8-30 10:47
在stm32f030试验的没有如上问题,汇编代码正常。

没用过STM8,用的是32位指令集啊,为什么还有CALL指令呢, ...

非常感谢,CALL是STM8的指令,不过我的汇编看起来好奇怪,怎么里边还有问号呢

捕获.JPG

那就说明这段代码应该没什么问题哦,我再找找原因吧
andey 回答时间:2018-8-30 14:24:24
提示: 作者被禁止或删除 内容自动屏蔽
iyumi 回答时间:2018-8-30 14:25:13
tyhjrwx2011 发表于 2018-8-30 13:22
没有ir_revdata变量相关的代码,无法知道你是否有改变这个值

代码不全,无法分析原因

ir_revdata确认改变了,我按了两个红外按键,得到了不同的值
wenyangzeng 回答时间:2018-8-30 14:58:41
iyumi 发表于 2018-8-30 13:38
单步就是直接跳到编号4指向的C和汇编代码行啊

编号5当然要条件满足才能进入
iyumi 回答时间:2018-8-30 15:15:47
wenyangzeng 发表于 2018-8-30 14:58
编号5当然要条件满足才能进入

不满足条件的话if语句还是要走的啊,另外可以从观察看到ir_revdata=0x00FF10EF,这个条件是满足的
tyhjrwx2011 回答时间:2018-8-30 20:41:54
iyumi 发表于 2018-8-30 14:25
ir_revdata确认改变了,我按了两个红外按键,得到了不同的值

if(addr_l==(~addr_h))

仔细看了下写法
C语言语法,这句话,应该永远不成立,所以编译器自动过滤了无效的代码段
iyumi 回答时间:2018-8-30 22:11:11
本帖最后由 iyumi 于 2018-8-31 10:06 编辑
tyhjrwx2011 发表于 2018-8-30 20:41
if(addr_l==(~addr_h))

仔细看了下写法

大神,牛逼啊!!我刚把这个问题解决了,准备上来结贴,就看到你给出正确答案了,确实是这样的,我现在改成这样了:

        addr_l = (u8)(ir_revdata>>24);
        addr_h = ~(u8)(ir_revdata>>16);
        //if(addr_l==(~data_h)&&addr_l==EQ_ID)//EQ_ID,设备ID
        if(addr_l==addr_h)
        {
            data_l = (u8)(ir_revdata>>8);
            data_h = ~(u8)ir_revdata;
            if(data_l==data_h)
            {
                ...
            }
        }
把取反的操作放到前边去,if条件里不取反,这样就没有问题

大神,再具体说一下,这个条件有什么问题吗,为什么永远不成立?

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版