OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2817|回复: 0

关于HardFault的解决方法

[复制链接]

2

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2017-5-8
在线时间
22 小时
发表于 2017-7-18 18:40:04 | 显示全部楼层 |阅读模式
Q:Hardfault是怎样产生的?
1.调用了空指针
2.内存溢出

内存溢出可以分为两种向上溢出(如堆栈溢出)和向下溢出(如数组越界)。一般产生hardfault的原因,就是你想取的东西在内存中不存在,然后mcu报错。

Q:怎样确定产生Hardfault的原因?
1.用j - link Command 得到R0~R15的寄存器的数据,然后保存ram中的数据到bin文件中
QQ图片20170718180124.png
2.在.map文件中找到你的堆栈的站顶和栈底
3.观察command窗口,如果sp超过了栈顶了,那么就是堆栈溢出,一般产生堆栈溢出的原因有这么几个  a. 堆栈设置太小  b. 函数嵌套,中断嵌套
4.如果堆栈没有溢出,那就观察ram.bin文件,对照map文件,看ram中的数据是否正常,最常见的,数组越界时,会发现,ram.bin文件中不该出现数据的地方也出现了数据。其他时候还是要结合代码,map文件和ram.bin文件,查看你的数组是否越界。
5.空指针的情况很好检查,根据sp找到ram.bin文件中的寄存器压栈的具体位置,然后通过压栈的LR寄存器,找到出错的函数。

参考的文档:https://wenku.baidu.com/view/83337d8e43323968001c9280.html




QQ图片20170718180815.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 09:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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