打印
[应用相关]

stm32工程代码HardFault异常查错调试方法

[复制链接]
792|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一、导致异常的原因很多,例如:直接使用未分配空间的指针、栈溢出等一场非法操作便会使程序进入HardFault异常状态。下面介绍怎么找出程序中的异常。
接下来在keil_MDK工程中,编译代码,并debug,之后全速运行,可以看到如下图所示程序进入HardFault异常。
如下所示我们找到SP寄存器,0x200045B8即为栈地址,栈里面的值依次为R0~R3、R12、PC(Return address)、xPSR(CPSR或SPSR)、LR。如图我们看到划红线的地方,注意从右往左看。分别为0x0800427D和0x08004BFA。
在show code at address中输入0x08004BFA,点击go to即找到出现异常的代码段附近下面要执行的程序。
我们用同样的方法在show code at address中输入0x0800427D,找到如下代码段
可以发现异常代码就在uart_send_noackdata这个函数里,这个函数里我们定义了一个指针,没有给他分配空间便开始使用了。由此我们掌握了第一种查找异常的方法。只要记录栈里面第21~24以及25到28字节的内容即可方便的找到异常代码。下面介绍使用.map文件查找异常。.map文件在keil工程里面随着程序的编译会自动生成。
在.map文件里我们查找0x08004BFA,找到了0x08004bd8指示是uart_send_noackdata函数,到此我们找到了异常代码所在的位置。
由此我们知道我们只要找到栈里面PC(Return address)、xPSR(CPSR或SPSR)寄存器里的内存地址便可以找到异常代码。
CPSR
当前程序状态寄存器 (Current Program State Register)
SPSR
保存的程序状态寄存器 (Saved Program State Register), 有6个,主要是在处理异常的时候使用.

使用特权

评论回复
沙发
小灵通2018|  楼主 | 2019-10-31 22:18 | 只看该作者
每一种处理器模式下都有一个专用的物理寄存器作为备份的程序状态寄存器SPSR , 当特定的异常发生时,这个物理寄存器负责保存CPSR当前程序状态寄存器的内容, 当异常处理程序返回时,再将内容恢复到当前程序状态器中,继续向下执行原来程序.

PC  程序计数器,是用来计数的,指示指令在存储器的存放位置,也就是个地址信息

使用特权

评论回复
板凳
liangyu888| | 2019-11-1 15:12 | 只看该作者
为什么我定位不到程序中代码的异常点

使用特权

评论回复
地板
liangyu888| | 2019-11-1 15:13 | 只看该作者
能加微信交流么 有偿学习

使用特权

评论回复
5
小灵通2018|  楼主 | 2019-11-7 23:23 | 只看该作者
liangyu888 发表于 2019-11-1 15:12
为什么我定位不到程序中代码的异常点

清理一下工程重新编译试试。

使用特权

评论回复
6
sonicll| | 2019-11-8 10:00 | 只看该作者
本帖最后由 sonicll 于 2020-5-14 11:03 编辑

“如下所示我们找到SP寄存器,0x200045B8即为栈地址,栈里面的值依次为R0~R3、R12、PC(Return address)、xPSR(CPSR或SPSR)、LR。如图我们看到划红线的地方,注意从右往左看。”

楼主这句话是不是写错了?cortex-m3权威手册上写的中断入栈顺序是R0~R3,R12,LR,PC,xPSR。所以0x08004BFA是栈里保存的PC值,也就是异常位置的地址;0x0800427D是栈里保存的LR,LR有点复杂,如果发生异常之前,没有进入其他子函数,则LR是异常位置所在父函数的返回地址;但如果发生异常前,进入过其他子函数,则LR是那个子函数的返回地址。不知道我的理解对不对,欢迎大家拍砖

使用特权

评论回复
7
木木guainv| | 2019-11-19 11:30 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
8
xiaoqizi| | 2019-11-19 11:31 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
9
wowu| | 2019-11-19 12:08 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
10
wakayi| | 2019-11-19 12:41 | 只看该作者
非常感谢楼主分享

使用特权

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

本版积分规则

130

主题

1505

帖子

4

粉丝