打印
[其他]

MCU HardFault_Handler调试方法

[复制链接]
1753|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2023-11-9 16:06 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
一.获取内核寄存器的值
1.在MDK的DEBUG模式下,当程序出现跑飞后,确定卡死在HardFault_Handler中断处

2. 通过Register窗口读取LR寄存器的值来确定当前系统使用堆栈是MSP还是PSP

LR寄存器值        堆栈寄存器
0xFFFFFFF9        MSP寄存器
0xFFFFFFFD        PSP寄存器
如下图所示,当前程序使用的是PSP堆栈寄存器



二、查看堆栈寄存器保存的值
通过Register窗口确定MSP或PSP的地址
如下图所示,当前程序卡死时使用的堆栈寄存器为:PSP寄存器,地址为:0x20010318

MSP、PSP堆栈寄存器介绍
由于异常发生时,内核将r0、r1、r2、r3、r12、r14(lr)、pc、xprs寄存器依次入栈
r14(lr):保存的是产生异常中断前内核执行的指令地址
r15(pc):保存的内核正在执行的指令地址

3 查看堆栈寄存器的保存值
将上面PSP寄存器的地址(0x20010318)输入到MDK的Memory窗口中得到的数据如下,第六个数为lr寄存器的保存值

三、定位lr寄存器地址的函数名
在工程编译后的map文件中,根据lr的地址确定运行函数,如下图所示在产生异常中断前,最后执行的地址为0x0801D727在函 prvAddCurrentTaskToDelayedList中,

分析产生异常中断的原因
四、获取lr寄存器保持地址的方法
通过MDK在线调试如上面介绍的流程
通过jlink工具使用命令行也可以完成上述过程的定位
JLink Commander调试方法
————————————————
版权声明:本文为CSDN博主「图南楠」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41975640/article/details/134158374

39615654c92ed6550f.png (19.42 KB )

39615654c92ed6550f.png

使用特权

评论回复
沙发
chenjun89| | 2023-11-10 08:37 | 只看该作者
思路清晰,写的不错。

使用特权

评论回复
板凳
正版长小强| | 2023-11-10 12:33 | 只看该作者
顶,是否考虑,实现关键信息打印,方便排查 。 有些场景 不方便调试

使用特权

评论回复
地板
tpgf|  楼主 | 2023-12-2 16:51 | 只看该作者
正版长小强 发表于 2023-11-10 12:33
顶,是否考虑,实现关键信息打印,方便排查 。 有些场景 不方便调试  ...

这个首先我理解着就是要先调试通过串口通讯

使用特权

评论回复
5
wiba| | 2023-12-2 17:23 | 只看该作者
这种调试方式从大方向来说还是比较粗糙的

使用特权

评论回复
6
kxsi| | 2023-12-2 20:02 | 只看该作者
这种调试的方式是不是只能在断点的时候才能进行观察啊

使用特权

评论回复
7
coshi| | 2023-12-2 20:41 | 只看该作者
查看堆栈寄存器保存的数据的时候 这个数据还能是实时的数据吗

使用特权

评论回复
8
drer| | 2023-12-2 21:23 | 只看该作者
这种调试方式的前提是不是应该对地址都非常熟悉啊

使用特权

评论回复
9
qcliu| | 2023-12-2 22:11 | 只看该作者
定位lr寄存器地址的目的是什么呢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1364

主题

13994

帖子

8

粉丝