打印
[应用相关]

Keil环境下STM32定位hardfault位置方法和遇到的情况

[复制链接]
768|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一、概述
调试过程中难免会遇到各种异常,hardfault算是比较常见的一种。在最开始学习的时候,一度很害怕这种情况,不知道怎么定位,摸不清是哪里导致了问题,全靠猜测。网上有很多定位hardfault问题的教程,基本大差不差,方法就那些。
最近有点时间,我也整理下。本章主要记录下我实践过的hardfault定位办法。后续遇到hardfault相关问题,也一并补充到本文中,方便自己查阅。
主要参考的文档为《CM3权威指南CnR2.pdf》。

使用特权

评论回复
沙发
个百zz分点个|  楼主 | 2022-7-26 16:47 | 只看该作者
方法一:Call Stack + Locals
这种方法我认为是最简单的,只需要分两步:

进入仿真后全速运行,进入hardfault后,在Call Stack + Locals窗口,找到HardFault Handler,右键选择Show Caller Code:


程序会自动跳转到出问题的代码,重点分析上下文即可。

使用特权

评论回复
板凳
个百zz分点个|  楼主 | 2022-7-26 16:48 | 只看该作者
方法二:Show Code at Address
这是搜索到的教程里,描述最多的方法。就是通过SP指针找到PC指针,然后去跳转,也只需要三步即可:

使用特权

评论回复
地板
个百zz分点个|  楼主 | 2022-7-26 16:53 | 只看该作者
同样是仿真进入hardfault异常,此时重点关注寄存器部分。将SP指针放到memory窗口中,因为寄存器是32位,调整成long型显示看起来更方便,截图时忘记调了。依次是R0~R3、R12、LR、PC、XPRS 寄存器的值,对比Keil左侧寄存器的值,也可以看出来STM32是小端模式。所以找到第六个,即PC寄存器的值:

使用特权

评论回复
5
个百zz分点个|  楼主 | 2022-7-26 16:54 | 只看该作者
拿到了PC寄存器的值,在Disassembly窗口,右键选择Show Disassembly at Address:

使用特权

评论回复
6
个百zz分点个|  楼主 | 2022-7-26 16:59 | 只看该作者
在弹出的框中输入PC寄存器的值,然后Go To,程序就会跳转到出现异常的位置。其实应该输入PC值-1(忘记哪里看到过了,找到了再补充原因):

使用特权

评论回复
7
个百zz分点个|  楼主 | 2022-7-26 17:00 | 只看该作者

使用特权

评论回复
8
个百zz分点个|  楼主 | 2022-7-26 17:02 | 只看该作者
需要通过LR判断SP?
搜到的大部分教程,并不直接使用SP寄存器的值。都是先通过R14(LR)的值,判断将MSP(R14(LR) = 0xFFFFFFE9)或PSP(R14(LR) = 0xFFFFFFFD)的值作为SP值来使用。但是在权威指南中

使用特权

评论回复
9
个百zz分点个|  楼主 | 2022-7-26 17:06 | 只看该作者

使用特权

评论回复
10
个百zz分点个|  楼主 | 2022-7-26 17:08 | 只看该作者
而且既然可以通过LR来判断,说明寄存器已经更新完成了,直接使用SP指针不就可以了吗?(这里就暂时存疑吧,我先这样去理解了)

使用特权

评论回复
11
sonicll| | 2022-7-26 18:24 | 只看该作者
本帖最后由 sonicll 于 2022-7-26 18:28 编辑

网上这些教程都写错了,应该在栈里面找第7个,才是PC,PC是出错的位置,第6个是LR,楼主你看你发的图,0x0800400C地址是条跳转指令,本身没有错误,应该看栈里第7个,0x08004020这个地址

使用特权

评论回复
12
个百zz分点个|  楼主 | 2022-7-27 10:16 | 只看该作者
关于MSP和PSP
MSP和PSP都是堆栈指针:

使用特权

评论回复
13
cemaj| | 2022-8-14 17:43 | 只看该作者
资料够全的,多谢分享                                 

使用特权

评论回复
14
pentruman| | 2022-8-14 17:58 | 只看该作者
正准备用 来做产品,刚好用上。         

使用特权

评论回复
15
burgessmaggie| | 2022-8-14 18:18 | 只看该作者
资料很实用,谢谢楼主!                                 

使用特权

评论回复
16
febgxu| | 2022-8-14 18:27 | 只看该作者
很详细的开发板资料                                 

使用特权

评论回复
17
chenci2013| | 2022-8-14 18:36 | 只看该作者
非常感谢楼主分享                                 

使用特权

评论回复
18
lzmm| | 2022-8-14 18:45 | 只看该作者
谢谢你共享的资料                                 

使用特权

评论回复
19
htmlme| | 2022-8-14 18:54 | 只看该作者
以后学习就方便了                                 

使用特权

评论回复
20
bartonalfred| | 2022-8-14 19:03 | 只看该作者
内容还是非常丰富的                                 

使用特权

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

本版积分规则

50

主题

631

帖子

0

粉丝