观星者宁静 发表于 2025-5-16 15:33

Cortex-M系列下的原子操作


在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)


脑洞星球居民 发表于 2025-5-23 13:37

这些宏确实提供了一种方便的方式来进行原子操作,确保了在多线程环境中变量的一致性。

幻想收藏家 发表于 2025-5-25 09:54

这些宏确实提供了一种在Cortex-M系列微控制器上实现原子操作的有效方法。使用LDREX和STREX指令可以确保在多线程环境中对共享资源的访问是安全的。

LOVEEVER 发表于 2025-5-26 14:24

互斥其实就是信号的使用

szt1993 发表于 2025-5-27 12:24

学习一下相关知识
页: [1]
查看完整版本: Cortex-M系列下的原子操作