本帖最后由 山不转水转 于 2022-6-22 14:26 编辑
问题背景
实际调试、或者产品开发阶段,有时候会碰到产品触发异常、报HardFault这类错误。
在这里介绍一种排查软件端问题的调试方法。
测试原理
简单来说,就是利用 “MCU触发HardFault异常、跳转到HardFault服务函数前,会把现场的内核寄存器值先压入堆栈空间保存好” 的这个特性。
所以我们可以:
- 确认触发HardFault后,使用的是PSP进程堆栈,还是MSP主堆栈(一般是MSP,也可理解用户在SRAM中划分出来的堆栈空间)
- 根据对应堆栈SP指针,挑出触发HardFault的PC指针所指向的位置。
- 注意现场保存、寄存器值入栈顺序:xPSR->PC->LR->R12->R3~R0
实测
基于APM32F407demo板,新建会触发HardFault的例程——访问、改写溢出实际SRAM存储空间的数据。
仿真调试下,全速运行,成功触发Hardfault。
在0x2000_03E0堆栈位置,存储着进入HardFault前的内核寄存器信息,如图所示
- PC指向地址是0x08003AA——可找到对应触发HardFault的汇编代码
上述分析可以看到,在对0x2003_0002这个异常存储空间进行操作后,会影响往下代码指令的执行(特别是操作SRAM空间)从而触发HardFault
后话
HardFault的触发还有很多因素,比如客户的MCU供电问题、某些VCAP脚没接上、硬件接地干扰、Flash等待周期不符合芯片规定等等。文章所介绍的方法只是针对软件部分的排查参考。
|