当前位置: 首页 > news >正文

读-改-写操作

1 什么是读-改-写操作

“读-改-写”(Read-Modify-Write,简称RMW)是一种常见的操作模式,它通常用于需要更新数据的场景。

这个模式包含三个基本步骤:

  • 1.读(Read):首先读取当前的数据。

  • 2.改(Modify):根据需要对数据进行修改。

  • 3.写(Write):将修改后的数据写回原来的位置。

2 应用领域

"读-改-写"操作是一种基本的数据处理模式,广泛应用于多个领域,以下是一些主要的应用领域:

  • 1.计算机硬件:在硬件设计中,RMW操作常用于对寄存器或内存位置进行位级控制,比如配置I/O端口、设置中断标志等。

  • 2.嵌入式系统:在微控制器(MCU)编程中,RMW操作用于对硬件寄存器进行精确控制,以实现对硬件设备的配置和管理。

  • 3.操作系统:操作系统内核中,RMW操作用于实现对共享资源的同步和互斥控制,例如,使用原子操作来更新计数器或状态标志。

  • 4.数据库管理:在数据库系统中,RMW操作用于事务处理,确保数据的一致性和完整性。例如,更新记录时,数据库引擎会先读取旧值,修改后写回新值。

  • 5.网络通信:在网络协议栈中,RMW操作可能用于更新网络设备的状态或配置,如路由器或交换机的设置。

  • 6.并发编程:在多线程或多进程编程中,RMW操作是实现线程安全的关键技术之一,用于避免竞态条件和数据竞争。

  • 7.图形用户界面(GUI)编程:在GUI开发中,RMW操作可能用于更新界面元素的状态,如按钮的启用/禁用状态。

  • 8.游戏开发:在游戏编程中,RMW操作用于实时更新游戏状态,如玩家的位置、得分等。

  • 9.固件开发:固件是嵌入式系统中的低级软件,RMW操作在固件中用于硬件初始化和配置。

  • 10.文件系统:文件系统中,RMW操作用于更新文件元数据或目录结构,同时保持文件系统的一致性。

  • 11.内存管理:在计算机内存管理中,RMW操作用于更新内存分配表,以跟踪内存使用情况。

  • 12.硬件抽象层(HAL):在硬件抽象层编程中,RMW操作用于与硬件设备进行交互,如配置外设。

  • 13.实时系统:在需要快速响应的实时系统中,RMW操作用于快速更新系统状态,以满足实时性要求。

  • 14.分布式系统:在分布式系统中,RMW操作可能用于同步不同节点的状态,以保持数据的一致性。

RMW操作是确保数据一致性和系统稳定性的关键,无论是在硬件层面还是在软件层面,它都是实现精确控制和同步的基本手段

3 嵌入式系统中的读-改-写

RMW操作在MCU中的一些应用场景:

  • 1.位操作:MCU的寄存器通常具有特定的位用于控制硬件行为。

  • 2.中断标志位:在处理中断时,MCU可能需要清除中断标志位以防止同一中断再次触发。

  • 3.配置寄存器:在初始化MCU时,可能需要配置多个寄存器以设置时钟、电源管理、通信接口等。

  • 4.内存映射的外设:某些外设,如LCD控制器或ADC(模拟数字转换器),可能通过内存映射的方式与MCU交互。

  • 5.临界区保护:在多任务或中断驱动的系统中,保护临界区(critical section)以防止数据竞争或不一致,可能需要使用原子操作或禁用中断来进行RMW操作。

  • 6.位带操作:一些MCU提供了位带操作的指令,这些指令可以直接对内存或寄存器的特定位进行操作,而不需要完整的RMW周期。

3.1 配置寄存器

以配置寄存器为例子,“读-改-写”操作可以分解为以下步骤:

  • 1.先把寄存器读到临时变量里

  • 2.用|=、&=的操作,改变临时变量的指定几位

  • 3.把临时变量写回到寄存器里

// 这是固件库函数中设置窗口看门狗窗口时间的函数,就运用了”读-改-写“操作
void WWDG_SetWindowValue(uint8_t WindowValue)
{__IO uint32_t tmpreg = 0;/* Check the parameters */assert_param(IS_WWDG_WINDOW_VALUE(WindowValue));/* Clear W[6:0] bits *//* 1.把寄存器读到临时变量里 */tmpreg = WWDG->CFR & CFR_W_Mask;/* 2.用|=、&=的操作,改变临时变量的指定几位 *//* Set W[6:0] bits according to WindowValue value */tmpreg |= WindowValue & (uint32_t) BIT_Mask;/* 3.把临时变量写回到寄存器里 *//* Store the new value */WWDG->CFR = tmpreg;
}

优势:

  • 1.可以单独改变寄存器的某几位,而不影响其他位的值

  • 2.如果连续更改多次不同的位,这样操作效率比较高

  • 3.所有更改的位在最终写回到寄存器时同时生效

相关文章:

  • java map对象格式化为json对象
  • 【第二周】基础语法学习
  • 征求意见《第三方运维服务水平评价指南 工业废水处理设施》
  • Unity发布PC限制本地访问exe次数
  • 从单点到全景:视频汇聚/安防监控EasyCVR全景视频监控技术的演进之路
  • 苍穹外卖项目 常用注解 + 动态sql
  • 华为昇腾×实在智能:让国产AI科技实实在在“飞得更高”
  • 游戏AI的创造思路-技术基础-深度学习(5)
  • 【neo4j图数据库】入门实践篇
  • ubuntu server 24.04 使用记录
  • 从二元一次方程组到二阶行列式再到克拉默法则
  • 实现Spring Boot与RabbitMQ消息中间件的无缝集成
  • 广州自闭症机构哪家好
  • 利用STM32的定时器输出PWM方波
  • 10分钟完成微信JSAPI支付对接过程-JAVA后端接口
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • CSS相对定位
  • DataBase in Android
  • Node项目之评分系统(二)- 数据库设计
  • Objective-C 中关联引用的概念
  • PHP那些事儿
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • vue-cli3搭建项目
  • Vue实战(四)登录/注册页的实现
  • web标准化(下)
  • 搭建gitbook 和 访问权限认证
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 高程读书笔记 第六章 面向对象程序设计
  • 离散点最小(凸)包围边界查找
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 前端知识点整理(待续)
  • 优化 Vue 项目编译文件大小
  • 运行时添加log4j2的appender
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • # 达梦数据库知识点
  • #控制台大学课堂点名问题_课堂随机点名
  • #知识分享#笔记#学习方法
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (12)目标检测_SSD基于pytorch搭建代码
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (待修改)PyG安装步骤
  • (多级缓存)多级缓存
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • ..回顾17,展望18
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .NET Core 通过 Ef Core 操作 Mysql
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .net6+aspose.words导出word并转pdf
  • .NET编程C#线程之旅:十种开启线程的方式以及各自使用场景和优缺点