ARM Cortex M3如何在硬故障之前确定程序计数器值?

时间:2010-09-21 20:16:51

标签: embedded arm interrupt cortex-m3 program-counter

我有一个使用STM32F103(ARM Cortex M3)的嵌入式项目,它在发布模式下偶尔会遇到硬故障。作为恢复的一部分,我想从硬故障之前检索PC值并将其存储起来,以便以后在电池备份区域进行调试。

如何在硬故障点确定程序计数器的值?显然,PC现在设置在硬故障中断的位置。

我应该在哪里看?它有一个普通模式寄存器组的地址吗?

谢谢!

5 个答案:

答案 0 :(得分:6)

Cortex-M3使用与“经典”ARM完全不同的异常处理模型,例如:它没有在另一篇文章中提到的“中止模式”。我建议你阅读this app note。例如,对于硬故障:

  

SCB-> BFAR的值表示导致总线故障的存储器地址   如果SCB-> CFSR寄存器中的BFARVALID位置1,则有效。该   SCB-> MMFAR的值表示导致存储器的存储器地址   管理故障,如果SCB-> CFSR中的位MMFARVALID有效   寄存器已设置。

要确定异常时的PC值,需要检查堆栈;处理器在执行处理程序之前推送R0-R3,R12,PC和LR。使用的堆栈可以是Main(如果LR的第2位为0)或Process(否则)。有关详细信息,请参阅应用说明的第13页。

答案 1 :(得分:3)

您应该查看“例外”部分中的ARM Architecture Reference Manual。你需要注册才能得到它。

通常,相关地址将被放入链接寄存器LR(R14)中,但精确含义因异常而异,并且存在不同的偏移。

W.r.t。访问用户/系统模式寄存器库,我认为您需要切换模式才能访问它。

答案 2 :(得分:1)

发生异常时,处理器状态从当前状态更改为 abort 状态。在中止状态下,处理器转换为sp和lr使用一组新的寄存器(分别为sp_abt和sp_lr。对于数据中止,可以在lr_abt + 8中找到有问题的指令,对于lr_abt + 4中的省长(按照ARMv7 Architecure参考手册)

答案 3 :(得分:1)

我有关于这个主题的常见问题解答。从FAQ链接到的页面包括fault handler code,它将从堆栈中获取程序计数器。

答案 4 :(得分:0)

我发现这些问题的一个常见原因是'for loop'延迟。当使用-O3时,如果你没有引用volatile变量,它们就会被优化掉。就个人而言,我更喜欢SysTick方法。