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:EINT 和嵌套

Guru**** 2468610 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1472736/tms320f28388d-eint-and-nesting

器件型号:TMS320F28388D

工具与软件:

您好!

 我仍然对中断优先级和嵌套感到有点困惑。

  1. 如果您当前在较低优先级的 ISR 处理程序中、较高优先级的 ISR 能否中断较低优先级?
    1. 如果它们位于同一个 PIE 组中、是否会发生这种情况?
    2. 如果它们不在同一个 PIE 组中、是否会发生这种情况?
    3. 只有当你在较低优先级 ISR 开始时执行一个 EINT、这才会发生吗?
    4. 在 ISR 处理程序开始时完成 EINT 后、较低的 ISR 可以中断较高的优先级?
  2. 较高优先级的 ISR 如何中断同一 PIE 组中较低优先级的 ISR?
    1. 我们使用什么屏蔽、或者它是否会自动发生。
  3. 关于嵌套:
    1. 如果你有2个 ISR 不在同一个 PIE 组中、但是你在 ISR 处理程序的开始执行一个 EINT、那么较低优先级的 ISR 能够中断较高优先级吗? 反之亦然?
      1. 我不希望这发生,但我只是想理解。

 我有这2个链接,我已经阅读,但仍然有点困惑。
https://software-dl.ti.com/C2000/docs/c28x_interrupt_nesting/html/index.html
https://software-dl.ti.com/C2000/docs/c28x_interrupt_faq/html/index.html

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

    您好、Dorion:

    默认情况下、CPU 将每个中断处理为完成、而不会中断 ISR、即使在执行期间标记了更高优先级的中断也是如此。 一旦 CPU 完成执行一个 ISR、它随后将为已标记启用的最高优先级中断提供服务。 您提到的链接提供了两种不同场景的解决方案:

    • 简单嵌套 ( 无论 CPU 是否已经在处理另外一个中断、最高优先级的中断将被分支)
      • 案例1:所有中断都处于不同的组中且来自 ePIE 的优先级良好
        • ISR 中运行
          • 无需额外代码
        • 中断服务例程
          • EINT
          • ISR 应用程序执行
          • 颜色
        • 在中等优先级 ISR 中(非最高或最低优先级)
          • 清除所有较低优先级组中的所有 IER
          • EINT
          • ISR 应用程序执行
          • 颜色
      • 情形2:两个(或更多)中断来自同一组
        • ISR 中运行
          • 无需额外代码  
        • 中断的较低优先级 ISR 中更少
          • 组的 Re 启用 IER
          • 清除该组的 ACK
          • 等待1周期(NOP)
          • EINT
          • ISR 应用程序执行
          • 颜色
        • 为了提供额外保护(并非始终需要):
          • 每次清除 PIEIER 以避免来自同一组的虚假中断(例如、同一 ISR 的第二个中断在执行期间出现、并且你想要在完成第一个中断前避免嵌套和进入第二个中断)
    • 更改优先级 (嵌套以更改 ePIE 中的优先级)- 使用 sw_prioritization_isr_levels.h 中的掩码
      • 使用的所有中断都属于不同的组
        • ISR 中运行
          • 无需额外代码  
        • 在所有较低优先级 ISR 中:
          • 启用所有较高优先级中断的 IER
          • 清除当前组的 ACK
          • 等待1周期(NOP)
          • EINT
          • ISR 应用程序执行
          • 颜色
      • 2个(或更多)中断来自同一组
        • ISR 中运行
          • 无需额外代码   
        • ISR 中较低优先级的 ISR
          • 启用所有较高优先级中断的 IER
          • 清除当前组的 ACK
          • 等待1周期(NOP)
          • EINT
          • ISR 应用程序执行
          • 颜色
        •   中断的较低优先级 ISR 中更少
          • 保存当前 ISR 的 PIEIER
          • 启用所有较高优先级中断的 IER <-为此、使用头文件中的屏蔽
          • 启用同一组中所有较高优先级中断的 PIEIER <-为此、请使用头文件中的掩码
          • 清除当前组的 ACK
          • 等待1周期(NOP)
          • EINT
          • ISR 应用程序执行
          • 颜色
          • 恢复当前组的 PIEIER

    我计划更新您提到的链接、包括上述信息和每个案例的示例。 如果您有任何疑问、敬请告知。

    此致、

    Delaney

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

    要专门回答您的问题:

    Unknown 说:

    否、在正常运行情况下、绝不会发生这种情况。 但是、可以为中断的任意组合启用这一功能(请参见上面的简单嵌套)

    如果他们不在同一个 PIE 组中、是否会发生这种情况?

    不在正常运行状态下、但也可能出现这种情况。 这只需要在较低优先级的 ISR 中使用一个 EINT。

    只有在较低优先级 ISR 开始执行 EINT 时才能发生这种情况?

    是的、需要 EINT。 如果尝试在同一组中嵌套中断、则还需要修改 IER (和 PIEIER、可选)和 ack。 您需要按照示例代码中显示的顺序执行这些操作。

    [quote userid="477218" url="~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1472736/tms320f28388d-eint-and-nesting 在 ISR 处理程序开始执行 EINT 之后、较低的 ISR 会中断较高的优先级吗?

    可以、如果较高优先级的中断在不同的 ePIE 组中。

    [quote userid="477218" url="~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1472736/tms320f28388d-eint-and-nesting 具有更高优先级的 ISR 如何中断同一 PIE 组中较低优先级的 ISR?
    1. 我们使用什么屏蔽、或者它是否会自动发生。
    [报价]

    您需要执行以下所有操作:

    • 组的 Re 启用 IER
    • 清除该组的 ACK
    • 等待1周期(NOP)
    • EINT

    无需使用这些掩模。 修改 PIEIER 是可选的。 从技术上讲、 当在较低优先级的 ISR 内时、较高优先级中断的 PIEIER 已经被启用。 如果您想避免虚假中断、则可以禁用当前组的 PIEIER。

    [quote userid="477218" url="~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1472736/tms320f28388d-eint-and-nesting 有关嵌套:
    1. 如果你有2个 ISR 不在同一个 PIE 组中、但是你在 ISR 处理程序的开始执行一个 EINT、那么较低优先级的 ISR 能够中断较高优先级吗? 反之亦然?
    [报价]

    这就是为什么你不想将 EINT 添加到较高优先级的 ISR 中、只添加较低优先级的 ISR (或所有较低的 ISR)。 这样、只有较高优先级的 ISR 可以嵌套较低优先级的 ISR、而不能嵌套较低优先级的 ISR。 理论上、如果你将 EINT 添加到更高优先级的 ISR 中、并且在执行期间有一个较低优先级的中断出现、它将嵌套这个是。

    请对对您有帮助的任何回答投票  

    此致、

    Delaney

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

    Delaney,

    太棒了,它回答了我所有的问题,还有几个我的问题。 有个建议可能会在常见问题解答中添加我的问题?

    在简单嵌套1中、你说在除较低 ISR 之外的所有 ISR 中启用 EINT、但是在下面有关嵌套的问题中、你说"这是你不想将 EINT 添加到较高优先级 ISR 中的原因、只是较低(或所有较低的 ISR)"

    我假定简单嵌套的情况1是同样的情况、只对较低 ISR 进行一个 EINT?

    Dorion

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

    您好、Dorion:

    我的错、简单嵌套案例应该已经指定了最高优先级。 我只是更新了回复来修复它。

    此致、

    Delaney

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

    Delaney,

     不要道歉,这就是为什么我澄清。 我感谢所有说明、这些说明对我们大有帮助

     我还有一个场景:

     如果我在 ISR 处理程序的开头执行 EINT、并且不更改可能出现的 ISR 的 IER、这将允许任何更高或更低优先级的 ISR "中断"当前 ISR 处理程序、对吗? 除了同一 PIE 组中的任何内容外、我还需要清除 PIE 寄存器。

     如果我只想允许更高的 ISR "中断"当前 ISR 处理程序(而不是更低的 ISR)、则需要在启用 EINT 之前更改 IER 屏蔽。 例如、我获得了中断 PIE 组3.8 (PWM)并且只需要中断 PIE 组1.x、我将 IER 设置为仅启用 PIE 组1。

     这样可以防止任何较低的 ISR 中断该 ISR。

     我是否正确?

    Dorion
     

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

    您好、Dorion:

    这是一个好问题。 在嵌套时、我知道它将选择其他中断中的任何一个(已标记并启用)具有最高优先级的中断、但是我不确定它是否包括它本身在那项检查中(如在中所示、我不知道较低优先级的中断是否可以嵌套在内部)。 让我来看看这个问题、给您回过来。

    此致、

    Delaney

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

    您好、Dorion:

    很抱歉耽误你的时间。 你是对的、仅仅添加 EINT 会导致优先级较低的中断嵌套在其中。 你还需要在 ISR 中针对除最低优先级 ISR 之外的所有 ISR 修改 IER。 因此、在这种情况下、您可以执行以下操作:

    INT 1.3 (最高优先级)-常规 ISR

    INT 2.1 -清除组4和组7的 IER、然后清除 EINT

    INT 4.2 -清除组7的 IER、然后清除 EINT

    INT 7.5 (最低优先级)-只需添加 EINT

    此致、

    Delaney