主题中讨论的其他器件: TM4C123
您好!
我遇到一个问题、在 我的 TM4C123GH6PZ 上运行我的程序大约一个小时后、微控制器进入故障 ISR。 我想详细介绍我到目前为止所采取的步骤、并寻求一些建议或建议。
我尝试使用 这里的文档来调试故障。 我已通过 NVIC_FAULT_STAT 寄存器确定我正在进入无效状态使用故障。 NVIC_FAULT_ADDR 正在读取地址0xE000EDF8。 从 TM4C123GH6PZ 数据表中可以看出、这似乎在为 Cortex-M4F 外设(SysTick、NVIC、MPU、FPU 和 SCB)保留的存储器内。 查看 Cortex-M4F 数据表、0xE000EDF8似乎是"调试内核寄存器数据寄存器"。 我在这里看到了一个死区、因为我不确定这是否是正确的故障地址。
听起来、导致无效状态使用故障的最常见原因是堆栈溢出或堆栈损坏。 我阅读 了此文档 并添加了一个硬件观察点来监视__stack。 到目前为止、我还未达到这个观察点、但我仍然遇到 FaultISR。 我之前读过、有时可以通过将整个堆栈设置为特定的已知值并查看是否/何时在内存中修改所有值来调试堆栈溢出。 我看到这可以在链接器文件中完成、但我不确定如何操作。
我还注意到、在我的链接器文件(.cmd)内有语句
__STACK_TOP =__STACK + 1900;
这是旧项目的结转。 我的堆栈大小实际上设置为2600。 上述陈述有何影响? 从论坛上的前一个线程开始、__STACK_TOP 和__STACK_END 作为栈的最低值开始。 当堆栈被填充时、__STACK_TOP 下降到值__STACK。 通过设置__STACK_TOP =__STACK + 1900,我是否顺便将堆栈设置为仅1900? 我的映射文件显示的堆栈大小为0xA28 (2600)、但似乎我要在程序开始时抵消堆栈顶部。
任何帮助、提示或想法都将受到广泛赞赏! 这是我第一次真正挖掘堆栈的使用情况、因此如果我缺少明显的东西、请注意!
此致、
CamK