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.

[参考译文] MSP430FR5969:在 EINT 之前为 NOP

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1403121/msp430fr5969-nop-before-eint

器件型号:MSP430FR5969

工具与软件:

我已经阅读了尽可能多关于此主题的用户指南和编译器手册章节、但我仍在努力弄清楚 NOP 和 EINT 的相关要求。  以下哪些部分似乎是最相关的部分供参考:

在 DINT 之后需要 NOP()是显而易见的。  下一条指令仍然可以被中断、如果你认为中断被禁用并破坏你拥有的一些原子合约、这可能会令人惊讶。

在 EINT 之后需要一个 NOP()也对我有一些意义,虽然它有点弱。  如果在 GIE 未置位时有中断处于挂起状态、并且您希望保证这些中断在 EINT 之后的下一条指令之前得到处理、则需要 NOP 保护。  我至少可以理解这一点、但我想问您的代码是否非常稳健(如果依赖这一点)。  不能在 EINT 之后的 NOP 期间异步设置中断、在这种情况下、您可以在第一条指令之后开始对中断进行处理?

我还能够理解(有点病理的)这样的情况、在这种情况下、如果你禁用、然后立即重新启用中断、二者之间必须有一个 NOP。

我不明白的是、在这些特定情况下、一般情况下、为什么在 EINT 之前需要 NOP。  然而 、大多数 RTOS 工程似乎认为确实如此、CCS 会发出相关警告。 我个人确实可以明确说明为什么需要这些 NOP。

总结我的问题:

1) 1)何时需要在 EINT 之前使用 NOP?

2) 2)在 EINT 之前没有 NOP 有什么同步危险?

3) 3)如果每个 DINT 后跟一个 NOP、每个 EINT 后跟一个 NOP、是否仍有任何危险?

感谢您提供的任何清晰度!

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

    我正在查看的指南 slau367 4.6.2.20包括:

    中断使能位或中断的清零位之间至少包含1条指令
    标志和 EINT 指令。 例如:在前面插入一条 NOP 指令
    EINT 指令。

    为什么? 也许这些更改需要一两个周期才能通过中断硬件进行传播、这可以防止出现问题。 我的确记得、中断硬件不会处理开始处理中断的情况、因此中断会很好地消失。 这会导致它无法选择正确的矢量表条目、并且程序执行会偏离电源轨。 已经有一个月或三个月了,所以我忘记了特定的线程。

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

    我很欣赏回复、但我觉得这一点也不清楚...

    如果在您添加的 NOP 正在执行时设置了标志、与根本没有 NOP 不同?

    如果先前的指令是 DINT、这是否是唯一重要的情况?

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

     当需要 置位或清零通用中断使能位时、它应该被应用于所有指令。

    在 EINT 之前没有 NOP 有什么同步风险?

    不遵循这些规则可能会导致意外的 CPU 执行。

    如果每个 DINT 后跟一个 NOP、每个 EINT 后跟一个 NOP、是否仍有任何危险?

    在 EINT 指令前面 插入一条 NOP 指令、在 DINT 之后插入一条 NOP 指令、到目前为止我没有测试数据、而是遵循我们的注释、以避免  CPU 意外执行。

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

    是的、我试图遵循评论、但评论中的指导仍不明确...

    重复4个要点、介绍我如何理解它们:

    1)始终在使能中断指令(EINT)之后强制执行该指令、即使中断服务例程正暂挂也是如此

    ->对我意味着一个 NOP EINT 可能是必要的,但你没有提到这一点

    2) 2)中断使能位/中断标志位的清零与 EINT 指令之间包含至少一条指令。 示例:在 EINT 指令之前插入一条 NOP 指令。

    ->这是最不清楚的一个。 描述 NOP 的位置之前是 EINT、但这是因为它 EINT 和 DINT 之间? 这不等于 DINT 后的 NOP 吗?

    3) 3)在 sic 和需要中断保护的[DIN]代码序列的起始之间包含至少一条指令。 例如:在 DINT 之后插入一条 NOP 指令。

    ->这是明确和明确的。  DINT 之后的指令不受禁用中断的保护、因此需要在该处使用 NOP。 明白了。

    4) 4)切勿在将通用中断使能(GIE)位置1后立即将其清零。  此类序列之间至少插入一条指令。

    ->似乎也很清楚,虽然这似乎再次表明,需要一个 NOP EINT,而不是以前

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

    Larry、您好!

    在查看有关此问题的上一条记录后、我想您可以忽略上面的注释、并注意以下使用:

    我们发现、 如果只有在使用时一个 EINT 后跟一个 DINT、则可能无法执行挂起的中断。 此处的解决方法是在 EINT 和 DINT 之间添加一个 NOP。