wendan 发表于 2011-11-23 17:04:06

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

IAR debug模式 默认option选择 low,release模式下默认选择 high,我的代码在选择low时运行正常,设置为high就出错 ,如下

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

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

wendan 发表于 2011-11-23 17:12:57

顶一顶啊,高手解答一下啊,纠结一天了

wendan 发表于 2011-11-30 11:02:29

没人答复,问题解决,release模式下用个tmp变量,将变量用volatile申明就不会出现问题,
volatile uint8 tmp;
tmp = data&0x0f;
if(tmp == 0x00)
{

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

AIDN 发表于 2011-11-30 12:06:38

搜整型提升
并谨记中间变量默认是int
测试时不要用
data[] ={0x10,0xff};

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

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

wendan 发表于 2011-11-30 16:58:36

回复【3楼】AIDN
-----------------------------------------------------------------------

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

}
else if (tmp == 0x01)
{

}
.....

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

AIDN 发表于 2011-11-30 17:33:05

很简单因为data的值已确定,判断的条件的值也已确定,所以会被优化。要想测试
volatile char a;
a=1;
data=a;//保证data的值不是确定的
uint8 tmp;

tmp = data&0x0f;

if(tmp == 0x00)

wendan 发表于 2011-12-6 10:05:37

回复【5楼】AIDN
-----------------------------------------------------------------------

好的,多谢,确实是这样的现象,看来这个IAR的优化还是需要多注意些
页: [1]
查看完整版本: IAR debug 模式 option选择 high后编译出错