欢迎大家关注我的新博客https://yiyi-ll.github.io/
1. 重定义HardFault_Handler
函数,并在函数中调用hard_fault_handler_c
函数。
2. 在hard_fault_handler_c
函数中,调用xTaskGetCurrentTaskHandle
获取当前Task的handle,并调用pcTaskGetName
获取当前Task的Name,并获取保存的寄存器的值。
// 声明捕获函数
void hard_fault_handler_c(uint32_t *hardfault_args);
// 重定义 HardFault_Handler
void HardFault_Handler(void)
{
__asm volatile(
"TST LR, #4 \n" // 检查使用 MSP 或 PSP 堆栈指针
"ITE EQ \n"
"MRSEQ R0, MSP \n" // 如果等于 0,使用 MSP
"MRSNE R0, PSP \n" // 如果不等于 0,使用 PSP
"B hard_fault_handler_c \n" // 跳转到 C 语言处理函数
);
}
// 捕获堆栈帧信息的 C 语言处理函数
void hard_fault_handler_c(uint32_t *hardfault_args)
{
TaskHandle_t xHandle = xTaskGetCurrentTaskHandle();
const char *pcTaskName = pcTaskGetName(xHandle);
// 将任务名存储到内存中供调试
volatile char *pTaskNameMemory = (char *)0x20401000;
for (int i = 0; pcTaskName[i] != '\0'; i++)
{
pTaskNameMemory[i] = pcTaskName[i];
}
// 提取保存的寄存器值
uint32_t stacked_r0 = hardfault_args[0];
uint32_t stacked_r1 = hardfault_args[1];
uint32_t stacked_r2 = hardfault_args[2];
uint32_t stacked_r3 = hardfault_args[3];
uint32_t stacked_r12 = hardfault_args[4];
uint32_t stacked_lr = hardfault_args[5];
uint32_t stacked_pc = hardfault_args[6];
uint32_t stacked_psr = hardfault_args[7];
// 陷入死循环便于调试
while (1);
}