不用调试器,如何定位“Hard Fault”?
文章目录
- 摘要
- 1. 打印关键信息
-
- 修改后的`HardFault_Handler`
- 关键信息
- 2. 分析错误原因
- 3. 使用`.map`文件定位问题
- 4. 检查Bootloader和APP的分区
- 5. 使用日志记录
- 6. 逐步排查
- 总结
摘要
在没有调试器的情况下,定位HardFault_Handler
的发生原因需要依赖一些调试手段和工具。以下是一些常用的方法,结合你的代码和工程特点,帮助你定位问题:
1. 打印关键信息
在HardFault_Handler
中,通过串口或其他输出方式打印关键寄存器值和堆栈信息。这些信息可以帮助你分析错误原因。
修改后的HardFault_Handler
void HardFault_Handler(void)
{
user_printf("\r\n########### Hard Fault ###########\r\n");
// 获取堆栈指针(MSP或PSP)
uint32_t *stackFrame;
__asm volatile(
"MOVS R0, #4 \n"
"MOV R1, LR \n"
"TST R0, R1 \n"
"BEQ _MSP \n"
"MRS R0, PSP \n"
"B _getStackFrame \n"
"_MSP: \n"
"MRS R0, MSP \n"
"_getStackFrame: \n"
"MOV %0, R0 \n"
: "=r"(stackFrame) // 输出到stackFrame
:
: "r0", "r1"
);
// 打印堆栈帧中的寄存器值
user_printf("R0 = 0x%08X\r\n", stackFrame[0]);
user_printf("R1 = 0x%08X\r\n", stackFrame[1]);
user_printf("R2 = 0x%08X\r\n", stackFrame[2]);
user_printf("R3 = 0x%08X\r\n", stackFrame[3]);
user_printf("R12 = 0x%08X\r\n", stac