查看: 1097|回复: 0

Cortex-M3 内核HardFault问题总结

[复制链接]
  • TA的每日心情
    开心
    2016-5-12 15:06
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2016-5-26 08:58:04 | 显示全部楼层 |阅读模式
    分享到:
    一、 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 中变量的当前情况来分析程序逻辑。
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

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

    手机版|小黑屋|与非网

    GMT+8, 2024-11-19 08:31 , Processed in 0.122302 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.