使用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);
}
相关推荐
LCMICRO-133108477465 小时前
长芯微LPS123完全P2P替代ADP123,高性能、低压差的线性稳压器
单片机·嵌入式硬件·fpga开发·硬件工程·dsp开发·线性稳压器
守护安静星空6 小时前
esp32开发笔记-工程搭建
笔记·单片机·嵌入式硬件·物联网·visual studio code
magic334165637 小时前
ESP32S3开发环境介绍和创建工程
vscode·c·头文件
萌萌站起7 小时前
Vscode 中 python模块的导入问题
ide·vscode·python
aqiu~7 小时前
VSCode编辑器用于Unity项目
vscode·unity
时空自由民.8 小时前
ST7701S 3.5寸显示屏
单片机
金戈鐡馬8 小时前
BetaFlight中的定时器引脚绑定详解
stm32·单片机·嵌入式硬件·无人机
Wave8459 小时前
FreeRTOS软件定时器详解
stm32·单片机·freertos
VBsemi-专注于MOSFET研发定制10 小时前
奶茶制作机器人功率MOSFET选型方案——高效、精准与可靠驱动系统设计指南
单片机·嵌入式硬件
水云桐程序员11 小时前
单片机项目从入门到精通
单片机·嵌入式硬件