Cortex M - IRQ 禁用的原子性

Cortex M - Atomicity of IRQ disabling

我花了几个小时试图回答我的问题,但找不到任何令人满意的答案。

由于 ARM Cortex-M 内核没有任何指令来读取全局中断掩码(PRIMASK 寄存器)的状态并立即禁用它,因此所有框架都使用以下两条指令序列:

mrs r0, PRIMASK ; Read current state
cpsid i         ; Mask IRQs

但是没有解释,为什么这段代码被认为是原子的...当 IRQ 在这两条指令的执行之间出现并且 IRQ 处理程序改变 PRIMASK 的状态时会发生什么?喜欢

mrs r0, PRIMASK ; Read current state
; Some weird IRQ handling happens here and changes PRIMASK
cpsid i         ; Mask IRQs

由于此代码被广泛使用,我怀疑(架构?)设计永远不会发生这种情况。有人可以向我解释为什么吗? :-) 谢谢!

What happens when the IRQ comes in between the execution of this two instructions and the IRQ handler changes the state of PRIMASK?

程序会随机锁定,因为这也会破坏大多数其他 "wait for interrupt" 方法(如 volatile 变量)。

请记住,中断只有在 屏蔽时才会发生,因此中断处理程序只能禁用 中断。但是全局禁用中断也会阻止其他中断触发 - 等待某些硬件交互的代码通常 不会 随机重新启用中断。

这就是为什么中断处理程序在修改 PRIMASKFAULTMASK 而没有在异常 return.

上恢复时被认为是 br0ken 的原因