This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具与软件:
我的代码正在分支到 FaultISR()。 我花了一整天的时间尝试追踪它。 FAULT 寄存器表明它是精确的数据总线错误、并且故障地址寄存器有效。 代码正在尝试访问一个不存在的寄存器(地址为4004E048)。
我曾经希望、当发生这种情况时、回调堆栈(将显示发生错误的函数)不会显示、它只是显示"tm4c1290ncpdt_startup_ccs.c"中的代码。
是否有某种方法可以确定它是从哪里来的?
谢谢、Doug
尊敬的 Doug:
很多时候、故障是由于外设未使能就访问外设造成的。 这是我要检查的第一件事。 您也可能没有足够的堆栈内存。 增加堆栈、看看这是否会产生影响。 最后、一个简单的错误、例如为超出您分配的大小的数组编制索引。 例如、如果在一个数组中只分配了10个元素、并且您尝试写入元素11及更多元素。 最终、程序将崩溃。
以下是一个应用手册、指导您查找导致故障的违规指令的来源。 https://www.ti.com/lit/pdf/spma043
尊敬的 Charles:
非常令人沮丧,一直在追这个3天了。 我上面的信息是正确的、总线错误位于地址4004E048、我假定这个地址是一个外设、我的 MPU 上不存在。 使用您引用的应用手册(谢谢)、转到并查看堆栈、其中的 LR 和 PC 值看起来不像有效的地址、实际上、在备份堆栈-从20009940到20009ABF -没有任何值是有效的程序地址!
还有其他想法吗?
谢谢、Doug
尊敬的 Doug:
4004E048属于保留空间。 这是将生成总线错误的非法地址。 您是否仅使用 TivaWare? 您是否以任何方式以 DRM (直接寄存器操作)样式编写代码? 您能否将您的代码压缩为最简单的形式并且仍然生成故障、然后我可以看一下您的代码。
尊敬的 Charles:
找到罪魁祸首:在 SysTick 中断中有一条语句调用 TimerValueGet (WTIMER 4_BASE、TIMER_A)、当我更改其他调用时、根据您对我先前问题的响应、从 WTIMER 更改为 TIMER、从 TIMER_A 更改为 TIMER_B
我感到很惊讶的是 TivaWare 没有意识到我的 MPU 没有宽定时器、这一点也许可以交给 TivaWare 小组。
谢谢、Doug