RT-Thread 原子操作

news2025/1/19 14:16:56

原子操作简介

原子操作(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.coloradmin.cn/o/967090.html

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

相关文章

【Linux】多路IO转接问题-select

select: 首先设置一个lfd绑定服务端地址结构,用于监听新的连接。select函数调用,用于对整个fd数组进行监听,该数组最大限制1024,通过遍历,来确定是哪个fd有变化: 1.如果是lfd:那么可…

PriorityQueue介绍

PriorityQueue堆的应用找前k个最小数据(TOPK问题)求k个最小的数优化堆排序 PriorityQueue Java集合框架中提供了PriorityQueue和PriorityBlockingQueue(优先级阻塞队列)两种类型的优先级队列,PriorityQueue是线程不安…

IIS CGI配置和CGI程序FreeBasic, VB6, VC 简单样例

如果说COM和DLL让程序间交互数据变得方便,那CGI这门简单而又古老的技术让网络上数据交互变得方便。虽然古老,但浩瀚的互联网上和世界各地的企业内部,仍有许许多多并发访问量不大的业务在使用这门技术。今天做个回顾,并列出一些例子…

完全平方数

题目链接 完全平方数 题目描述 注意点 返回 和为 n 的完全平方数的最少数量 解答思路 初始想到使用动态规划,后续数字的完全平方数可以由前面数字的完全平方数求得,对于任意数字,可以计算其减去从1…i之间(保证做减操作后的值…

Unity中Shader的面剔除Cull

文章目录 前言一、Unity中Shader的面是否剔除,是由我们自己决定的二、暴露一个属性来控制 剔除模式三、如何区分正反面 前言 Unity中Shader的面剔除 Cull Off | Back | Front 一、Unity中Shader的面是否剔除,是由我们自己决定的 使用 Cull Off | Back |…

深度学习之视频分类项目小记

写在前面,最近一阵在做视频分类相关的工作,趁有时间来记录一下。本文更注重项目实战与落地,而非重点探讨多模/视频模型结构的魔改 零、背景 目标:通过多模态内容理解技术,构建视频层级分类体系原技术方案&#xff1a…

Pyecharts数据可视化(二)

目录 1.绘制散点图 2.绘制饼图 2.1绘制实心饼图 2.2 绘制圆形饼图 2.3 绘制玫瑰图 3.绘制漏斗图 4.绘制仪表盘 5.绘制组合图表 本文主要介绍如何利用Pyecharts来绘制一些常用的可视化图形,比如散点图、饼图、漏斗图等等,具体的绘制方法请见下文。 …

通讯软件014——分分钟学会Matrikon HDA Explorer

本文介绍如何使用Matrikon HDA Explorer工具软件进行OPC HDA通讯调试。相关软件可登录网信智汇(wangxinzhihui.com)下载。 1、连接OPC HDA Server数据源“Kepware.KEPServerEX HAD.V6”。 2、添加标签:右键点击“Kepware.KEPServerEX HAD.V6”…

[管理与领导-66]:IT基层管理者 - 辅助技能 - 4- 职业发展规划 - 乌卡时代(VUCA )的团队管理思维方式的转变

目录 一、乌卡时代人与公司的关系的转变 二、乌卡时代管理方式的转变 三、乌卡时代的管理与传统时代的管理比较 四、乌卡时代管理者的挑战 五、乌卡时代如何做好管理 六、个人能力要求 一、乌卡时代人与公司的关系的转变 在乌卡时代(指虚拟办公、远程工作等数…

3分钟:腾讯云免费SSL证书申请教程_免费HTTPS证书50张

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

一些测试知识

博客主页: https://blog.csdn.net/qq_57785602/category_12023254.html?spm1001.2014.3001.5482https://blog.csdn.net/qq_57785602/category_12023254.html?spm1001.2014.3001.5482 图片网上找的,文章看书或者是平常逛博客看到的,如有侵…

本地部署 Llama2-Code-Interpreter

本地部署 Llama2-Code-Interpreter 1. Llama2-Code-Interpreter 是什么2. Llama2-Code-Interpreter 主要特点3. 部署 Llama2-Code-Interpreter4. 运行 Llama2-Code-Interpreter5. 访问 Llama2-Code-Interpreter 1. Llama2-Code-Interpreter 是什么 该项目允许 LLM 根据整个流程…

设计模式系列-原型模式

一、上篇回顾 上篇创建者模式中,我们主要讲述了创建者的几类实现方案,和创建者模式的应用的场景和特点,创建者模式适合创建复杂的对象,并且这些对象的每 个组成部分的详细创建步骤可以是动态的变化的,但是每个对象的组…

C语言入门 Day_12 一维数组

目录 前言 1.创建一维数组 2.使用一维数组 3.易错点 4.思维导图 前言 存储一个数据的时候我们可以使用变量, 比如这里我们定义一个记录语文考试分数的变量chinese_score,并给它赋值一个浮点数(float)。 float chinese_scoe…

服务器挂机赚钱之Traffmonetizer教程挂机,利用闲置的Vps赚钱

互联网VPS赚钱的项目traffmonetizer挂机,原理就是traffmonetizer通过共享闲置的带宽售卖给平台,然后平台将产生的收益就归你。如果你有闲置的vps服务器都可以通过traffmonetizer挂机赚钱。 VPS赚钱开始注册 实话实说吧,这个就是来拉人头的&…

使用 Python 和 dash 创建仪表板

推荐:使用 NSDT场景编辑器快速搭建3D应用场景 介绍 在数据科学和分析领域,数据的力量不仅通过提取见解来释放,而且还通过有效地传达这些见解来释放;这就是数据可视化发挥作用的地方。 数据可视化是信息和数据的图形表示。它使用图表、图形和…

CC1310开发工具下载及环境搭建

目录 CC1310开发工具集 CC1310SDK下载安装注意事项 CCS下载安装注意事项 导入示例代码 CCS常用设置 CC1310是TI的一款sub1G射频模块,具体参数见数据手册吧(CC1310数据手册、用户手册下载:https://dev.ti.com/tirex/explore/node?nodeA_…

2024年java面试--多线程(2)

系列文章目录 2024年java面试(一)–spring篇2024年java面试(二)–spring篇2024年java面试(三)–spring篇2024年java面试(四)–spring篇2024年java面试–集合篇2024年java面试–redi…

leetcode 189. 轮转数组

2023.9.3 k的取值范围为0~100000,此时需要考虑到两种情况,当k为0时,此时数组不需要轮转,因此直接return返回;当k大于等于数组nums的大小时,数组将会转为原来的数组,然后再接着轮转,此…

Linux系统下的zabbix监控平台(单机安装服务)

目录 一、zabbix的基本概述 二、zabbix构成 1.server 2.web页面 3.数据库 4.proxy 5.Agent 三、监控对象 四、zabbix的日常术语 1.主机(host) 2.主机组(host group) 3.监控项(item) 4.触发器(trigger) 5.事件(event) 6.动作(a…