工具与软件:
我已经阅读了尽可能多关于此主题的用户指南和编译器手册章节、但我仍在努力弄清楚 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、是否仍有任何危险?
感谢您提供的任何清晰度!