我有一个使用STM32F103(ARM Cortex M3)的嵌入式项目,它偶尔会在发布模式下变得越来越严重。作为恢复的一部分,我想从硬故障之前从硬故障之前检索PC值,然后将其存储在电池后台的区域中。

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

我应该在哪里看?它有一个普通模式登记库的地址吗?

谢谢!

有帮助吗?

解决方案

Cortex-M3使用“经典”臂的异常处理模型,例如,它没有其他帖子中提到的“流产模式”。我建议你阅读 此应用程序注释. 。例如,对于硬故障:

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

要确定例外情况下的PC值,您需要检查堆栈;处理器在执行处理程序之前按下R0-R3,R12,PC和LR。所使用的堆栈可以是主(如果LR的位2为0)或过程(否则)。有关详细信息,请参见应用注释的第13页。

其他提示

你应该研究 手臂建筑参考手册 在例外部分中。您需要注册才能获得它。

通常,相关地址将在链接寄存器LR(R14)中放置,但是确切的含义根据例外而有所不同,并且有不同的偏移。

WRT访问用户/系统模式登记库,我认为您需要切换模式以访问它。

当发生异常时,处理器状态从当前状态变为 中止 状态。在中止状态下,处理器转移以使用SP和LR的新寄存器(分别为sp_abt and sp_lr。对于数据中止,可以在LR_ABT + 8中找到有问题的指令,以了解LR_ABT + 4(根据根据ARMV7架构参考手册)

我有一个关于这个话题的常见问题解答。 FAQ链接到的页面包括 故障处理程序代码 这将为您从堆栈中获取程序计数器。

我发现这些问题的共同原因是“循环”延迟。使用-O3时,如果您不是指挥发性变量,它们只会被优化。就个人而言,我更喜欢Systick方法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top