问题描述
当 PC 值因任何原因损坏时,可能是 IACCESS 故障。怎样才能查出故障发生前正在执行的上一条指令(上一条指令的地址)是哪一条?因为,当故障被捕获时,PC 已经包含一些无效值。如何知道导致错误的代码位置?
解决方法
根据我的经验,PC 损坏是最难调试的“常见”故障,正是出于这个原因。
从长远来看,到目前为止最简单的方法是使用跟踪,但根据您使用的设备以及您的硬件和软件设置,这可能并不容易设置。这甚至是不可能的 - 并非所有设备都支持它,尽管我使用过的所有 Cortex-M 设备都支持(我认为)。跟踪将允许您在故障后转储最近的 PC 值。如果您在此平台上进行大量开发工作,我建议您将跟踪设置为一项值得的时间投资。
如果做不到这一点,通常你能做的最好的事情就是在堆栈上进行一些侦查。特别是,在进入处理程序模式时,LR 的值将被堆叠;这通常会告诉您上次呼叫 (BL) 是在哪里发出的,这可以为您提供线索。然后,您可以设置断点并尝试缩小范围。不过,这并不是万无一失的技术。