调试器表象和实际执行不一样,导致看起来代码跑飞了
将要运行:
void handleUsb(void)
{
afeReadRegister(CTR_USB_REGISTER, ®Val, ctrlAfeReadDone);
……
……
}
对应汇编为:
handleUsb:
LDR r2, 0x143a4
MOVS r0,#0x25
MOV r1,sp
BL afeReadRegister <0x8c2>
注:宏CTR_USB_REGISTER值为0x25
但是执行起来,表象是死在了这行汇编上面,
LDR r2, 0x143a4
只要一单步执行这行,程序就跑飞了,就是继续运行状态了,中断运行后,发现已经处于systemIdle状态了。
很纳闷,觉得该行只是简单的到地址出取值送到寄存器而已,不太可能发生什么问题啊。
开始以为是0x143a4地址中的值0x00014261是奇数,
而cpu不能执行奇数所导致程序飞了,
但是发现其他很多函数都是奇数地址,但都能正常运行,
而且,此处只是取出该值,放到r2寄存器中,并未实际执行,
又加上后来手动将值该为0x00014260,程序也还是跑飞,
所以不是这个问题。
然后又尝试,在
其下面两行
MOVS r0,#0x25
MOV r1,sp
都打上断点,然后单步上面那行,也还是无法运行到
MOVS r0,#0x25
或
MOV r1,sp
一直很疑惑。
后来经过老大的解决,大概明白了,
也许是调试器有问题,使得不能单步执行吧,
但是实际上,该函数已经继续执行了,只不过是后来的执行到某处,
由于中断打扰,而跑到别的地方了。
继续在函数afeReadRegister中,后期要执行的函数打上断点,发现在哪里打断点,程序就可以运行到哪里。
总结:
1.即使对于严谨的调试器,可能有时候表现出来的情况,未必是完全真实的,根本的原因,只能慢慢排查。
2.对于中断打扰代码的执行,也要注意。
转载请注明:在路上 » 调试器表象和实际执行不一样,导致看起来代码跑飞了