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.
我目前正在尝试调试在我们使用的 F28379D 芯片上为什么会发生 ITRAP。 以下是需要考虑的一些事项:
请告知我如何进一步调试此 ITRAP 条件。 谢谢!
您好!
请参阅 "如何调试 ITRAP?" 部分中找到
https://software-dl.ti.com/C2000/docs/c28x_interrupt_faq/html/index.html
您可以尝试删除 Forever 循环并替换为 return、但在那里放置一个断点以进一步调试、如常见问题解答中所述。
我已经引用了这个文档、它对于实际调试的方式来说就很模糊了、就像它所说的那样。 "将断点插入到 ISR 中"...哪个 ISR...在哪里? 或者使用"查看堆栈上的返回地址值..."再次说明、我在哪里以及如何查看此值? 我已经尝试替换 loop 的无穷大并设置断点、但调试器会像返回时那样单步执行返回、这表明我必须编辑其他一些文件。 请重新阅读我的帖子并提供建议。
您好、Nigel、
由于您已经验证堆栈不是问题、因此可能是其他一些事件。 请查看以下文档第3.6节"非法指令陷阱"部分。 其中包含了当内核 处于陷阱 ISR 中时、通过查看压入栈的内容来获取违规地址的相关信息。 这可能有助于弄清楚造成陷阱的原因。
https://www.ti.com/lit/ug/spru430f/spru430f.pdf
谢谢、
Ashwini
之前粘贴的中断常见问题解答链接应包含有关本文档的更多信息。 我不熟悉堆栈/中断的具体细节、因此 第3.6节有点卷积。 这是程序到达 Interrupt_illegalOperationHandler()中的 ESTOP0时堆栈内存的屏幕截图。 突出显示的是当前堆栈指针的位置(0xB865)请告诉我如何进一步调试:
您好、Nigel、
只通过查看存储器就很难回答这个问题、因为 ISR 本身会有编译器生成的一些源代码、这些源代码会将内容推送到堆栈、而硬件自动执行的操作除外、如的表3-5所示 CPU 和指令集指南的前面部分。 如果没有该 ISR 代码信息、将无法反向跟踪栈并找到违规地址。
以下文章提供了更多详细信息、可帮助您反向跟踪堆栈并获取地址。
谢谢、
Ashwini
好的...我决定从最复杂的开始、简单地单步执行我们系统上的每个中断、以查看它是否触发了 ITRAP。 幸运的是、非法指令在我检查的第一个中断上被触发、这样我节省了大量调试时间。 不幸的是、似乎存在内存溢出...出于某种原因、结构内的函数回调会被错误的地址覆盖。 不用说,我已经把它缩小到不需要进一步援助的程度。