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 进行比较与交换,并返回比较结果

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker从认识到实践再到底层原理(二-1)|容器技术发展史+虚拟化容器概念和简介

前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…

为什么要学习C++

操作系统历史 UINX操作系统诞生之初是用汇编语言编写的。随着UNIX的发展,汇编语言的开发效率成为一个瓶颈。寻找新的高效开发语言成为UNIX开发者需要解决的问题。当时BCPL语言成为了当时的选择之一。Ken Thomposn对BCPL进行简化得到了B语言。但是B语言不是直接生成…

无涯教程-Android - List fragments函数

框架的ListFragment的静态库支持版本,用于编写在Android 3.0之前的平台上运行的应用程序,在Android 3.0或更高版本上运行时,仍使用此实现。 List fragment 的基本实现是用于创建fragment中的项目列表 List in Fragments 示例 本示例将向您说明如何基于…

【GUI开发】用python爬YouTube博主信息,并开发成exe软件

文章目录 一、背景介绍二、代码讲解2.1 爬虫2.2 tkinter界面2.3 存日志 三、软件演示视频四、说明 一、背景介绍 你好,我是马哥python说,一名10年程序猿。 最近我用python开发了一个GUI桌面软件,目的是爬取相关YouTube博主的各种信息&#…

2.5 关系查询优化

这段话主要讨论了关系模型在数据库领域中的查询优化问题。以下是对这段文字的简要解释: 1. **关系模型的优缺点**:虽然关系模型有许多优点,但它也有一些缺点,最主要的缺点是查询效率。如果没有适当的优化,查询的速度可…

采用ROUANT 方法对 nex-gddp-cmip6 数据进行精度校正

专题一 CMIP6中的模式比较计划 1.1 GCM介绍全球气候模型(Global Climate Model, GCM),也被称为全球环流模型或全球大气模型,是一种用于模拟地球的气候系统的数值模型。这种模型使用一系列的数学公式来描述气候系统的主要组成部分…

C++面试题(丝)-计算机网络部分(1)

目录 1计算机网络 53 简述epoll和select的区别,epoll为什么高效? 54 说说多路IO复用技术有哪些,区别是什么? 55 简述socket中select,epoll的使用场景和区别,epoll水平触发与边缘触发的区别?…

微服务--Gatway:网关

routes: - id:order_route(路由唯一 标识,路由到order) uri:http://localhost:8020 #需要转发的地址 #断言规则(用于路由规则的匹配) predicates: -path/order-serv/** -pathlb://order-service # lb: 使用nacos中的本地…

uni-app之android项目云打包

1,项目根目录,找到mainfest.json,如果appid是空的,需要生成一个appid 2,点击重新获取appid,这个时候需要登录,那就输入账号密码登录下 3,登陆后可以看到获取appid成功 4,…

python类

python是一种面向对象的变成语言。 python几乎所有的东西都是对象,包括对象和属性。 一.类的定义 python类的定义: class ClassName:pass: 实例: 注意: 类中的函数称为方法,有关于函数的一切适用于方法&…

(数字图像处理MATLAB+Python)第十一章图像描述与分析-第一节、二节:图像描述概述和特征点

文章目录 一:图像描述概述(1)图像描述(2)描述子 二:特征点(1)Moravec角点检测A:原理B:程序 (2)Harris角点检测A:原理B&…

Flutter小功能实现-咖啡店

1 导航栏实现 效果图: 1.Package google_nav_bar: ^5.0.6 使用文档: google_nav_bar | Flutter Package 2.Code //MyBottomNavBar class MyBottomNavBar extends StatelessWidget {void Function(int)? onTabChange;MyBottomNavBar({super.key, …

uniapp 支持图片放大

<view class"list" v-for"(item, index) in urls" :key"index"><image :src"item" click"viewImg(item, index)" disabled></image></view> js // 预览大图 viewImg(data, index) {uni.previewImag…

04. 函数和函数调用机制

1. 先学习/复习C语言的入门知识 1.1 C语言简介 C语言是一种通用的编程语言&#xff0c;于1972年由丹尼斯里奇&#xff08;Dennis Ritchie&#xff09;创建。C语言最初目的是为了开发UNIX操作系统&#xff0c;但由于其简洁的语法、快速的执行速度和可移植性&#xff0c;自此成…

3D 碰撞检测

推荐&#xff1a;使用 NSDT场景编辑器快速搭建3D应用场景 轴对齐边界框 与 2D 碰撞检测一样&#xff0c;轴对齐边界框 &#xff08;AABB&#xff09; 是确定两个游戏实体是否重叠的最快算法。这包括将游戏实体包装在一个非旋转&#xff08;因此轴对齐&#xff09;的框中&#…

计算机毕业设计 校园二手交易平台 Vue+SpringBoot+MySQL

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;Java全栈软件工程师一枚&#xff0c;来自浙江宁波&#xff0c;负责开发管理公司OA项目&#xff0c;专注软件前后端开发、系统定制、远程技术指导。CSDN学院、蓝桥云课认证讲师&#xff0c;全栈领域优质创作者。 项目内容…

【C++入门】命名空间、缺省参数、函数重载、引用、内联函数

​&#x1f47b;内容专栏&#xff1a; C/C编程 &#x1f428;本文概括&#xff1a; C入门学习必备语法 &#x1f43c;本文作者&#xff1a; 阿四啊 &#x1f438;发布时间&#xff1a;2023.9.3 前言 C是在C的基础之上&#xff0c;容纳进去了面向对象编程思想&#xff0c;并增加…

Android JNI系列详解之ndk-build工具的使用

一、Android项目中使用ndk-build工具编译库文件 之前介绍过CMake编译工具的使用&#xff0c;今天介绍一种ndk自带的编译工具ndk-build的使用。 ndk-build目前主要有两种配置使用方式&#xff1a; 如上图所示&#xff0c;第一种方式是Android.mkApplication.mkgradle的方式生成…

plumelog介绍与应用-一个简单易用的java分布式日志系统

官方文档&#xff1a;http://www.plumelog.com/zh-cn/docs/FASTSTART.html 简介 无代码入侵的分布式日志系统&#xff0c;基于log4j、log4j2、logback搜集日志&#xff0c;设置链路ID&#xff0c;方便查询关联日志基于elasticsearch作为查询引擎高吞吐&#xff0c;查询效率高全…

UE4/5在蓝图细节面板中添加函数按钮(蓝图与c++的方法)

目录 在细节面板中添加按钮使用函数 蓝图的方法 事件 函数 效果 uec的方法 效果 在细节面板中添加按钮使用函数 很多时候&#xff0c;我们可以看到一些插件的actor类中&#xff0c;点击一下之后就可以实现如矩阵一样的效果。 实际上是因为其使用了函数来修改了蓝图中的数…