OpenEdv-开源电子网

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

如何排查Hard fault错误

[复制链接]

13

主题

201

帖子

0

精华

高级会员

Rank: 4

积分
671
金钱
671
注册时间
2015-4-26
在线时间
173 小时
发表于 2016-5-25 14:15:14 | 显示全部楼层 |阅读模式
一、 Hard fault 产生原因硬件方面常见原因
       硬件原因:
                     1、电源设计有错误,造成器件供电不稳;
                     2、电源质量不好,文波,噪声过大;
                     3、器件接地不良;
                     4、对于带有 Vcap 引脚的器件,管脚处理不当;
                     5、电路中有强干扰源,对器件造成干扰;
       软件原因:
                     1、使用了空指针;
                     2、对地址偏移量的计算有误
                     3、数组越界导致程序出错;
                     4、动态内存使用不当,导致访问了已释放的内存地址;
                     5、通过地址访问了已失效的局部变量;
                        一般因为硬件造成 Hard Fault 错误的可能性较低, 90%都是软件原因造成的,
                        所以遇到硬件中断错误,基本就是通过软件来排查到硬件中断错误,基本就是通过软件来排查

二、 排查问题使用到的工具
       Jlink, Segger( Jlink 上位机), Keil

三、 排查步骤
                  1、 使用 keil 生成 map 文件,生成 lst 文件。
                    Map 文件是 keil 自动生成的,里面能标明每个函数、 每个变量的位置。他被放在工程路径下。
                    lst 文件反映的是每一个函数,每一条指令的 PC 指针,在 keil 中需要调用 USER 命令生成
                  2、保存出问题时候的 RAM
                    出问题的时候调用别断电,接上 Jlink,调用 Segger 里面的 Jlink commander 来获取现场
                    (1)先输入一个“ USB”让 Jlink 接上设备,然后输入 halt 来停住内核;
                    (2)调用 savebin ram.bin 0x20000000 0x2000 将 RAM 中的内容全部保存下来,保存下来的东西被存在放 Segger 的安装目录中。
                  3、分析问题
                      查看 map 文件找到栈的位置
                      打开保存的 bin 文件,找到进入硬件中断前调用了哪些函数,在使用哪个变量,然后逐一分析。
                     从栈的底部往上看,哪个地方的值是函数指针,然后对应 lst 文件去逐一查看,分析,就能大致知道是在执行哪个函数,
                     哪一条指令,或者是调用某个参数导致的硬件中断错误的。通过 map 文件可以知道每个变量的位置,可以直接去查看
                     我们保存下来的 ram 中变量的当前情况来分析程序逻辑。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-12 15:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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