查看: 314|回复: 4

[心得分享] 排查Hard fault错误原因

[复制链接]

7

主题

0

好友

152

积分

童生

Rank: 2

  • TA的每日心情
    开心
    2016-5-12 15:06
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2016-5-25 14:19:58 |显示全部楼层
    一、 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 中变量的当前情况来分析程序逻辑。

    回复

    使用道具 举报

    0

    主题

    0

    好友

    54

    积分

    童生

    Rank: 2

  • TA的每日心情
    奋斗
    2016-7-11 16:21
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    发表于 2016-5-25 15:40:08 |显示全部楼层
    有时候的确会出现这个问题
    回复

    使用道具 举报

    7

    主题

    0

    好友

    152

    积分

    童生

    Rank: 2

  • TA的每日心情
    开心
    2016-5-12 15:06
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2016-5-25 17:02:24 |显示全部楼层
    左岸右岸 发表于 2016-5-25 15:40
    有时候的确会出现这个问题

    确实啊,有点蛋疼
    回复

    使用道具 举报

    12

    主题

    0

    好友

    577

    积分

    版主

    Rank: 7Rank: 7Rank: 7

  • TA的每日心情
    开心
    2015-7-14 10:15
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    发表于 2016-6-17 12:40:37 |显示全部楼层
    加打印函数,把栈打出来分析。
    eeboard大力支持的开源RTOS -- Trochili RTOS
    回复

    使用道具 举报

    7

    主题

    0

    好友

    152

    积分

    童生

    Rank: 2

  • TA的每日心情
    开心
    2016-5-12 15:06
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2016-6-23 09:17:25 |显示全部楼层
    trochili 发表于 2016-6-17 12:40
    加打印函数,把栈打出来分析。

    嗯,可以,不会是debug出身
    回复

    使用道具 举报

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

    关闭

    站长推荐上一条 /3 下一条

    手机版|爱板网 |网站地图  

    GMT+8, 2017-4-30 21:15 , Processed in 0.114720 second(s), 12 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部