assembly - Cortex M - IRQ 禁用的原子性

标签 assembly arm cortex-m atomic

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

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

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

最佳答案

What happens when the IRQ comes in between the execution of this two instructions and the IRQ handler changes the state of PRIMASK?

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

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

这就是为什么当中断处理程序修改 PRIMASKFAULTMASK 而不在异常返回时恢复它时,它被认为是损坏的。

关于assembly - Cortex M - IRQ 禁用的原子性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58508470/

相关文章:

gcc - ARM Cortex-M 编译器差异

c - 在 core_cm4.h 上,为什么会有类似 ((uint32_t)(int32_t)IRQn) 的转换?

汇编8086监听键盘中断

linux - 在 Linux 上使用 x86 汇编和 at&t 打印计数器 0 --> 4

android - arm-eabi-gcc 如何确保 crtbegin_dynamic.o 中的 ".text"部分在最终动态链接的可执行文件中排在第一位?

arm - 为什么 Cortex-M 需要它的第一个字作为初始堆栈指针?

assembly - 皮质-M3 : Changing Interrupt Return Address

winapi - 如何准备序言和结语汇编以拦截具有参数的函数?

c++ - 用于调试的未初始化内存的常见值是什么?

optimization - 矢量化代码以实现高效实现