RT-Thread 原子操作(学习)

原子操作简介

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

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

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

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

在应用层面,原子操作可以用于实现一些高级的同步和并发控制机制。

例如,在多线程编程中,如果多个线程都需要访问同一个共享变量,为了避免数据竞争问题,可以使用原子操作来保证堆该变量的操作是原子的。

以ARM内核执行一个i++操作为例:

movl i, %eax  //内存访问,读取i变量到cpu的eax寄存器
addl $1, %eax //修改寄存器的值
movl %eax, i //将寄存器中的值写回内存

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

原子操作的优点

在RT-Thread中,我们采取开关全局中断,调度器上锁等方式对临界区资源进行保护,其它OS也会提供类似的操作。

若采用原子操作后我们可以提供临界区代码的执行效率,大幅提升系统的运行效率,同时也会在一定程度上降低编程的复杂度。

//采用开关全局中断的方式实现对临界区的保护
int a = 5;
level = rt_hw_interrupt_disable();
a++;
rt_hw_interrupt_enable(level);
//采用RT-Thread提供的原子操作API
int a = 5;
rt_atomic_add(&a,1);

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

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

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

原子读

rt_atomic_t rt_atomic_load(volatile rt_atomic_t *ptr);

使用原子操作方式从ptr地址指向的4字节空间加载一个字。

原子写

void rt_atomic_store(volatile rt_atomic_t *ptr, rt_atomic_t val);

该操作函数的语义为:使用原子操作方式将val写入ptr地址指向的4字节空间。

原子数据交换

rt_atomic_t rt_atomic_exchange(volatile rt_atomic_t *ptr, rt_atomic_t val);

该操作函数的语义为:使用原子操作方式将ptr地址指向的4字节空间的数据交换为val,返回ptr地址处修改前的4字节数据。

原子加

rt_atomic_t rt_atomic_add(volatile rt_atomic_t *ptr, rt_atomic_t val);

使用原子操作方式将 ptr 地址指向的 4 字节数据与 val 相加,将结果写入 ptr 地址指向的 4 字节空间,返回 ptr 地址处修改前的 4 字节数据。

原子减

rt_atomic_t rt_atomic_sub(volatile rt_atomic_t *ptr, rt_atomic_t val);

该操作函数的语义为:使用原子操作方式将 ptr 地址指向的 4 字节数据减去 val,将结果写入 ptr 地址指向的 4 字节空间,返回 ptr 地址处修改前的 4 字节数据。

原子标志检查与置位

rt_atomic_t rt_atomic_flag_test_and_set(volatile rt_atomic_t *ptr);

对ptr地址指向的4字节原子标志进行设置,并返回该原子标志对象做设置操作之前的值。
若ptr地址指向的4字节数据之前状态为0,那么经过此操作之后,该原子标志对象的状态变为了状态1,并且返回0。
如果ptr地址指向的4字节数据之前为状态1,那么经过此操作之后,它仍然为状态1,并且返回1。

所以若我们将原子标志对象作为一个“锁来用的话,可判断这个函数接口的返回值,若返回0,则说明锁成功,可以对多线程共享对象做相关的修改操作;如果返回的状态是1,则该原子标志已经被其它线程占用,需要等待释放。

原子标志清除

void rt_atomic_flag_clear(volatile rt_atomic_t *ptr);

该操作函数的语义为:清除标志,将标志清 0,对 ptr 地址指向原子标志进行清零操作。如果我们将原子标志对象用作“锁”的话,那么执行此操作就相当于释放锁。

原子比较与交换

rt_atomic_t rt_atomic_compare_exchange_strong(volatile *ptr,rt_atomic_t *old, rt_atomic_t new);

第一个参数指向原子类型对象,第二个参数指向要进行比较的对象,并且如果比较失败,那么该操作会将原子对象的当前值拷贝到该参数所指向的对象中;第三个参数指定存储到原子对象中的值。 如果比较成功,那么 new 值会被存放到原子对象中,并且返回 1;如果比较失败,那么当前原子对象的值会被拷贝到 old 所指向的对象中,并且返回 0。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/102277.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

webservice接口自动化测试

1&#xff0c;用soupui进行测试 2&#xff0c;安装soupUI 3&#xff0c;测试的时候是给了一个wdsl 操作步诹&#xff1a;new &#xff08;name , 填写地址&#xff09;---导入wsdl文件---看到所有的接口 发送请求的格式<xml> canshu</xml> 应用场景&#xff0c…

hutool实现文件上传与下载

<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version></dependency> 文件上传需要创建一个表 Autowiredprivate SysFileInfoMapper sysFileInfoMapper;Value("${ty.…

常用的语音芯片工作原理_分类为语音播报 语音识别 语音合成tts

1.0 语音芯片分类-语音播报-语音识别-语音合成 关于声音的需求&#xff0c;从始至终&#xff0c;都是很刚需的需求 。从语音芯片的演化就能看出很多的端倪&#xff0c;很多很多的产品他必须要有语音&#xff0c;才能实现更好的交互。而语音芯片的需求分类&#xff0c;其实也是很…

3D模型格式转换工具HOOPS Exchange:模型数据自由导入和导出

HOOPS Exchange是一套高性能软件库&#xff0c;可以为软件开发人员提供导入和导出3D文件格式的能力。HOOPS Exchange导入3D数据后&#xff0c;会将3D数据转换为PRC格式存放到内存中&#xff0c;最后导出成为其他3D格式。&#xff08;点击申请HOOPS Exchange免费试用&#xff09…

人大金仓数据库V8 windows下安装

此文为人大金仓数据库安装程序&#xff08;windows下kingbase开发及测试用&#xff09;。 1 人大金仓-成为世界卓越的数据库产品与服务提供商 官方下载安装包&#xff0c;同时需要下载授权文件&#xff0c;补丁文件可以不下。 2 点击安装 3 选择授权文件 4 默认安装即可&…

Docker 容器应急

容器网络简单理解 容器拥有n多张veth网卡与一张docker0网卡 docker 五种网络 bridge 默认网络&#xff0c;Docker启动后创建一个docker0网桥&#xff0c;默认创建的容器也是添加到这个网桥中。host 容器不会获得一个独立的network namespace&#xff0c;而是与宿主机共用一个…

统一机器人描述格式——URDF

URDF&#xff08;Unified Robot Description Format&#xff0c;统一机器人描述格式&#xff09;是ROS中一个非常重要的机器人模型描述格式&#xff0c;ROS同时也提供URDF文件的C解析器&#xff0c;可以解析URDF文件中使用XML格式描述的机器人模型。 在使用URDF文件构建机器人模…

【LeetCode力扣】75 快速排序的子过程partition(荷兰国旗问题)

目录 1、题目介绍 2、解题思路 2.1、冒泡排序暴力破解 2.2、快速排序的子过程partition 2.2.1、详细过程描述 2.2.2、代码描述 1、题目介绍 原题链接&#xff1a;75. 颜色分类 - 力扣&#xff08;LeetCode&#xff09; 示例 1&#xff1a; 输入&#xff1a;nums [2,0,2…

【Python深度学习】目标检测和语义分割的区别

在计算机视觉领域&#xff0c;语义分割和目标检测是两个关键的任务&#xff0c;它们都是对图像和视频进行分析&#xff0c;但它们之间存在着明显的区别。本文将通过图像示例&#xff0c;详细阐述语义分割和目标检测之间的差异。 一、基本概念 1.1 语义分割&#xff08;Semantic…

spring boot面试50问

目录 前言&#xff1a; 1. 什么是 Spring Boot&#xff1f; 2. 为什么要用SpringBoot&#xff1f; 3. SpringBoot与SpringCloud 区别&#xff1f; 4. Spring Boot 有哪些优点&#xff1f; 5. Spring Boot 的核心注解是哪个&#xff1f;它主要由哪几个注解组成的&#xff1…

升级MacOS后无法打开 Parallels Desktop,提示“要完成 Parallels Desktop 设置,请重新启动 Mac 。”

有用户升级macOS后&#xff0c;发现无法打开PD虚拟机了&#xff0c;提示“要完成 Parallels Desktop 设置&#xff0c;请重新启动 Mac 。”但是重启电脑之后&#xff0c;尝试了卸载重装&#xff0c;安装新版本&#xff0c;都无法解决问题&#xff0c;打开依旧如此提示&#xff…

C#关于接口的常见面试问题

1.1 关于C#接口的问题以及与抽象类的异同 什么是接口 继承有几种形式 为什么要使用接口&#xff1f; 接口类型可以用public关键字修饰吗&#xff1f; 接口能不能派生于抽象类&#xff1f; 接口能不能用Sealed修饰&#xff1f; 一个类可以继承多个接口吗&#xff1f; 必…

linux上storcli工具安装及使用

StorCLI即Storage Command Line Tool 是LSI公司开发的RAID卡命令行管理工具。主要用于服务器内部RAID管理。 安装storcli前&#xff0c;服务器本地硬盘故障更换过程中&#xff0c;在message中只有如下2行日志&#xff0c;无法得到详细信息 # dmidecode |grep Product Pr…

TSINGSEE青犀视频AI分析/边缘计算/AI算法·厨师帽检测功能——多场景高效运用

在餐饮厂房等场景中&#xff0c;为保障食品安全与卫生&#xff0c;后厨操作人员规范着装要求是必不可少的。由于后厨温度较高&#xff0c;环境较为恶劣&#xff0c;很多后厨人员为自身方便不按照规定佩戴厨师帽和着厨师服&#xff0c;为切实解决此问题&#xff0c;TSINGSEE青犀…

【FreeRTOS】【STM32】03 FreeRTOSConfig.h头文件简介与修改

基于[野火]《FreeRTOS%20内核实现与应用开发实战—基于STM32》.pdf FreeRTOSConfig.h头文件是FreeRTOS各项功能的打开与关闭 FreeRTOSConfig.h头文件简介 之前也说过了&#xff0c;FreeRTOSConfig.h文件可以添加在工程中任意文件夹&#xff0c;只需要在路径中添加好了就行。…

【C++初阶】前言——C++的发展简述及学习方法分享

主页点击直达&#xff1a;个人主页 我的小仓库&#xff1a;代码仓库 C语言偷着笑&#xff1a;C语言专栏 数据结构挨打小记&#xff1a;初阶数据结构专栏 Linux被操作记&#xff1a;Linux专栏 LeetCode刷题掉发记&#xff1a;LeetCode刷题 算法&#xff1a;算法专栏 C头…

取消加考!自考专业调整,2026年起执行新计划!

就在2023年10月7日&#xff0c;广东省教育考试院发布《关于广东省高等教育自学考试专业调整有关事项的通知》&#xff0c;自学考试迎来新变化&#xff0c;本次专业调整政策性强&#xff0c;涉及面广&#xff0c;持续时间长&#xff0c;一起来看看具体说明~ 关于广东省高等教育自…

【码银送书第八期】《Python数据挖掘:入门进阶与实用案例分析》

摘要&#xff1a;本案例将主要结合自动售货机的实际情况&#xff0c;对销售的历史数据进行处理&#xff0c;利用pyecharts库、Matplotlib库进行可视化分析&#xff0c;并对未来4周商品的销售额进行预测&#xff0c;从而为企业制定相应的自动售货机市场需求分析及销售建议提供参…

Spring MVC 五:DispatcherServlet初始化之 mvc:annotation-driven

通过xml方式初始化DispatcherServlet时&#xff0c;xml文件中可以配置&#xff1a; <mvc:annotation-driven />或&#xff1a; <mvc:annotation-driven ><!--设置响应输出字符集--><mvc:message-converters><bean class"org.springframework.…

模拟大数相加

字符串的大数相加&#xff0c;不可以直接使用stoi&#xff0c;或者stoll这种函数去相加&#xff0c;随时有可能越界。只需要模拟计算加法的过程就可以了。 1.定义两个尾指针&#xff0c;指向num1,nums2的最后一个数字&#xff0c;让这两个数字相加&#xff0c;并把相加的结果记…