Pet*_*dra 6 assembly arm atomicity cortex-m
我花了几个小时试图回答我的问题,但找不到任何令人满意的答案。
由于 ARM Cortex-M 内核没有任何指令来读取全局中断掩码(PRIMASK 寄存器)的状态并立即禁用它,因此所有框架都使用以下两条指令的序列:
mrs r0, PRIMASK ; Read current state
cpsid i ; Mask IRQs
Run Code Online (Sandbox Code Playgroud)
但是没有解释,为什么这段代码被认为是原子的......当IRQ出现在这两条指令的执行之间并且IRQ处理程序改变PRIMASK的状态时会发生什么?喜欢
mrs r0, PRIMASK ; Read current state
; Some weird IRQ handling happens here and changes PRIMASK
cpsid i ; Mask IRQs
Run Code Online (Sandbox Code Playgroud)
由于这段代码被广泛使用,我怀疑(架构?)设计永远不会发生这种情况。有人可以向我解释为什么吗?:-) 谢谢!
当 IRQ 出现在这两条指令的执行之间并且 IRQ 处理程序更改 PRIMASK 的状态时,会发生什么?
程序将随机锁定,因为这也会破坏大多数其他“等待中断”方法(如volatile变量)。
请记住,中断只有在未被屏蔽的情况下才会发生,因此中断处理程序只能禁用中断。但是全局禁用中断也会阻止其他中断触发 - 并且等待某些硬件交互的代码通常不会随机重新启用中断。
这就是为什么当中断处理程序修改PRIMASK或FAULTMASK在异常返回时没有恢复它时,它被认为是损坏的。
| 归档时间: |
|
| 查看次数: |
263 次 |
| 最近记录: |