硬汉嵌入式论坛

 找回密码
 立即注册
查看: 7449|回复: 3
收起左侧

[IAR] 一次HardFault_Handler问题的调试解决

[复制链接]

8

主题

34

回帖

58

积分

初级会员

积分
58
发表于 2020-11-25 14:29:00 | 显示全部楼层 |阅读模式
使用IAR开发F405,程序运行过程中会挂掉,怀疑是数据溢出造成的,挂上调试器,经过一段时间复现BUG,发现程序死在了HardFault_Handler函数,找了一些帖子,解决了这个问题,记录一下。
程序死在了HardFault_Handler函数,所以我们要找到程序在执行HardFault_Handler前执行了什么,根据Cortex-M3/M4内核异常处理流程,发生异常时程序会将核心寄存器值压入当前堆栈,顺序为R0 R1 R2 R3 R12 LR PC xPSR等待异常处理结束后将堆栈内容弹出,将LR的值载入PC,继续执行程序,所以我们只要找到LR的值就能知道发生异常后程序执行在哪里。SP的值为堆栈地址,里面依次存着R0 R1 R2 R3 R12 LR PC xPSR的值。所以先打开Register窗口,查看SP寄存器的值,打开Memory窗口,在Go to侧输入SP寄存器值,跳转到对应地址,即堆栈地址,LR前面有5个寄存器的,每个寄存器占4字节,所以第21~24字节存储着LR的值,注意:STM32为小端模式,所以LR的值要按照24~21的顺序读取。读取出LR的值后,打开Disassembly窗口,根据LR的值找到对应的汇编代码和C代码。
分析发现,此段程序对数据处理后存入一个无符号整型的数组,但处理后的数据有可能会出现负数的情况,后续通过仿真,发现对一些特殊的数据,确实会出现负数的情况,造成数据溢出,程序进入HardFault_Handler函数。
当时忘记了截图,文字看起来可能没那么直观,但还是记录一下,希望对大家有所帮助,。
解决问题的过程参考了帖子:
https://www.pianshen.com/article/3253360786/
https://blog.csdn.net/baidu_25505611/article/details/79315507
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106913
QQ
发表于 2020-11-25 15:01:27 | 显示全部楼层
谢谢楼主分享。
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2021-1-9 21:57:50 | 显示全部楼层
回复

使用道具 举报

2

主题

29

回帖

35

积分

新手上路

积分
35
发表于 2021-9-15 18:30:08 | 显示全部楼层
很好的文章,之前我排查这类问题比较繁琐:先在程序里一个一个功能模块减少,看还会不会继续出现问题,如果不会,则定位了在哪个功能模块出了问题,然后再定位在哪个函数。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-10 04:08 , Processed in 0.201417 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表