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

由于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

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

最佳答案



该程序将随机锁定,因为这也会破坏大多数其他“等待中断”方法(例如volatile变量)。

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

这就是为什么在中断处理程序修改PRIMASKFAULTMASK而不在异常返回时恢复它的情况下被认为是br0ken的原因。

09-11 17:48