Cortex M-禁用IRQ的原子性

问题描述 投票:3回答:1

我花了数小时试图回答我的问题,但找不到满意的答案。

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

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

assembly arm cortex-m atomicity
1个回答
0
投票

[IRQ进入这两条指令的执行之间并且IRQ处理程序更改PRIMASK的状态时会发生什么?

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

请记住,只有将中断屏蔽为[[not,才会发生中断,因此中断处理程序只能进行disable中断”。但是,全局禁用中断也会阻止其他中断的触发-等待某些硬件交互的代码通常会<< not >>随机重新启用中断。这就是为什么当中断处理程序修改PRIMASKFAULTMASK而没有在异常返回时恢复它的情况下,它被认为是br0ken的原因。>>

© www.soinside.com 2019 - 2024. All rights reserved.