如何追踪 Cortex M3 上无效 PC 故障的原因?

问题描述 投票:0回答:2

我的 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

我不确定该地址是否有效。在调试器中对该地址的反汇编看起来像是无稽之谈,也许数据被解释为代码或其他东西。

enter image description here

有什么办法可以追溯到异常发生的地方吗?如果有必要,我可以添加一些额外的代码来捕获更多信息。

arm
2个回答
0
投票

不确定它在 Cortex M3 上如何工作,但在其他一些 ARM 上,PSR 寄存器保存处理器模式位,可以帮助您找出它何时发生(在用户模式、IRQ、FIQ 等)。每种模式通常都有自己的堆栈。

对于用户模式,如果您使用一些具有多任务处理功能的 RTOS,则每个任务可能有许多堆栈,但您可以尝试找出当前任务是哪个任务(在崩溃之前正在运行)。

当您发现崩溃的任务(或IRQ)时,您可以尝试查看其堆栈中所有例程的地址,并找出事故发生之前调用的内容。当然,如果堆栈没有不可恢复地损坏的话。

这就是我要开始调查的地方。如果您发现崩溃的任务甚至函数,但仍然不知道发生了什么,您可以制作类似小的循环历史缓冲区之类的东西,在程序的每个步骤上编写一些代码,这样即使堆栈被破坏,您也可以找到它最后执行的操作.


0
投票

我跟你一样的问题,奇怪这个问题过了好久才出现,请问你现在解决了吗?

© www.soinside.com 2019 - 2024. All rights reserved.