【发布时间】:2022-11-08 00:22:07
【问题描述】:
Cortex M 3 4 7 支持 LDREX 和 STREX 汇编器指令,并通过这些 CMSIS 提供例如 ATOMIC_MODIFY_REG 以确保对 (u)int32_t 进行原子修改(即清除一些位并设置一些(可能是其他)位)。 现在我认为也可以等效地使用 ATOMIC_INC 和 ATOMIC_DEC 来原子地增加或减少 (u)int32_t 变量。但是没有。 这个想法有问题吗?我可以轻松地将 ATOMIC_MODIFY_REG 更改为 ATOMIC_INC,但测试这是否真的是原子的并不是那么容易。 我正在使用最新版本的 STMCubeIDE。
谢谢你的帮助
编辑:不再确定 ATOMIC_MODIFY_REG 是否真的是 CMSIS。 这是我在 STM CubeIDE 中的 ATOMIC_MODIFY_REG:
/* Atomic 32-bit register access macro to clear and set one or several bits */
#define ATOMIC_MODIFY_REG(REG, CLEARMSK, SETMASK) \
do { \
uint32_t val; \
do { \
val = (__LDREXW((__IO uint32_t *)&(REG)) & ~(CLEARMSK)) | (SETMASK); \
} while ((__STREXW(val,(__IO uint32_t *)&(REG))) != 0U); \
} while(0)
【问题讨论】:
-
ldrex/strex 最初是为多核系统设计的,用于管理对资源的共享访问。我相信对于某些内核/架构(cortex-m)来说,这些并不是排他性的(支持它们有意义吗?)。您将需要不同的进程 ID,您可以将处理器放入其中,以便让一个进程设置独占位,而另一个进程干预以查看它是否有效。如何使用您拥有的核心/芯片做到这一点?
-
为了共享一个资源,你需要另一个资源来管理这个锁。您要更改的位置以及用于管理该位置的位置。并不是说在宏/库中无法做到这一点。您是否尝试过自己实施?
-
某些核心上的 wfe/wfi 只是一个 nop。确保它按照您认为它首先为您的核心/芯片所做的工作。如果宏实际上没有执行所暗示的操作,那么创建宏是没有意义的,因此首先它会按照您的想法进行操作,并且必须有一种特定的系统方式来提供该功能。
标签: c arm stm32 atomic cortex-m