使用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);
}
相关推荐
来点光吧2 小时前
STM32F1 Flash的操作
stm32·单片机·嵌入式硬件
扣篮发型不乱5 小时前
STM32 按键输入检测 轮询和中断
stm32·单片机
四谎真好看5 小时前
第六章第一节 TIM 定时中断
stm32·单片机·嵌入式硬件·tim·江科大
扣篮发型不乱5 小时前
STM32 外部中断 和 定时器中断
stm32·单片机·嵌入式硬件
金色光环5 小时前
【STM32-HAL】 SPI通信与Flash数据写入实战
stm32·单片机·嵌入式硬件
实在太懒于是不想取名8 小时前
2025年电子设计大赛G题《电路模型探究装置》各小问数学推导及个人思路
单片机·电赛·电子设计
lll4823310 小时前
通用定时器Timer的基本模式
stm32·单片机·嵌入式硬件
RaLi和夕10 小时前
单片机学习笔记.AD/DA(略含有SPI,用的是普中开发板上的XPT2046芯片)
c语言·笔记·单片机·嵌入式硬件·学习
慕容白 MU20 小时前
新唐51单片机看门狗配置流程
c语言·单片机·嵌入式硬件·51单片机
DechinPhy21 小时前
VSCode手动版本更新
ide·vscode·编辑器