如何通过复位后的ARM寄存器转储定位系统异常复位原因
Cortex-M4F 异常复位原因分析
第一步:判断复位触发类型
你提供的寄存器为Cortex-M内核标准Fault状态寄存器,首先读取硬件Fault状态寄存器(HFSR):
- 你给出的HFSR值为
0x40000000,对应BIT31(FORCED位)置1,说明本次复位由*硬Fault(HardFault)*触发,属于内核检测到不可修复异常后触发的系统复位。
第二步:定位HardFault根因
读取可配置Fault状态寄存器组,判断异常类型:
- 存储管理Fault寄存器(MMFSR)值为
0x00,无非法内存访问类异常 - 总线Fault寄存器(BFSR)值为
0x00,无总线访问错误类异常 - 用法Fault寄存器(UFSR)值为
0x0002,对应BIT1(INVSTATE位)置1,根因确认:程序尝试切换到ARM指令集执行,而Cortex-M4F内核仅支持Thumb指令集,该非法操作触发异常,由于用法Fault未单独开启中断,异常升级为HardFault导致复位。
第三步:定位故障代码位置
结合其他寄存器可直接定位故障点:
- PC寄存器值为
0x00000000,说明程序异常跳转到0地址,符合非法指令集切换的故障特征 - LR寄存器值为
0x00073135,对应异常触发前的函数返回地址,在工程map文件中搜索该地址,即可找到触发异常的上层调用函数,重点排查该函数内是否存在函数指针调用错误、跳转地址计算错误、无效跳转指令(如BX操作数最低位为0)的逻辑。 - 调试Fault寄存器(DFSR)值为
0x00000001,说明本次异常是调试器连接状态下捕获的,可直接在调试环境中给0x00073135地址下断点复现故障。
补充:Tiva TM4C129X 硬件复位原因排查
如果需要区分是否为硬件级复位(上电复位、看门狗复位、外部复位引脚触发),可在复位后第一时间读取芯片复位原因寄存器(RESC,地址0x400FE050),该寄存器会记录硬件层面的复位触发源,和本次内核异常复位做区分。
内容的提问来源于stack exchange,提问作者Waqas
相关产品推荐
相关产品推荐

