Cortex-M系列下的原子操作

Cortex-M系列下的原子操作

观星者宁静

当前离线

关注TA

发消息

2

主题12

帖子536

积分

高级技术员

高级技术员, 积分 536, 距离下一级还需 464 积分

高级技术员, 积分 536, 距离下一级还需 464 积分

积分536

在线时间2 小时

精华0

注册时间2024-12-17

最后登录2025-6-27

电梯直达

楼主

观星者宁静|

楼主

|

2025-5-16 15:33

|

只看该作者

|倒序浏览

|阅读模式

Cortex-M, 原子操作, Atomic, bi

在CMSIS模块中已经提供了原子操作宏,用于操作16位或32位变量,包括ATOMIC_SET_BIT、ATOMIC_CLEAR_BIT、ATOMIC_MODIFY_REG。

该功能是使用LDREX和STREX指令来实现的。可以通过对原子操作的封装实现互斥。LDREX和STREX指令是Thumb指令集提供的排他加载和排他访问指令,用以实现排他性访问。

复制/* Use of CMSIS compiler intrinsics for register exclusive access */

/* Atomic 32-bit register access macro to set one or several bits */

#define ATOMIC_SET_BIT(REG, BIT) \

do { \

uint32_t val; \

do { \

val = __LDREXW((__IO uint32_t *)&(REG)) | (BIT); \

} while ((__STREXW(val,(__IO uint32_t *)&(REG))) != 0U); \

} while(0)

/* Atomic 32-bit register access macro to clear one or several bits */

#define ATOMIC_CLEAR_BIT(REG, BIT) \

do { \

uint32_t val; \

do { \

val = __LDREXW((__IO uint32_t *)&(REG)) & ~(BIT); \

} while ((__STREXW(val,(__IO uint32_t *)&(REG))) != 0U); \

} while(0)

/* 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)

使用特权

评论回复

标题置顶

标题高亮

点赞共0人点赞