使用VSCode开发MCU,FreeRTOS进Hard_Fault调试
欢迎大家关注我的新博客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);
}