金昌市网站建设_网站建设公司_建站流程_seo优化
2025/12/24 20:44:29 网站建设 项目流程

FreeRTOS任务卡死在HardFault函数通过Debug查看CPU寄存器解决

问题现象是在创建了一个新的最高优先级任务之后,在该任务中删除自己,程序卡死在HardFault函数

解决思路是查看程序在进入HardFault之前是在执行哪一条程序

重要的寄存器是SP、LR、PC三个寄存器以及Banked中的PSP

首先查清进入HardFault之前的执行指令,去看LR寄存器,但是发现LR寄存器存放的指令不是正常的上一条正在执行的指令,而是异常值0xFFFFFFFD,询问AI发现,这个值表示状态码,表示要返回到Thread+PSP,那么查看使用PSP堆栈的时候的PC指着的程序是哪个,就可以找到崩溃前执行的程序。CPU崩溃的时候会自动把寄存器的值压入到PSP中,所以PSP中依次存储着R0~R12、LR、PC、xPSR。通过找到PSP后去memory窗口找到PC的值,然后去Disassembly反汇编窗口输入PC的值则可以找到那个崩溃前程序的位置。注意使用反汇编查找位置的时候需要加上0x,以及注意大小端的情况。

扩展知识 Internel的Stack表示的是当前程序使用的是MSP(中断+main+FreeRTOS内核使用)堆栈还是PSP(任务专用)堆栈

扩展知识 LR寄存器表示的是程序在跳转某个地方后,结束该地方的任务后,接下来要去执行的地方。或者是发生硬件中断后存储状态码。

扩展知识 PC寄存器表示的是当前程序的位置

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询