使用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);
}
相关推荐
冷天气会感冒38 分钟前
关闭VSCode的推荐插件(Recommended extensions)提示
ide·vscode·编辑器
root_dream1 小时前
从stc8g1k08+433MHZ无线点亮led 到stc8k1k17+433MHZ唯一配对并点亮小灯(过程&问题&总结)
单片机·嵌入式硬件·stc8g1k08·433mhz
mc23562 小时前
STM32F103C8T6--定时器
stm32·单片机·嵌入式硬件
会编程是什么感觉...3 小时前
算法 - PEC校验
单片机·算法
清风6666663 小时前
基于单片机的全自动洗衣机控制器设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
Y unes4 小时前
《i.MX6ULL LED 驱动实战:内核模块开发与 GPIO 控制》
linux·c语言·驱动开发·vscode·ubuntu·嵌入式
帅帅兔子5 小时前
2.4寸SPI串口ILI9341芯片彩色LCD驱动
stm32·单片机·嵌入式硬件·mcu
古一木6 小时前
ROS1+Vscode
ide·vscode·编辑器
YONYON-R&D6 小时前
VSCODE 调试C程序时 打印中文
ide·vscode·编辑器
冷天气会感冒6 小时前
关闭VSCode的GitHub Copilot功能
vscode·github·copilot