[其它应用] Cortex-M系列下的原子操作

[复制链接]
2465|4
 楼主| 观星者宁静 发表于 2025-5-16 15:33 | 显示全部楼层 |阅读模式

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

该功能是使用LDREX和STREX指令来实现的。可以通过对原子操作的封装实现互斥。LDREX和STREX指令是Thumb指令集提供的排他加载和排他访问指令,用以实现排他性访问。
  1. /* Use of CMSIS compiler intrinsics for register exclusive access */
  2. /* Atomic 32-bit register access macro to set one or several bits */
  3. #define ATOMIC_SET_BIT(REG, BIT)                             \
  4.   do {                                                       \
  5.     uint32_t val;                                            \
  6.     do {                                                     \
  7.       val = __LDREXW((__IO uint32_t *)&(REG)) | (BIT);       \
  8.     } while ((__STREXW(val,(__IO uint32_t *)&(REG))) != 0U); \
  9.   } while(0)

  10. /* Atomic 32-bit register access macro to clear one or several bits */
  11. #define ATOMIC_CLEAR_BIT(REG, BIT)                           \
  12.   do {                                                       \
  13.     uint32_t val;                                            \
  14.     do {                                                     \
  15.       val = __LDREXW((__IO uint32_t *)&(REG)) & ~(BIT);      \
  16.     } while ((__STREXW(val,(__IO uint32_t *)&(REG))) != 0U); \
  17.   } while(0)

  18. /* Atomic 32-bit register access macro to clear and set one or several bits */
  19. #define ATOMIC_MODIFY_REG(REG, CLEARMSK, SETMASK)                          \
  20.   do {                                                                     \
  21.     uint32_t val;                                                          \
  22.     do {                                                                   \
  23.       val = (__LDREXW((__IO uint32_t *)&(REG)) & ~(CLEARMSK)) | (SETMASK); \
  24.     } while ((__STREXW(val,(__IO uint32_t *)&(REG))) != 0U);               \
  25.   } 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 | 显示全部楼层
学习一下相关知识
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

29

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部