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.

[参考译文] TMS320F28379D:调试 ITRAP Interrupt_illegalOperatorHandler()

Guru**** 1947850 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/998430/tms320f28379d-debugging-itrap-interrupt_illegaloperatorhandler

器件型号:TMS320F28379D

我目前正在尝试调试在我们使用的 F28379D 芯片上为什么会发生 ITRAP。 以下是需要考虑的一些事项:

  • 我按"Debug"按钮连续刷写 CPU1和 CPU2、因为这就是我设置调试配置的方法
  • 将代码加载到两个内核上后、我按下 CPU1上的"恢复"按钮、然后在 CPU2上按下该按钮、并且在恢复 CPU2后立即在 CPU1上触发 ITRAP
  • Debug 窗口显示 Interrupt_illegalOperationHandler()是被调用的特定 ITRAP
  • 有趣的是 ITRAP 只发生一次。 我的意思是、如果按下 每个处理器的 CPU 重置/重新启动按钮、然后再次恢复 CPU1和 CPU2、则不会发生 ITRAP。 但是、如果我通过按下 STOP 按钮完全停止调试、并重新调试两个内核、则会再次发生调试。
  • 《国际行动计划》是在最近的一项承诺中提出的,但是,我在该承诺中没有看到任何迹象表明《国际行动计划》是为什么发生的
  •  我在启动时使用值填充堆栈、以便在发生 ITRAP 时观察堆栈内存、但是没有任何迹象表明堆栈溢出
  • 我还尝试将 CPU1上的堆栈大小从2048增加到4096、但这无法解决问题
  • 我怀疑它可能与记忆有关、  以前 工作的承诺(无 ITRAP)和错误承诺(ITRAP)之间的记忆差异如下:
    • RAMLS0_1从2653增加到2680 (TI ramfunc)
    • FLASHB 从8186增加到8192 (最大尺寸)
    • FLASHD 从8189增加到8192 (最大尺寸)
    • FLASHE 从10511增加到11637
    • RAMGS0从2903增至3683
  • 按照另一个论坛帖子中的建议,我尝试在 ESTOP0之后添加 return;语句;在 Interrupt_illegalOperationHandler()函数中,但由于某种原因,调试器跳过 return 并在 for (;){;}中继续永久循环
    • 也许我在编辑错误的 driverlib 文件、我在 C:/ti/c2000/C200Ware_3_04_00_00/driverlib/f2837xd/driverlib 中修改了 interrupt.h

请告知我如何进一步调试此 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 代码信息、将无法反向跟踪栈并找到违规地址。

    以下文章提供了更多详细信息、可帮助您反向跟踪堆栈并获取地址。

    https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/979782/tms320f280049c-illegal-instruction-behavior---how-to-retrieve-the-offending-address/3620048#3620048

    谢谢、

    Ashwini

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的...我决定从最复杂的开始、简单地单步执行我们系统上的每个中断、以查看它是否触发了 ITRAP。 幸运的是、非法指令在我检查的第一个中断上被触发、这样我节省了大量调试时间。  不幸的是、似乎存在内存溢出...出于某种原因、结构内的函数回调会被错误的地址覆盖。 不用说,我已经把它缩小到不需要进一步援助的程度。

x 出现错误。请重试或与管理员联系。