繁体   English   中英

Cortex M - IRQ 禁用的原子性

[英]Cortex M - Atomicity of IRQ disabling

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

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

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

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

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

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

当 IRQ 在这两条指令的执行之间出现并且 IRQ 处理程序更改 PRIMASK 的 state 时会发生什么?

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM