RTThread中HardFault的定位

[复制链接]
1817|3
 楼主| keer_zu 发表于 2022-2-7 13:41 | 显示全部楼层 |阅读模式


错误如下:

159806200b04ad8a0a.png


hard fault 处理流程:
110306200b1056de25.png
 楼主| keer_zu 发表于 2022-2-7 13:43 | 显示全部楼层
rtt出错时候的输出:

  1. psr: 0x000b0000
  2. r00: 0x00000001
  3. r01: 0x00000000
  4. r02: 0x00000010
  5. r03: 0x00000001
  6. r04: 0x00000000
  7. r05: 0x00000000
  8. r06: 0x00000000
  9. r07: 0x00000000
  10. r08: 0xdeadbeef
  11. r09: 0xdeadbeef
  12. r10: 0xdeadbeef
  13. r11: 0xdeadbeef
  14. r12: 0xffffffff
  15. lr: 0x08003185
  16. pc: 0x00000000
  17. hard fault on thread: main

  18. thread   pri  status      sp     stack size max used left tick  error
  19. -------- ---  ------- ---------- ----------  ------  ---------- ---
  20. at_clnt    9  suspend 0x00000100 0x00000800    14%   0x00000005 000
  21. tshell    20  suspend 0x000000cc 0x00001000    05%   0x00000009 000
  22. tidle0    31  ready   0x00000074 0x00000400    11%   0x0000001b 000
  23. main      10  running 0x000003a8 0x00000800    75%   0x00000003 000
  24. FPU active!
  25. usage fault:
  26. SCB_CFSR_UFSR:0x02 INVSTATE
 楼主| keer_zu 发表于 2022-2-7 14:16 | 显示全部楼层
上述寄存器信息中,lr寄存器中的值为0x08003185 ,此值为进入fault异常中断之前的lr的值。

我们知道lr为连接寄存器里面保存的是调用子程序之前的PC的值。 因为 内部 使用了指令流水线,读 PC 时返回的值是当前指令的地址+4 ,所以进入异常之前自动加载到lr的值也为调用子程序前的指令地址+4。由于PC的最低位保存ARM/Thumb 运行状态,Cortex-M3只能运行在Thumb 状态,即LSB = 1。所以我们想要找到出错误程序的指令位置, 只需要对打印出来的lr的值减去5即可。

0x08003185 减去5后为0x08003180 说明我们程序出错位置在PC = 0x08003180 附近。

在Disassembly窗口下,我们找到0x08003180 指令位置:

42666200b93c3b43b.png

 楼主| keer_zu 发表于 2022-2-7 14:22 | 显示全部楼层
再看打印结果:

761686200ba5b3ade0.png

还有代码位置:

724906200ba8d34ebe.png

结合前面0x08003180的反汇编,问题应该处在这个附近。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:qq群:49734243 Email:zukeqiang@gmail.com

1488

主题

12949

帖子

55

粉丝
快速回复 在线客服 返回列表 返回顶部