1、背景
- 程序运行,发现程序跑飞到HardFault,但不清楚为什么会跑到HardFault中断处理函数去。
2、分析
-
要想知道为什么会跑到HardFault_Handler中去,就很有必要了解一下,程序上一条执行的是那条命令。
-
根据汇编指令可以定位上条指令,但如果对汇编指令不是很了解的话,那就很头疼了
-
根据单步运行也能实现定位,但如果程序量很大,又很杂,可能花费的时间就比较久些。
3、问题查找
- 提供一种不需要懂汇编指令的查找方法,方法如下:
- 在中断处理函数中插入以下代码,以及另外定义一个函数getStackFrame来存之前函数的寄存器值。
void HardFault_Handler(void)
{
// LR provides information of the return stack PSP/MSP
asm("MOVS R0, #4");
asm("MOV R1, LR");
asm("TST R0, R1");
asm("BEQ _MSP");
asm("MRS R0, PSP");
asm("B getStackFrame");
asm("_MSP:");
asm("MRS R0, MSP");
asm("B getStackFrame");
}
void getStackFrame(uint32_t *stackFrame)
{
uint32_t r0,r1,r2,r3,r12,lr,pc,psr;
r0 = stackFrame[0];
r1 = stackFrame[1];
r2 = stackFrame[2];
r3 = stackFrame[3];
r12 = stackFrame[4];
lr = stackFrame[5];
pc = stackFrame[6];
psr = stackFrame[7]; /* 确保已经运行 */
asm("BKPT");
}
- 运行程序,在以上程序pc变量获取值之后打断点,查看pc的值,然后打开反汇编窗口(不同编译器,操作不同,这里不做说明),跳转到pc值对应的地址,查看他对应的是哪个函数
- 跳转结果如下,我获取到的pc值为0x20000069,其对应的函数是FLASH_DRV_CommandSequence,所以可以确定是处理这个函数后导致的硬件错误中断
4、拓展
- 其他一些特殊问题处理应该也可以以这种方法定位上条指令
其他
编写或是解释难免有错,欢迎指正。
如有侵权,联系我删除,谢谢!!!