看了一些关于8位单片机对于32位数据处理的文章,8位机不像32能一次处理32位数据,即一次只能处理8位。结合这个现象想了想,有可能是这样的:
问题1的猜想:变量指定到xdata区时,在执行0x7FF-0x7D0的时候,已经执行了次低8位bit[15:8]的相减什么的,正要处理低8位bit[7:0],来中断了,中断中0x7FF变成了0x800,中断退出之后恢复,处理低8位时变成了0x00-0xD0=0xFFFFFF30,即最终的数值相减不是0x7FF-0x7D0而是0x700-0x7D0。
预想 实际
0x07FF - 0x07D0 = 0x2F 0x07FF 0x0700 - 0x07D0 = 0xFFFFFF30
32位内核一次性处理 8位内核将0x07FF-0x07D0拆分处理,先处理07-07,后处理FF-D0。但在处理这2字节的间隙,发生中断,FF变为00
问题2的猜想:data区的处理顺序貌似是反过来的,在执行0x7C6FF-0x7C3C8的时候,已经执行了低8位bit[7:0](0xFF-0xC8),正准备处理次低8位bit[15:8],来中断了,0x7C6FF变成了0x7C700,退出中断后继续处理bit[15:8]时变成了0xC7-0xC3,。即最终的数值相减不是0x7C6FF-0x7C3C8而是0x7C7FF-0x7C3C8=0x437。
预想 实际
0x7C6FF-0x7C3C8 = 0x337 0x7C6FF 0x7C7FF-0x7C3C8 = 0x437
32位内核一次性处理 8位内核将0x7C6FF-0x7C3C8拆分处理,先处理0xFF-0xC8,后处理C6-C3。但在这两者间隙,发生中断,C6变为C7
|