搜索
bottom↓
回复: 6

IAR debug 模式 option选择 high后编译出错

[复制链接]

出0入0汤圆

发表于 2011-11-23 17:04:06 | 显示全部楼层 |阅读模式
IAR debug模式 默认option选择 low,release模式下默认选择 high,我的代码在选择low时运行正常,设置为high就出错 ,如下

data[] ={0x10,0xff};
if ((data[0]&0x0f) == 0x00)
{
..............
}

low设置下可以进入,high设置下只有程序运行第一次进入,以后都不行,debug调试发现运行时判断条件值竟然为data[0]的值,也就是0x10

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2011-11-23 17:12:57 | 显示全部楼层
顶一顶啊,高手解答一下啊,纠结一天了

出0入0汤圆

 楼主| 发表于 2011-11-30 11:02:29 | 显示全部楼层
没人答复,问题解决,release模式下用个tmp变量,将变量用volatile申明就不会出现问题,
volatile uint8 tmp;
tmp = data[0]&0x0f;
if(tmp == 0x00)
{

}
不过还是没搞懂,data[0]&0x0f竟然会在release模式下被优化掉

出0入0汤圆

发表于 2011-11-30 12:06:38 | 显示全部楼层
搜整型提升
并谨记中间变量默认是int
测试时不要用
data[] ={0x10,0xff};

if ((data[0]&0x0f) == 0x00)

data[0]值已赋值期间未被改变时判断条件也会变成确定值会被优化掉

出0入0汤圆

 楼主| 发表于 2011-11-30 16:58:36 | 显示全部楼层
回复【3楼】AIDN  
-----------------------------------------------------------------------

有道理,但之前用这个代码也不行
uint8 tmp;
tmp = data[0]&0x0f;
if(tmp == 0x00)
{

}
else if (tmp == 0x01)
{

}
.....

必须tmp变量加volatile 申明,而我自己测试另一段代码时 tmp = data[0]&0xf0是可以的,取低4位咋就被优化呢

出0入0汤圆

发表于 2011-11-30 17:33:05 | 显示全部楼层
很简单因为data[0]的值已确定,判断的条件的值也已确定,所以会被优化。要想测试
volatile char a;
a=1;
data[0]=a;//保证data[0]的值不是确定的
uint8 tmp;

tmp = data[0]&0x0f;

if(tmp == 0x00)

出0入0汤圆

 楼主| 发表于 2011-12-6 10:05:37 | 显示全部楼层
回复【5楼】AIDN  
-----------------------------------------------------------------------

好的,多谢,确实是这样的现象,看来这个IAR的优化还是需要多注意些
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-28 10:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表