|
发表于 2010-8-22 13:53:46
|
显示全部楼层
跟我判断的相同
1、这段代码没有禁止中断吧。
2、300为0x12c
LDI R30, 0x5A
LDI R31, 0x02 ===》这里Z是giPressTimeCount的地址
LD R16, Z ===》R16拿到低8位
LDD R17, Z+1 ===》R17拿到高8位
CPI R16, 0x2C ===》低8位与300的低8位比较
LDI R18, 0x01 ===》R18是300的高8位
CPC R17, R18 ===》比较高8位
BRLT 0x115A
3、分析,当然不是每次都那么巧合,但肯定会发生
假定此时giPressTimeCount为255
LDI R30, 0x5A
LDI R31, 0x02 ===》这里Z是giPressTimeCount的地址
LD R16, Z ===》R16拿到低8位 注意是255!!
=====》 此时中断来了,响应中断,giPressTimeCount为256了!!
LDD R17, Z+1 ===》R17拿到高8位
======》这样R17为1(256),而R16为0xff,256,合在一起是0x01ff,比0x012c大了!!
CPI R16, 0x2C ===》低8位与300的低8位比较
LDI R18, 0x01 ===》R18是300的高8位
CPC R17, R18 ===》比较高8位
BRLT 0x115A
4、IAR如此烂?为什么不先取高位和比较高位?这样会好点,但也还是存在不足。
5、不管使用什么编译系统,在中断需要改变的变量都是敏感的,在其它地方使用是需要特别当心。比如,在比较前禁止中断,比较后再开放,或使用影子存储器等方法。 |
|