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.

[参考译文] TMS320F28379S:具有安全装置 ISR 的 ITRAP

Guru**** 2529560 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1012223/tms320f28379s-itrap-with-watchdog-isr

器件型号:TMS320F28379S

大家好、

我当前遇到 TMS320F27379S 问题。

我们在应用中使用看门狗中断、以便在看门狗事件发生时将器件置于安全状态。
使用四个不同的时间片(96kHz、12kHz、200Hz 和主环路)。
中断被嵌套并且以下中断优先级被设定。
PRIO 1:内部看门狗
优先级2:96kHz
优先级3:12kHz
PRIO 4:CAN-Int
优先级5:200Hz

在测试过程中、使用"while (1);"阻止各个时间片。
该测试可用于4个时间片中的3个(跳转至看门狗中断)。
只有当12kHz 时间片被阻止时、才会跳转到"illegalOperationHandler"。
调试显示堆栈指针指向保留区域之外的区域。
我还尝试将堆栈大小从2048增加到4096、但这无法解决问题。
注释掉具有更高优先级的 ISR 代码、因为测试也不会改变结果。

是否有描述此行为的勘误表?
或者、我还可以测试什么来进一步缩小误差源的范围?

此致
Alex

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

    尊敬的 Alex:

    我们确实有嵌套中断("使用嵌套中断时的注意事项")的勘误表、该错误可能会导致类似的问题。 请检查您的问题是否适用。  

    此致、

    Vivek Singh

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

    您好、Vivek、

    感谢您指出勘误表。

    我们按照勘误表中的说明进行操作。

    _asm ("NOP");在 ISR 末尾的 EINT 和 DINT 之前。

    但问题仍然存在...

    此致

    Alex

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

    好的、谢谢。 我和 Anthony (FAE)在离线讨论了这个问题、他将与您联系、了解下一个行动。

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

    您好、Vivek、
    以下是额外要求提供的信息。
    CCS 版本:10.0.00010
    F2837xS 支持库 v3.10.00.00
    编译器版本:v20.2.1.LTS

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="261449" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1012223/tms320f28379s-itrap-with-watchdog-isr "]调试显示栈指针指向保留区域之外的区域。[/quot]

    堆栈指针的距离有多远? 它是超出分配的空间、还是完全不同的存储器空间? 我想确保分配的存储器空间处于16位地址范围内。

    堆栈指针上的内容是否有意义、因为它是上下文保存值? 即使指针超出范围、我也希望 CPU 尝试保存上下文:

    [引用 userid="261449" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1012223/tms320f28379s-itrap-with-watchdog-isr "]仅当阻止12kHz 时间片时才会跳转至"illegalOperationHandler"。

    您能否检查 PIECTRL[PIEVECT]字段的内容以确认它确实是一个触发的非法中断?  PIECTRL 很可能为0x0D27、因为它是非法的。

    [引用 userid="261449" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1012223/tms320f28379s-itrap-with-watchdog-isr "]在测试过程中使用"while (1);"阻止各个时间片。

    我是否正确理解 CPU 在 while (1)陷阱中、直到看门狗过期? 您能否使用存储器浏览器来观察 while (1)陷阱和看门狗 ISR 的存储器区域、以确保 DCSM 或存储器控制器不会将内容屏蔽为0x0000? 一个0x0000指令将触发非法指令陷阱。

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

    堆栈指针的距离有多远? 它是超出分配的空间、还是完全不同的存储器空间?

    堆栈指针指向0xD621,对于堆栈,为以下保留的区域0xC000... 0xCFFF。

    您能否检查 PIECTRL[PIEVECT]字段的内容以确认它确实是一个触发的非法中断?  PIECTRL 很可能为0x0D27、因为它是非法的。

    PIECTRL 寄存器包含0xD27。

    我是否正确理解 CPU 在 while (1)陷阱中、直到看门狗过期?

    正确、在测试用例中、我们将进入 while (1)循环并等待看门狗发生。

    您能否使用存储器浏览器来观察 while (1)陷阱和看门狗 ISR 的存储器区域、以确保 DCSM 或存储器控制器不会将内容屏蔽为0x0000?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="261449" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1012223/tms320f28379s-itrap-with-watchdog-isr/3749543 #3749543]堆 栈指针指向0xD621、对于堆栈、为以下保留区域0xC000... 0xCFFF.[/QUERP]

    这似乎相当远。 您能否尝试仅在 while (1)陷阱中运行程序、然后在循环中自由运行之前确认 SP 值是否合理? 我还建议配置 一个硬件观察点 、在这个观察点中、观察位置被设定为超过 SP 值的几个字。 这样、您将能够检测是否有一些意外活动触发上下文保存。

    [引用 userid="2198" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1012223/tms320f28379s-itrap-with-watchdog-isr/3748589 #3748589"]堆栈指针上的内容是否有意义,因为它是上下文保存值? 我希望 CPU 尝试保存上下文、即使指针超出范围[/quot]

    在非法 ISR 中 RPC 值是否有意义?

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

    大家好、

    从你那一边的小费给了我一个正确的方向的微突。

    "根据我在不尝试完全理解软件架构的情况下可以得出的结果、Timer1 ISR 看起来允许 INT13 (Timer1本身)成为嵌套中断源、用于抢先式 ISR 执行。

     一旦 Timer1 ISR while (1)循环中的 CPU 陷阱、就会产生一系列额外的嵌套 Timer1 ISR、因为 Timer1会继续在后台运行、这会导致堆栈溢出、从而导致 CPU 在看门狗溢出之前获取非法指令。"

    在实现过程中、我使用嵌套中断示例作为指导、此示例激活当前活动的中断以及所有具有更高优先级的其他中断。 现在我用这种方式更改了我的软件、我只允许具有更高优先级的中断、 这样 Timer1-ISR 就不能再被触发。

    Alex、您好