我已经花了数小时试图回答我的问题,但找不到任何令人满意的答案。
由于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
变量)。
请记住,只有在未屏蔽中断的情况下才会发生中断,因此中断处理程序只能禁用中断。但禁止中断全球也将防止fireing其他中断-等待着一些硬件交互通常不会代码不会重新启用interrups随机。
这就是为什么在中断处理程序进行修改时PRIMASK
或FAULTMASK
不在异常返回时恢复它的情况下被认为是中断的原因。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句