RT-Thread 原子操作

news/2024/6/15 2:35:52 标签: 数据结构, RT-Thread

原子操作简介

原子操作(Atomic operation)是指一种不可分割的操作,要么完全执行成功,要么完全不执行。

原子操作的执行过程中不允许有任何中断,如果出现了中断,那么操作的结果就无法保证。

原子操作通常用于多线程编程中,保证多个线程之间的并发执行不会出现数据竞争等问题。

在实现原子操作时,通常使用硬件指令或者操作系统提供的原子操作函数来保证操作的原子性。

在应用层面,原子操作可以用于实现一些高级的同步和并非控制。例如,在多线程编程中,如果多个线程都需要访问同一个共享变量,为了避免数据竞争问题,可以使用原子操作来保证对该变量的操作是原子的。

movl i, %eax //内存访问,读取i变量到CPU的eax寄存器
add $1, %exa //修改寄存器的值
movl %eax, i //把寄存器中的值写回内存

i++操作在编译后会被编译成三条指令,所以这三条指令之间是可能被系统调度、中断等事件打断的,因而我们在一些场景就需要一气呵成完成上述操作,原子操作就具备这样的能力。

原子操作的优点

RT-Thread中我们可以采取开关全局中断,调度器上锁等方式对临界区资源进行保护,其它OS也会提供类似操作。
若采用原子操作后,我们可以提高临界区代码的执行效率,大幅提升系统的运行效率,同时也会在一定程度上降低编程的复杂度,下文是一个简单变量自增的示例:

采用开关全局中断的方式实现

int a = 5;
level = rt_hw_interrupt_disable();
a++;
rt_hw_interrupt_enable(level);

采用原子操作API

int a = 5;
rt_atomatic_add($a,1);

显然采用了原子操作的方式更加简单一些,且避免了开关全局中断带来的性能损失。

RT-Thread原子操作的实现与使用方法

RT-Thread对32-bit的ARM、32-bit的RISC-V与64-bit的RISC-V中支持原子操作的内核提供了原子操作支持,使用对应平台的原子操作指令与相关指令实现,默认支持,无需用户关心实现,用户使用时仅需在工程包含rtatomatic.h即可使用该文件提供的原子操作API。

在这里插入图片描述

RT-Thread 原子操作 API

  1. rt_atomic_t rt_hw_atomic_load(volatile rt_atomic_t *ptr),原子的从 ptr 地址加载一个字
  2. void rt_atomic_store(volatile rt_atomic_t *ptr, rt_atomic_t val),原子的将 val 写入 ptr 地址
  3. rt_atomic_t rt_atomic_exchange(volatile rt_atomic_t *ptr, rt_atomic_t val),原子的将 ptr 地址处的值替换为 val
  4. rt_atomic_t rt_atomic_add(volatile rt_atomic_t *ptr, rt_atomic_t val),原子的将 ptr 地址处的值与 val 相加
  5. rt_atomic_t rt_atomic_sub(volatile rt_atomic_t *ptr, rt_atomic_t val),原子的将 ptr 地址处的值与 val 相减
  6. rt_atomic_t rt_atomic_xor(volatile rt_atomic_t *ptr, rt_atomic_t val),原子的将 ptr 地址处的值与 val 按位异或
  7. rt_atomic_t rt_atomic_and(volatile rt_atomic_t *ptr, rt_atomic_t val),原子的将 ptr 地址处的值与 val 按位与
  8. rt_atomic_t rt_atomic_or(volatile rt_atomic_t *ptr, rt_atomic_t val),原子的将 ptr 地址处的值与 val 按位或
  9. rt_atomic_t rt_atomic_flag_test_and_set(volatile rt_atomic_t *ptr),原子的将 ptr 地址处的值置 1
  10. void rt_atomic_flag_clear(volatile rt_atomic_t *ptr),原子的将 ptr 地址处的值清 0
  11. rt_atomic_t rt_atomic_compare_exchange_strong(volatile rt_atomic_t *ptr, rt_atomic_t *old, rt_atomic_t new),原子的将 ptr 地址处的值与 val 进行比较与交换,并返回比较结果

http://www.niftyadmin.cn/n/4997923.html

相关文章

软件总体部署:Total Software Deployment Crack

TNI 6.1:数据传输模式的新界面和功能 根据您向支持团队提供的反馈,我们对“数据传输”窗口的机制和界面进行了重大重新设计。 概述 远程和自动化软件部署 全面软件部署:企业网络的托管软件部署。 远程和自动化软件部署 Total Software Deplo…

Windows 操作系统下 Python 及其模块的管理

Python 是一款解释型语言,理论上一个.py文件可以当成一个稍微复杂一些的字符串指令集本文不涉及jupyter,VS,VScode,Pycharm 等集成开发环境,这不是我们这篇文章所关心的东西 这篇文章面向的是Python 的初学者 最近没有写太多长文章,多写几篇&…

COSCon'23 开源市集:共赴一场草坪上的开源派对

一年一度的开源盛会,第八届中国开源年会(COSCon23 ),将于10月28~29日,在四川成都市高新区菁蓉汇召开!本次大会的主题是:“开源:川流不息、山海相映”! 我们预期会有超过1…

机器学习——线性回归/岭回归/Lasso回归

0、前言: 线性回归会用到python第三方库:sklearn.linear_model中的LinearRegression导入第三方库的方法:from sklearn.linear_model import LinearRegression使用LinearRegression(二维数据,一维数据)进行预测,其中数…

腾讯云免费SSL证书申请流程_每年免费50个HTTPS证书

2023腾讯云免费SSL证书申请流程,一个腾讯云账号可以申请50张免费SSL证书,免费SSL证书为DV证书,仅支持单一域名,申请腾讯云免费SSL证书3分钟即可申请成功,免费SSL证书品牌为TrustAsia亚洲诚信,腾讯云百科分享…

七、Linux中一些符号的含义和宿主目录的介绍

1、Linux中一些符号的含义 在Linux命令行中,会看到如下一些符号,含义如下。 符号含义. 代表当前目录..代表上一层目录,当前目录的父目录-代表前一个目录,刚才从哪个目录cd过来~代表当前用户的宿主目录/代表根目录$普通用户的命…

linux rpm 离线安装 nginx 自用,仅供参考

检查是否安装nginx ps -ef|grep nginx 检查rpm是否安装nginx rpm -qa|grep nginx 查看linux centos 发行版本 cat /etc/centos-release (查看其它发现版本 就把centos替换为别的 比如 红旗的 redflag ) 查看cpu信息 x86_64 lscpu 检查nginx所需依赖 …

HDFS文件的读写流程

Hadoop HDFS的读写文件流程 HDFS写文件流程 客户端通过Distributed FileSystem模块向NameNode请求上传文件(hadoop fs -put 文件名 文件路径 ) 判断该客户端是否有写入权限NameNode检查目标文件是否已存在,父目录是否存在。 NameNode返回是…