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.

[参考译文] TMS320F28388D:调试在 Task_restoreHwi 期间调用的 Hwi_unPluggedInterrupt

Guru**** 2539500 points
Other Parts Discussed in Thread: C2000WARE, SYSBIOS

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1550350/tms320f28388d-debugging-hwi_unpluggedinterrupt-being-called-during-task_restorehwi

器件型号:TMS320F28388D
主题中讨论的其他器件:C2000WARESYSBIOS

工具/软件:

尊敬的 TI 支持:

当我的代码运行 8 小时时、我每天会得到大约 1-2 次 Hwi_unPluggedInterrupt。 生成此 Hwi_unPluggedInterrupt 所需的时间会每次变化。 我的 SYS/BIOS 工程中确实启用了 Hwi 和 Swi。 我不断触发这些 Hwi 和 Swi、我创建它们是为了在 C28 和 Cortex M4 之间传递信息、最快可达 1 毫秒。 我很奇怪,我会随机得到一个 Hwi_unPluggedInterrupt。 触发此错误的原因有哪些? 我已尝试为任务扩大堆栈大小、从而扩大.stack 大小、但没有任何帮助。 更奇怪的是,当你收到 Hwi_unPluggedInterrupt 或 System_abort 的错误语句(“xdc.runtime.Error.raise: Terminating exection\n“);不知道这是否相关,但我想我会说这一点。 我很高兴能分享我的 app.cfg 文件以及在 Hwi 和 Swi 中调用的函数(如果需要)。 以下是我使用 ROV 捕获的堆和堆栈大小的一些快照、表明它们看起来确实相对安全。 谢谢!

Code Composer Studio 9.3

编译器:TI v20.2.3 LTS

C2000Ware 3.3.0.00

SYS/BIOS 6.83.0.18

XDCTools 3.62.0.08_CORE

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

    什么中断导致了 Hwi_unPluggedInterrupt? 即使它没有打印预期的消息、我认为该函数中应该有一个 intNum 变量、您可以查看该变量来找出答案? 知道哪个中断触发了它应该可以帮助我们找出问题的原因。

    Whitney

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

    您好 Whitney、

    我已经在该 Hwi_unPluggedInterrupt 函数内设置了一个断点。 我看了几次 intNum 变量、它似乎是垃圾、因为 intNum 变量>800。 下次发生时、我会尝试获取准确的数字。 另一方面、我们发现我们没有为电路板提供足够的电流、因此我们增加了电流。 我们将继续运行它,看看是否发生了它,如果发生了,我将得到确切的 intNum ,但再次,它是高于 800 所以我认为它是垃圾。  

    谢谢!

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

    您好 Whitney、

    intNum 为 3367。

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

    该中断号看起来不正确、但可能是向量表中的地址? 0xD26 是非法指令 (ITRAP) 中断的地址。 因此、CPU 似乎跳转到了不包含有效代码的位置、并且由于您尚未注册 ITRAP 处理程序、因此它转到了 Hwi_unPluggedInterrupt 例程。

    堆栈溢出/损坏是 ITRAP 的一个常见原因、但这并不是唯一的可能性。 ROV 是否未报告任何错误?

    Whitney

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

    您好 Whitney、

    感谢您向我指出 ITRAP 中断。 我为您捕获了更多数据。 这张图片下面有很多数据。 总之,在 Hwi.c 中的 Hwi_unPluggedInterrupt () 内设置 IntNum 后,它立即显示了我的当前断点 intNum 的值仍然为 3367、您指出该值是 ITRAP 中断的地址。 通过查看 PC 寄存器的值、我可以看到其当前为 0x0A7CB2。 我在内存浏览器中拉上了内存位置、可以看到它看起来像是有有效数据。 下面的第二张图片是我的存储器映射 (.map) 中相关部分的一个片段。 该地址应该在此函数中: 000a7c8e  00000052   sysbios.ae28FP64:bios.obj (.text:ti_sysbios_family_c28_hwi_unPluggedInterrupt____i)。  

    如果我调试时出错了、我想在生成 ITRAP 中断后、产生该中断的存储器位置会存储在 PC 寄存器中吗?  

    ROV 未报告任何错误。 我的叠块尺寸看起来都正常、就像在第一张图片的右下角的 ROV 视图中看到的一样。 如果您有任何其他想法、请告诉我。 我想知道是否应该考虑升级 SYS/BIOS、因为我几年前使用的是。 谢谢!

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

    您好、Joseph:

    感谢您的耐心。 您是否能够在这方面取得进展?

    您可以为非法中断(中断号 19)创建 Hwi、然后在 Hwi 函数中可以调用 Hwi_getIrp ()。

    下面的主题对此主题进行了一些讨论:

    https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1538037/launchxl-f28p55x-how-to-get-instruction-return-pointer-in-f28p55x/5919056#5919056

    如果您无法创建 Hwi、则可以插入常规 ISR、并使用我在该帖子中提到的堆栈方法。

    Whitney

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

    您好 Whitney、

    不、我们在这方面没有取得任何进展。 我一直在尝试较旧版本的代码、但仍收到此错误。 我尝试使用 app.cfg 为中断号 19 生成 HWI、但 app.cfg 抛出错误: ti.sysbios.family.c28.Hwi:引导程序 ID = 19 不是有效的引导程序 ID  

    查看 Hwi.xs、我可以看到、如果我尝试在 16 到 31 之间注册一个中断、它将引发错误:  

    这是我的 app.cfg 中的相关小节:

    如果我做错了、请告诉我。

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

    我不知道为什么它不支持这些中断。 你可能只需要使用 Hwi_plug() 或者自己将它写入矢量表。 在这种情况下、您可能无法使用 Hwi_getIrp、但如上所述、在常规中断的情况下、可以在堆栈上找到返回位置。