打印
[其它应用]

Cortex-M系列下的原子操作

[复制链接]
1440|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
观星者宁静|  楼主 | 2025-5-16 15:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

在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 | 只看该作者
互斥其实就是信号的使用

使用特权

评论回复
5
szt1993| | 2025-5-27 12:24 | 只看该作者
学习一下相关知识

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

7

帖子

0

粉丝