使用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);
}
相关推荐
FreakStudio13 小时前
W55MH32L-EVB 上手测评:硬件 TCP/IP 加持的以太网单片机,MicroPython 零门槛开发
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy·电子计算机
✎ ﹏梦醒͜ღ҉繁华落℘6 天前
单片机基础知识---stm32单片机的优先级
stm32·单片机·mongodb
zd8451015006 天前
RS485 总线详解
单片机·嵌入式硬件
✎ ﹏梦醒͜ღ҉繁华落℘6 天前
编程基础 --高内聚,低耦合
c语言·单片机
科芯创展6 天前
1A,1MHz,30VIN,XZ4115,降压恒流LED驱动芯片
单片机·嵌入式硬件
集芯微电科技有限公司6 天前
四通道2A输出集成功率电感降压模块专为紧凑型方案设计
人工智能·单片机·嵌入式硬件·生成对抗网络·计算机外设
踏着七彩祥云的小丑6 天前
嵌入式测试学习第 37 天:异常场景测试:断电、拔插、干扰、非法指令
单片机·嵌入式硬件·学习
爱就是恒久忍耐6 天前
VSCode里如何比较2个branch
ide·vscode·编辑器
意法半导体STM326 天前
【官方原创】如何为STM32CubeMX2配置Visual Studio Code配置方案
vscode·stm32·单片机·嵌入式硬件·策略模式·stm32cubemx·嵌入式开发
雾削木6 天前
B语言经典教程现代化重构
java·前端·stm32·单片机·嵌入式硬件