主题中讨论的其他器件:TM4C123
大家好、
这是在黑暗中拍摄的照片、因为我偶然发现调试了代码中发生的随机硬故障。
该故障似乎随机发生、有时在几天之间甚至几个月内发生。 在连接 JTAG 的调试会话中、我曾尝试捕捉故障、但几个月以来一直不幸运。 因此、我不必坐在微控制器旁边进行调试会话并连接 JTAG、我添加了一些寄存器信息、我将这些信息保存到故障处理程序中的闪存中。 这不是最复杂的方法、但我希望我可以在观察到寄存器堆栈后对问题进行逆向工程。
我已经有几次崩溃转储、并开始区分寄存器的含义、但我对我看到的内容完全感到困惑。 我不会在这里列出所有内容、但我看到的重要寄存器如下所示:
CFSR 寄存器的值为1。 这告诉我发生了一个访问违反(IACCVIOL)。 当我第一次开始执行这些故障转储时、寄存器告诉我这是一个"不精确的故障"、这意味着寄存器中的许多信息是无用的。 谷歌搜索后、人们建议关闭写缓冲、将不精确的故障转换为精确的故障。 我这么做了、这就是我发现它是一个访问错误的方式。
此时、IACCVIOL 的文档显示"当该位为1时、为异常返回堆栈的 PC 值将指向错误指令。 处理器未向 MMAR 写入故障地址。" 好的、我可以查看 PC 值、我也将其写入闪存、并且可以缩小导致问题的指令范围。
问题是、故障处理程序寄存器堆栈中的 PC 值为"0xFFFFFFEC"。 对于多个崩溃转储、该值始终位于 PC 寄存器中。 我会丢失、因为该地址距 TM4C123芯片存储器本身的末尾19个字节。 它也牢牢地位于内存的"保留"区域。
来自数据表:
虽然我同意尝试访问此存储器会产生错误、因为它是保留的。 在解释文档时、我错误地说 导致故障的指令位于 PC 值。 0xFFFFFFEC 上可能有什么程序指令? 我很乐意知道 PC 中的值可能是无用的、但从读取 ARM 寄存器文档中可以看到它特别发出的"当该位为1时、为异常返回堆栈的 PC 值指向错误指令"
任何建议、想法或想法都值得赞赏。 几乎在芯片末尾的一个保留存储器块中的地址实际上使我进入了循环:)
谢谢!