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

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函数的顺序来安排汇编字节。你用单步跟踪应该能够找到丢失的代码段。
andeyqi 回答时间:2018-8-30 10:47:17
在stm32f030试验的没有如上问题,汇编代码正常。 捕获.PNG

没用过STM8,用的是32位指令集啊,为什么还有CALL指令呢,CALL指令应该是X86的指令吧?
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

那就说明这段代码应该没什么问题哦,我再找找原因吧
andeyqi 回答时间:2018-8-30 14:24:24
iyumi 发表于 2018-8-30 14:11
非常感谢,CALL是STM8的指令,不过汇编看起来好奇怪,怎么里边还有问号呢

我一直以为和是stm32都是一套指令集,看来还是不一样的,又了解到点新东西。
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,这个条件是满足的
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版