定位HardFault

一、HardFault定义

STM32出现HardFault_Handler硬件错误的原因主要有两个方面:

1、内存溢出或者访问越界。(包括使用野指针

2、堆栈溢出。

二、定位HardFault步骤

1. 判断所使用堆栈:

发生异常之后可首先查看LR寄存器中的值,确定当前使用堆栈为MSP或PSP

LR 寄存器的工作原理。当 Cortex-M4 处理器接受了一个异常后,寄存器组中的一些寄存器值会被自动压入当前栈空间里,这其中就包括链接寄存器(LR )。这时的 LR 会被更新为异常返回时需要使用的特殊值(EXC_RETURN)

EXC_RETURN 的定义如下,其为 32 位数值,高 28 位置 1,第 0 位到第三位则提供了异常返回机制所需的信息,如下表所示。可见其中第 2 位标示着进入异常前使用的栈是 MSP还是PSP。在异常处理过程结束时,MCU 需要根据该值来分配 SP 的值,0主栈,1进程栈。

a763802baca046dab0d9ebf5e5c54673.png

在Cortex_M3权威指南中可以看到如下图所示:

33f6e8c2ac11434c96fd54cee055a556.png

发送在MSP

  • 打开调试,全速运行,然后停止程序会在hardfault位置停止

44512f51458c490986c4d33705dd2a4b.png

1f4b30148b40421e85db4ee472a9b4e4.png

2.找到相对应的堆栈指针

eb83746e17ef4dac84a0e0ee74f95e99.png

2. 在内存中查看相对应堆栈的内容,并找到PC指针

发生hardfault异常,内核将会将8个通用寄存器压入当前栈中R0~R3,R12,LR,PC(Return address),xPSR寄存器依次入栈,其中堆栈后第25个字节到28字节PC(Return address)即为发生异常前PC将要执行的下一条指令地址

090428e7eb1a4a3b8d348ccc07b3c075.png

  • 对应内存中存储

684cbdf002ac4855a0a8286b39b0ef81.png

cb560076658b400e81039b582974c2ab.png

3. 在反汇编窗口中输入PC寄存器里面存放的的地址,

a8fc577256bb48ee902fc693cbea0dda.png

  • 实现了跳转

b0a2de57f1e34e2ca4d223f4f08740c9.png

发生在PSP

4cc6973401f9410b8005f9578d7558d4.png

 同样实现了跳转

d4d0662a511b4bd5b13f7f26cd6bbd96.png

小技巧:

memory窗口这里可以右键设置为32位查看,这样看得比较方便:

5f90a3142cf9486f8d2ed7b7b67c9652.png

设置后如下图:

170edcf9811f4fc2bbea7835685e3df7.png

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值