使用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);
}
相关推荐
Truffle7电子10 分钟前
STM32CubeIDE/Programmer/Touch GFX 应用
stm32·单片机·嵌入式硬件
constant_LDX1 小时前
步进电机开发(一、硬件设计)
单片机·嵌入式硬件
richxu202510011 小时前
嵌入式学习之路->stm32篇->(14)通用定时器(上)
stm32·单片机·嵌入式硬件·学习
Deitymoon1 小时前
STM32——串口通信(USART)
单片机·嵌入式硬件
iCxhust1 小时前
微机原理实践教程(C语言篇)---A002流水灯
c语言·开发语言·单片机·嵌入式硬件·51单片机·课程设计·微机原理
Deitymoon3 小时前
STM32——外部中断按键控制led
stm32·单片机·嵌入式硬件
czwxkn4 小时前
7STM32(stdl)flash内部闪存
stm32·单片机·嵌入式硬件
咕噜咕噜啦啦4 小时前
STlink下载程序
stm32·单片机
Deitymoon5 小时前
STM32——串口中断接收
stm32·单片机·嵌入式硬件
Robot_Nav6 小时前
AI 编程助手 Skill 完全指南:VS Code · Trae CN · Claude Code
人工智能·vscode·skill·trae·claude code