澳门威尼斯人金光综艺馆票务: [技术问答] HardFault异常分析

永利游戏开户直营
249|6
楼主
本帖最后由 AutochipsMCU 于 2019-9-2 21:21 编辑

有客户经常咨询程序跑飞怎么分析。下面整理一下方法,澳门威尼斯人金光综艺馆票务:抛砖引玉,大家一起分享讨论

在系统开发的时候,有可能会遇到出现HardFault_Handler硬件异常(死机)。对于功能稍微复杂一些的系统(或带OS),逐一检查程序跑飞原因会很麻烦,如果是低概率则更麻烦。好在掌握一些技巧后,能让如此棘手的问题变得容易一些。
出现HardFalut主要有两方面的原因:
1、内存溢出或者访问越界。
2、堆栈溢出。


关于HardFalut的分析,segger官方和keil官方都有提供hardFault相关的文档和代码
AN00016_AnalyzingHardFaultsOnCortexM.pdf (103.64 KB, 下载次数: 2)
apnt209.pdf (1.13 MB, 下载次数: 3)
对于低概率问题,若支持打log,建议做法:出现hardFalut后把出现异常时的现场通过log打印出来。结合MAP文件来进行分析定位问题。
startup_ac78xx.s关于HardFalut_Handler修改如下:
  1. HardFault_Handler\
  2.                 PROC
  3.                 IMPORT  HardFaultDebug
  4.                 ;LDR R1, =0xE000ED0C
  5.                 ;LDR R0, =0x05FA0004
  6.                 ;STR R0, [R1]   ; RESET
  7.                 TST LR,#4
  8.                 ITE EQ
  9.                 MRSEQ R0,MSP
  10.                 MRSNE R0,PSP
  11.                 B HardFaultDebug
  12.                 EXPORT  HardFault_Handler          [WEAK]
  13.                 B       .
  14.                 ENDP
复制代码


HardFaultDebug实现如下:
  1. void HardFaultDebug(const unsigned int * stackInfo)
  2. {
  3.     unsigned int stackR0;
  4.     unsigned int stackR1;
  5.     unsigned int stackR2;
  6.     unsigned int stackR3;
  7.     unsigned int stackR12;
  8.     unsigned int stackLR;
  9.     unsigned int stackPC;
  10.     unsigned int stackPSR;

  11.     stackR0 = ((unsigned long) stackInfo[0]);
  12.     stackR1 = ((unsigned long) stackInfo[1]);
  13.     stackR2 = ((unsigned long) stackInfo[2]);
  14.     stackR3 = ((unsigned long) stackInfo[3]);
  15.     stackR12 = ((unsigned long) stackInfo[4]);
  16.     stackLR = ((unsigned long) stackInfo[5]);
  17.     stackPC = ((unsigned long) stackInfo[6]);
  18.     stackPSR = ((unsigned long) stackInfo[7]);

  19.     printf("R0=%x\n", stackR0);
  20.     printf("R1=%x\n", stackR1);
  21.     printf("R2=%x\n", stackR2);
  22.     printf("R3=%x\n", stackR3);
  23.     printf("R12=%x\n", stackR12);
  24.     printf("LR[R14]=%x subroutine call return address\n", stackLR);
  25.     printf("PC[R15]=%x program counter\n", stackPC);
  26.     printf("PSR=%x\n", stackPSR);

  27.     printf("BFAR=%x\n", (*((volatile unsigned long *)(0xE000ED38))));
  28.     printf("CFSR=%x\n", (*((volatile unsigned long *)(0xE000ED28))));
  29.     printf("HFSR=%x\n", (*((volatile unsigned long *)(0xE000ED2C))));
  30.     printf("DFSR=%x\n", (*((volatile unsigned long *)(0xE000ED30))));
  31.     printf("AFSR=%x\n", (*((volatile unsigned long *)(0xE000ED3C))));

  32.     printf("SCB_SHCSR=%x\n", SCB->SHCSR);

  33.     while(1);
  34. }
复制代码

可基于PC地址参考该软件对于的map文件找到案发时附件位置。然后定位问题。



沙发
| 2019-8-30 11:20 | 只看该作者
怎么不回答我问题了,无刷无感启动波形
板凳
 楼主 | 2019-8-30 13:01 | 只看该作者
a20084666 发表于 2019-8-30 11:20
怎么不回答我问题了,无刷无感启动波形

不好意思,没有留意到您有回复
地板
| 2019-8-30 13:40 | 只看该作者
AutochipsMCU 发表于 2019-8-30 13:01
不好意思,没有留意到您有回复

没事的,怎么称呼
5
| 2019-9-2 15:57 | 只看该作者


你这个只能定位到发生HardFault的点,,但如果这个函数被多个函数调用,,你不知道它是被哪个函数调用时触发的HardFault,,

给你推荐个工具,,不需要在单片机上添加代码,,发生HardFault后用此工具读取芯片寄存器和RAM内容,,自动分析HardFault点和到达这一点的调用路径:

源码和exe:http://www.dcy.5776644.com/XIVN1987/JHFView


6
| 2019-9-2 17:09 | 只看该作者
XIVN1987 发表于 2019-9-2 15:57
你这个只能定位到发生HardFault的点,,但如果这个函数被多个函数调用,,你不知道它是被哪个函数调用时 ...

好东西吖
7
 楼主 | 2019-9-2 17:48 | 只看该作者
XIVN1987 发表于 2019-9-2 15:57
你这个只能定位到发生HardFault的点,,但如果这个函数被多个函数调用,,你不知道它是被哪个函数调用时 ...

谢谢分享
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

永利游戏开户直营 快速回复 返回顶部 返回列表
澳门sasa最新优惠网上娱乐场 澳门赌场几岁可以进网上娱乐场 mg线上娱乐FG电子 永利游戏开户直营 2016澳门银河马拉松登入
娱乐城作弊 去澳门赌场怎么赚钱 大发888相关推荐 通辽金沙会 澳门网上新葡京娱乐场
澳门能购物的地方登入 赌外围足球怎么买 大运河购物中心导购图登入 澳门赌牌九吗登入 不夜城澳门赌场登入
mg女孩与枪 申博太阳城亚洲娱乐网游戏登入 沙龙百家乐安全上网导航 济州岛赌场何晴 澳门永利酒店在哪里登入