如何在多核 Cortex-M0/M0+(无 SWP、无 LDREX/STREX)上实现原子操作?

jdx*_*jdx 5 assembly arm multicore atomic cortex-m

ARMv6 之前的 MPU/MCU 有SWP指令(例如良好的 ole 和仍然有效的 ARM7TDMI)。在 ARMv6 架构中LDREX,/STREX对已被引入和SWP删除。然而,除了一个例外 \xe2\x80\x93 ARMv6-M (Cortex-M0/M0+) 既没有LDREX/STREX也没有SWP. 奇怪的。

\n

那么如何在这个平台上实现原子操作/同步原语呢?以老式的方式使用“启用中断”/“禁用中断”?或者我错过了什么?例如ChromiumOS使用老式方法

\n

禁用中断适用于单核 MCU,但多核 MCU 又如何呢?此方法是否适用于例如RP2040 (双核 Cortex-M0+, Raspberry Pi Pico的核心)?

\n

fuz*_*fuz 7

这个问题的不幸答案是:你不知道。在 ARM Cortex-M0/M0+ 上无法进行原子读/修改/写操作。如果您需要此类功能,则必须依赖专用硬件。

例如,RP2040 为外设上的原子 RMW 操作提供特殊的内存区域。它还提供了一个特殊的自旋锁外设,用于两个内核之间的同步,以及用于内核间通信的硬件 FIFO。所有这些都是必需的,因为 Cortex-M0+ 内核本身不提供任何原子内存操作。