Cortex M-禁用IRQ的原子性

彼得·卡兰德拉(Petr Kalandra)

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

由于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随机。

这就是为什么在中断处理程序进行修改时PRIMASKFAULTMASK不在异常返回时恢复它的情况下被认为是中断的原因

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

ARM Cortex M3:原子写入

来自分类Dev

如何在 Cortex-M0 中禁用 PendSV?

来自分类Dev

ARM Cortex M3上的int64_t原子

来自分类Dev

Cortex-M4 SIMD比标量慢

来自分类Dev

ARM Cortex-M3启动代码

来自分类Dev

ARM Cortex-M 内存访问

来自分类Dev

代码执行利用 Cortex M4

来自分类Dev

代码执行利用 Cortex M4

来自分类Dev

查找中断在cortex-m4上发生的位置

来自分类Dev

Cortex-M4定制HardFault_Handler

来自分类Dev

Cortex-M0 +链接程序脚本和启动代码

来自分类Dev

检索ARM Cortex M0上异常的返回地址

来自分类Dev

ARM Cortex M4硬故障-浮点

来自分类Dev

Ocaml是否适用于ARM cortex M4?

来自分类Dev

针对Cortex-M0优化C或汇编代码的大小

来自分类Dev

查找哪个指令在Cortex M3上造成陷阱

来自分类Dev

如何释放ARM Cortex M3堆栈

来自分类Dev

了解Cortex M4上的周期计数

来自分类Dev

在Cortex M7上测量时钟周期计数

来自分类Dev

Cortex-M4F惰性FPU堆叠

来自分类Dev

确定ARM Cortex-M系列上函数的返回地址

来自分类Dev

混合c和组装cortex-m0

来自分类Dev

Cortex M7:启动后立即分支

来自分类Dev

与Cortex M3的Keil ARMCC int64比较

来自分类Dev

ARM Cortex M0的程序等效项是什么?

来自分类Dev

针对Cortex-M0优化C或汇编代码的大小

来自分类Dev

查找中断在cortex-m4上发生的位置

来自分类Dev

--host 为 cortex m4 编译时的 ./configure 标志

来自分类Dev

从 Cortex M0+ 上的硬故障中恢复