我花了数小时试图回答我的问题,但找不到满意的答案。
由于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
由于该代码被广泛使用,所以我怀疑这种情况永远不会在(体系结构?)设计中发生。有人可以向我解释为什么吗? :-)谢谢!
[IRQ进入这两条指令的执行之间并且IRQ处理程序更改PRIMASK的状态时会发生什么?
程序将随机锁定,因为这也会破坏大多数其他“等待中断”方法(例如volatile
变量)。
请记住,只有将中断屏蔽为[[not,才会发生中断,因此中断处理程序只能进行disable中断”。但是,全局禁用中断也会阻止其他中断的触发-等待某些硬件交互的代码通常会<< not >>随机重新启用中断。这就是为什么当中断处理程序修改PRIMASK
或FAULTMASK
而没有在异常返回时恢复它的情况下,它被认为是br0ken的原因。>>