arm - 如何在 Cortex M3 上追踪无效 PC 故障的原因?
问题描述
我有一个 STM32 Cortex M3 遇到间歇性无效 PC (INVPC) 故障。不幸的是,它需要一天或更长时间才能显现,我不知道原因。
故障发生后,我让设备在调试器中暂停。INVPC 标志已设置。堆栈寄存器如下:
0x08003555 xPSR
0x08006824 PC
0x08006824 LR
0x00000000 R12
0x08003341 R3
0x08006824 R2
0xFFFFFFFD R2
0x0000FFFF R0
不幸的是,返回地址 0x08006824 刚刚超过固件映像的末尾。该区域的反编译如下:
Region$$Table$$Base
0x08006804: 08006824 $h.. DCD 134244388
0x08006808: 20000000 ... DCD 536870912
0x0800680c: 000000bc .... DCD 188
0x08006810: 08005b30 0[.. DCD 134241072
0x08006814: 080068e0 .h.. DCD 134244576
0x08006818: 200000bc ... DCD 536871100
0x0800681c: 00001a34 4... DCD 6708
0x08006820: 08005b40 @[.. DCD 134241088
Region$$Table$$Limit
** Section #2 'RW_IRAM1' (SHT_PROGBITS) [SHF_ALLOC + SHF_WRITE]
Size : 188 bytes (alignment 4)
Address: 0x20000000
我不确定这个地址是否有效。在调试器中对该地址的反汇编看起来像是胡说八道,可能将数据解释为代码或其他东西。
有什么办法可以追溯到这个异常发生的地方吗?如有必要,我可以添加一些额外的代码来捕获更多信息。
解决方案
不确定它在 Cortex M3 上是如何工作的,但在其他一些 ARM 上,PSR 寄存器包含处理器模式位,可以帮助您找出它何时发生(在用户模式、IRQ、FIQ 等)。每种模式通常都有自己的堆栈。
对于用户模式,如果您使用一些带有多任务处理的 RTOS,每个任务可能有很多堆栈,但您可以尝试找出哪个任务是当前任务(在崩溃之前运行)。
当您发现崩溃的任务(或 IRQ)时,您可以尝试查看它的堆栈以查找所有例程的地址,并找出在事故发生之前调用了什么。当然,如果堆栈没有不可恢复地损坏。
这就是我要开始调查的地方。如果您发现崩溃的任务甚至函数,但仍然不知道会发生什么,您可以制作小型循环历史缓冲区之类的东西,您可以在其中在程序的每一步编写一些代码,这样即使堆栈被破坏,您也可以找到它最后的作用.
推荐阅读
- css - CSS显示绝对在假设备框架后面
- linux - 在 centos 8 上安装 OpenCV
- scala - 由于 InvalidPath 异常,无法使用“sbt 控制台”启动 Scala REPL
- python - 带标记的线图在终点
- node.js - ReferenceError:未定义传输器
- java - 如何将 Activity 传递给 ViewModel?
- vue.js - 如何更改道具值以在 VueJS 的上下文中关闭 vs-popup
- spring - Spring检查图像是否有二维码然后扫描它
- linux - LibClamAV 错误:cli_loaddbdir():在 /var/lib/clamav 中找不到受支持的数据库文件
- javascript - React 在函数之间传递变量