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

蓝桥杯嵌入式第十五届

一、底层

        根据它的硬件配置可以看出来这套题目使用到了按键、LED、LCD、输入捕获这几个功能

(1)输入捕获功能

首先在CubeMx里面的配置

        题目中说到了我们使用的是PA15和PB4(实际在板子上对应的的是R39和R40),所以我们的CubeMx配置,首先我们要打开PA15和PB4的TIM,因此我们开的是TM2_CH1,TIM3_CH1。同时我们还开了内部时钟,选取了输入捕获的直接模式,把预分频系数设置为80-1,把ARR自动重装载值设置为65535(这个很重要)。最后别忘了开中断!!!输入捕获和按键的定时器是需要开中断的,如果是单纯的定时器设置是不需要开中断的。

        不要忘了时钟树的配置是24和80

再就是我们的初始化

        我们在main.c里面的初始化要开一下输入捕获的中断

HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1);
 最后重要的是我们要记得写好底层

        只要是开了定时器,那我们就需要写htim->Instance==TIM2
        对于输入捕获,我们首先要在5933找到相应的函数
        然后我们就要写htim->Instance==TIM2;
        里面的框架就是,我们要先开启输入捕获中断的通道
        然后我们要接收捕获到的值HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);
        同时我们要用一个int形的数据去接收它                TA=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);
        这个时候千万别忘记把计数值清零__HAL_TIM_SetCounter(htim,0);
        最后别忘了计算一下频率值:FA=(80000000/80)/TA;

int TA,FA,TB,FB;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{if(hitim->Instance=TIM2){HAL_TIM_IC_Start_IT(htim,TIM_CHANNEL_1);TA=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);__HAL_TIM_SetCounter(htim,0);FA=(80000000/80)/TA;}if(htim->Instance==TIM3){HAL_TIM_IC_Start_IT(htim,TIM_CHANNEL_1);TB=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);__HAL_TIM_SetCounter(htim,0);FB=(80000000/80-1)/TB;}
}

 (2)按键底层

        首先需要在tim.c的5933找到这个函数名字,然后需要写一个找到定时器的函数if(htim->Instance==TIM4)//只要有定时器,就别忘了写选定时器这一步,输入捕获也是同样。然后开始读取GPIO的值,后面就是for循环,注意一定要写for(int i=0;i<4;i++)别写错了,然后再写switch case。里面的步骤就是,首先就是判断按键是否按下,然后就是跳转1,2这个跳转的数据千万不要写错了。在第0步的时候,除了要判断按键是否按下之外,还要把时间计时为0。第一步就是判断案件是否再次按下,如果再次按下就跳转到第2步。首先是判断按下是否松开,如果松开,就跳转到第0步,同时判断是否为短按键,如果是短按键,那么标志位置1,一定要记住这里是标志位置1,后面的按键逻辑就要这样写,不然把标志位的1和0写错的话,后面就实现不了相应的功能。如果没有松开,就一直计时,判断是否为长按键,如果是长按键那么标志位置1。        

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIM4){key[0].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);key[1].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);key[2].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);key[3].key_sta=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);for(int i=0;i<4;i++){switch (key[i].jungle_sta){case 0:{if(key[i].key_sta==0){key[i].jungle_sta=1;key[i].key_time=0;}}break;case 1:{if(key[i].key_sta==0){key[i].jungle_sta=2;}else{key[i].jungle_sta=0;}}break;case 2:{if(key[i].key_sta==1){key[i].jungle_sta=0;if(key[i].key_time<100){key[i].short_flag=1;}}else{key[i].key_time++;if(key[i].key_time>100){key[i].long_flag=1;}}}break;}}}
}

二、逻辑部分

        这里有一个要注意的点就是使用到了浮点型。首先我们的代码要写A=%.2f,后面就需要写A,那么这个A的值A=(float)FA/1000;前面加的(float)就是把FA/1000这个值转化为小数 

        还有一个很重要的逻辑功能就是,首先你要判断是在哪个界面,在哪个界面实现怎样的逻辑。比如题目中就有在第一个界面下按键B3实现周期和频率的切换。参数选择都是在按键里面写下的逻辑para++。if(para==0)PH=PH+100;这样子来写来实现选择参数并且增加数值

        还有就是 看看长按键的时间是多少秒。千万不要把按键的标志位写错了,短按键按下的标志位是1,不按下是0。还可以在切换界面的下面直接写LCD_Clear();这样能够实现清屏的功能。

三、测评

        15.2文件已经提交至4T,除了频率超限没有完成,其他都完成了,静候测评成绩。

相关文章:

蓝桥杯嵌入式第十五届

一、底层 根据它的硬件配置可以看出来这套题目使用到了按键、LED、LCD、输入捕获这几个功能 &#xff08;1&#xff09;输入捕获功能 首先在CubeMx里面的配置 题目中说到了我们使用的是PA15和PB4&#xff08;实际在板子上对应的的是R39和R40&#xff09;&#xff0c;所以我们…...

基于ueditor编辑器的功能开发之给编辑器图片增加水印功能

用户需求&#xff0c;双击编辑器中的图片的时候&#xff0c;出现弹框&#xff0c;用户可以选择水印缩放倍数、距离以及水印所放置的方位&#xff08;当然有很多水印插件&#xff0c;位置大小透明度用户都能够自定义&#xff0c;但是用户需求如此&#xff0c;就自己写了&#xf…...

DDR中的DLL

在DDR4内存系统中&#xff0c;DLL&#xff08;Delay Locked Loop&#xff0c;延迟锁相环&#xff09;是一个非常重要的组件&#xff0c;用于确保数据信号&#xff08;DQS&#xff09;和时钟信号&#xff08;CK&#xff09;之间的同步。以下是DLL的作用以及DLL on和DLL off的影响…...

Python学习之jieba

Python学习之jieba jieba是优秀的中文分词第三方库,由于中文文本之间每个汉字都是连续书写的,我们需要通过特定的手段来获得其中的每个词组,这种手段叫做分词,我们可以通过jieba库来完成这个过程。jieba库的分词原理:利用一个中文词库,确定汉字之间的关联频率,汉字向概率大的组…...

快速幂fast_pow

快速幂算法讲解 快速幂算法是一种高效计算幂运算的算法&#xff0c;其核心思想是利用指数的二进制分解&#xff0c;把幂运算的时间复杂度从 O(p) 降低到 O(logp)。 原理 假设要计算 an&#xff0c;将 n 表示成二进制形式&#xff1a;n2k1​2k2​⋯2km​&#xff0c;那么 ana…...

Go并发背后的双引擎:CSP通信模型与GMP调度|Go语言进阶(4)

为什么需要理解CSP与GMP&#xff1f; 当我们启动一个Go程序时&#xff0c;可能会创建成千上万个goroutine&#xff0c;它们是如何被调度到有限的CPU核心上的&#xff1f;为什么Go能够如此轻松地处理高并发场景&#xff1f;为什么有时候我们的并发程序会出现奇怪的性能瓶颈&…...

42、JavaEE高级主题:WebSocket详解

WebSocket 一、WebSocket协议与实现 WebSocket是一种基于TCP协议的全双工通信协议&#xff0c;能够在客户端和服务器之间建立实时、双向的通信通道。通过WebSocket&#xff0c;客户端和服务器可以在任何时候发送数据&#xff0c;并立即接收到对方的响应。 1.1 WebSocket协议…...

UGUI源代码之Text—实现自定义的字间距属性

以下内容是根据Unity 2020.1.01f版本进行编写的 UGUI源代码之Text—实现自定义的字间距属性 1、目的2、参考3、代码阅读4、准备修改UGUI源代码5、实现自定义Text组件&#xff0c;增加字间距属性6、最终效果 1、目的 很多时候&#xff0c;美术在设计的时候是想要使用文本的字间…...

【AI】MCP概念

一文讲透 MCP&#xff08;附 Apifox MCP Server 内测邀请&#xff09; 7分钟讲清楚MCP是什么&#xff1f;统一Function calling规范&#xff0c;工作量锐减至1/6&#xff0c;人人手搓Manus&#xff01;&#xff1f; | 一键链接千台服务器&#xff0c;几行代码接入海量外部工具…...

HarmonyOS:使用geoLocationManager (位置服务)获取位置信息

一、简介 位置服务提供GNSS定位、网络定位&#xff08;蜂窝基站、WLAN、蓝牙定位技术&#xff09;、地理编码、逆地理编码、国家码和地理围栏等基本功能。 使用位置服务时请打开设备“位置”开关。如果“位置”开关关闭并且代码未设置捕获异常&#xff0c;可能导致应用异常。 …...

深入解析原生鸿蒙中的 RN 日志系统:从入门到精通!

全文目录&#xff1a; 开篇语&#x1f4d6; 目录&#x1f3af; 前言&#xff1a;鸿蒙日志系统究竟有多重要&#xff1f;&#x1f6e0;️ 鸿蒙 RN 日志系统的基础结构&#x1f4dc; 1. 日志的作用⚙️ 2. 日志分类 &#x1f527; 如何在鸿蒙 RN 中使用日志系统&#x1f58b;️ 1…...

【前端】【Nuxt3】Nuxt3中usefetch,useAsyncData,$fetch使用与区别

一、Nuxt3 中不同数据获取方式的请求行为对比 &#xff08;一&#xff09;总结&#xff1a;请求行为一览 useFetch 和 useAsyncData 是 Nuxt 推荐的数据获取 API&#xff0c;自动集成 SSR 与客户端导航流程。$fetch 是更底层的请求方法&#xff0c;不具备自动触发、缓存等集成…...

【Linux系统】Linux基础指令

l i n u x linux linux 命令是对 L i n u x Linux Linux 系统进行管理的命令。对于 L i n u x Linux Linux 系统来说&#xff0c;无论是中央处理器、内存、磁盘驱动器、键盘、鼠标&#xff0c;还是用户等都是文件&#xff0c; L i n u x Linux Linux 系统管理的命令是它正常运…...

Android中Jetpack设计理念、核心组件 和 实际价值

一、Jetpack 的定义与定位&#xff08;基础必答&#xff09; Jetpack 是 Google 推出的 Android 开发组件集合&#xff0c;旨在&#xff1a; 加速开发&#xff1a;提供标准化、开箱即用的组件 消除样板代码&#xff1a;解决传统开发中的重复劳动问题 兼容性保障&#xff1a;…...

flutter开发音乐APP(前提准备)

1、项目的一些环境&#xff1a; 2、接口文档&#xff1a; 酷狗音乐 NodeJS 版 API 3、接口数据结构化 Instantly parse JSON in any language | quicktype UI样式借鉴参考&#xff1a; Coffee-Expert/Apple-Music-New-UI: Apple Music Clone on Flutter, with redesigned UI…...

网络协议学习

最近在适配ESP32的网络驱动&#xff0c;借此机会先学习一下网络通信协议。 以太网帧、IP包及TCP与UDP的报文格式 提问腾讯元宝提示词&#xff1a; TCP窗口是干什么的拥塞窗口是什么的...

示波器直流耦合与交流耦合:何时使用哪种?

直流耦合和交流耦合的基本区别应该在于它们如何处理信号的直流分量和交流分量。直流分量是指信号中的固定电压部分&#xff0c;而交流分量则是信号中变化的电压部分。 例如&#xff0c;一个5V的直流电压叠加了一个1V的正弦波交流信号&#xff0c;整个信号会在4V到6V之间波动。如…...

js解除禁止复制、禁止鼠标右键效果

有的网页会禁止复制&#xff0c;甚至禁止鼠标右键&#xff0c;如何解决 按F12进入检查模式&#xff0c;在控制台输入下面的js代码 1.解除禁止复制 document.addEventListener(copy,function(event){event.stopImmediatePropagation();},true); 2.解除禁止鼠标右键 document…...

如何把未量化的 70B 大模型加载到笔记本电脑上运行?

并行运行 70B 大模型 我们已经看到&#xff0c;量化已经成为在低端 GPU&#xff08;比如 Colab、Kaggle 等&#xff09;上加载大型语言模型&#xff08;LLMs&#xff09;的最常见方法了&#xff0c;但这会降低准确性并增加幻觉现象。 那如果你和你的朋友们把一个大型语言模型分…...

xwiki的权限-页面特殊设置>用户权限>组权限

官方文档https://www.xwiki.org/xwiki/bin/view/Documentation/AdminGuide/Access%20Rights/ 他有组权限、用户权限、页面及子页面特别设置。 页面特殊设置 > 用户权限 > 组权限 XWiki提供了设置wiki范围内权限、细粒度页面级权限的能力&#xff0c;以及在需要更多控制的…...

Go语言比较递归和循环执行效率

一、概念 1.递归 递归是指一个函数在其定义中直接或间接调用自身的编程方法 。简单来说&#xff0c;就是函数自己调用自己。递归主要用于将复杂的问题分解为较小的、相同类型的子问题&#xff0c;通过不断缩小问题的规模&#xff0c;直到遇到一个最简单、最基础的情况&#x…...

Windows 图形显示驱动开发-WDDM 2.0功能_供应和回收更改

供应和回收更改 对于 Windows 显示驱动程序模型 (WDDM) v2&#xff0c;有关 套餐 和 回收 的要求正在放宽。 用户模式驱动程序不再需要在内部分配上使用套餐和回收。 空闲/挂起的应用程序将使用 Microsoft DirectX 11.1 中引入的 TrimAPI 删除驱动程序内部资源。 API 级别将继…...

MongoDB 新手笔记

MongoDB 新手笔记 1. MongoDB 1.1 概述 MongoDB 是一种 文档型数据库&#xff08;NoSQL&#xff09;&#xff0c;数据以类似 JSON 的 BSON 格式存储&#xff0c;适合处理非结构化或半结构化数据。 对比 MySQL&#xff1a; MySQL 是关系型数据库&#xff0c;数据以表格形式存…...

Pytorch查看神经网络结构和参数量

基本方法 print(model) print(type(model))# 模型参数 numEl_list [p.numel() for p in model.parameters()] total_params_mb sum(numEl_list) / 1e6print(fTotal parameters: {total_params_mb:.2f} MB) # sum(numEl_list), numEl_list print(sum(numEl_list)) print(numE…...

Pytorch Dataset问题解决:数据集读取报错DatasetGenerationError或OSError

问题描述 在huggingface上下载很大的数据集&#xff0c;用多个parquet文件的格式下载到本地。使用load_dataset加载的时候&#xff0c;进度条加载到一半会报错DatasetGenerationError: An error occurred while generating the dataset&#xff1b;如果加载为IterableDataset&…...

学习OpenCV C++版

OpenCV C 1 数据载入、显示与保存1.1 概念1.2 Mat 类构造与赋值1.3 Mat 类的赋值1.4 Mat 类支持的运算1.5 图像的读取与显示1.6 视频加载与摄像头调用1.7 数据保存 参考&#xff1a;《OpenCV4快速入门》作者冯 振 郭延宁 吕跃勇 1 数据载入、显示与保存 1.1 概念 Mat 类 : Ma…...

特权FPGA之PS/2键盘解码

0 故事背景 见过这种接口的朋友们&#xff0c;大概都已经成家立业了吧。不过今天我们不讨论这种接口的历史&#xff0c;只讲讲这种接口的设计。&#xff08;如果还没有成家的朋友也别生气&#xff0c;做自己想做的事情就对了&#xff01;&#xff09; 1 时序分析 数据帧格式如图…...

SpringBoot 接口限流Lua脚本接合Redis 服务熔断 自定义注解 接口保护

介绍 Spring Boot 接口限流是防止接口被频繁请求而导致服务器负载过重或服务崩溃的一种策略。通过限流&#xff0c;我们可以控制单位时间内允许的请求次数&#xff0c;确保系统的稳定性。限流可以帮助防止恶意请求、保护系统资源&#xff0c;并优化 API 的可用性&#xff0c;避…...

FPAG_BUFFER学习

在FPGA设计中&#xff0c;缓冲器&#xff08;Buffer&#xff09;是信号传输和管理的核心组件&#xff0c;用于处理输入/输出信号、时钟分配以及信号完整性。以下是FPGA中常见缓冲器的详细介绍&#xff0c;分类说明其功能、应用场景和设计注意事项&#xff1a; --- ### **1. 输…...

《认知觉醒》下篇·第六章第一节“清晰:一个观念,重构你的行动力” 总结

《认知觉醒》下篇第六章第一节“清晰&#xff1a;一个观念&#xff0c;重构你的行动力”的核心内容总结&#xff1a; 1. 清晰的力量&#xff1a;行动力的第一性原理 定义 清晰是对目标、路径和结果的明确认知&#xff0c;是破除拖延与内耗的核心前提。 模糊的代价&#xff1a; …...

idea手动创建resources文件夹

有时maven没有构建成功可能造成&#xff0c;resources文件夹不创建的现象 此时我们可以手动创建 手动创建...

Scala相关知识学习总结6

1、集合计算高级函数说明 - 过滤&#xff1a;遍历集合&#xff0c;提取满足特定条件的元素组成新集合。 - 转化/映射&#xff08;map&#xff09;&#xff1a;将集合里的每个元素应用到指定函数进行转换。 - 扁平化&#xff1a;文档未详细阐述其具体含义和操作。 - 扁平化映射&…...

IDEA 调用 Generate 生成 Getter/Setter 快捷键

快捷键不会用&#xff1f; 快捷键&#xff1a;AltInsert 全选键&#xff1a;CtrlA IDEA 调用 Generate 生成 Getter/Setter 快捷键 - 爱吃西瓜的番茄酱 - 博客园...

【SpringCloud】从入门到精通(下)

网关与路由 什么是网关&#xff1f;顾明思议&#xff0c;网关就是网络的关口。数据在网络间传输&#xff0c;从一个网络传输到另一网络时就需要经过网关来做数据的路由和转发以及数据安全的校验。 现在前端不能请求各个微服务地址&#xff0c;只能去请求网关 网关可以做安全控…...

深入探索 C++23:特性测试与编译器支持

文章目录 一、C23 新特性概览&#xff08;一&#xff09;语言特性&#xff08;二&#xff09;标准库特性 二、特性测试程序三、主流编译器支持情况&#xff08;一&#xff09;GCC&#xff08;二&#xff09;Clang&#xff08;三&#xff09;MSVC 四、开发者建议&#xff08;一&…...

Electron 应用太重?试试 PakePlus 轻装上阵

Electron 作为将 Web 技术带入桌面应用领域的先驱框架&#xff0c;让无数开发者能够使用熟悉的 HTML、CSS 和 JavaScript 构建跨平台应用。然而&#xff0c;随着应用规模的扩大&#xff0c;Electron 应用的性能问题逐渐显现——内存占用高、启动速度慢、安装包体积庞大&#xf…...

驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接

驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接 原因描述 项目中有使用到 SQL Server 数据库, 在启动项目时, 出现报错信息: 【驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version…...

Java 设计模式:原型模式详解

Java 设计模式&#xff1a;原型模式详解 原型模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;它通过复制现有对象来创建新对象&#xff0c;而无需依赖其具体类。这种模式特别适合创建复杂对象或需要频繁创建相似对象的场景。本文将详细介绍原…...

NLP高频面试题(三十七)——大模型训练和推理的显存估计

在训练和推理大型语言模型时,显存(GPU 内存)的需求是一个关键考虑因素。准确估计这些需求有助于选择合适的硬件配置,确保模型高效运行。 推理阶段的显存需求 在推理过程中,显存主要用于存储模型权重和中间激活值。模型权重的显存需求可以通过以下公式估算: 模型权重…...

PHP 阿里云oss 使用指南

1.介绍 把图片放到阿里云上的空间上&#xff0c;可以使用cdn加速。 可以在程序里直接调用 要使用阿里云 oss sdk &#xff0c;请先到阿里云下载 或用 copmposer 安装 相关链接&#xff1a; 安装OSS PHP SDK_对象存储(OSS)-阿里云帮助中心 composer require aliyuncs/oss…...

leetcode_面试题 02.07. 链表相交_java

面试题 02.07. 链表相交https://leetcode.cn/problems/intersection-of-two-linked-lists-lcci/ 1、题目 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 图示两个链表在节点 c…...

LeetCode 3375.使数组的值全部为 K 的最少操作次数:O(1)空间——排序+一次遍历

【LetMeFly】3375.使数组的值全部为 K 的最少操作次数&#xff1a;O(1)空间——排序一次遍历 力扣题目链接&#xff1a;https://leetcode.cn/problems/minimum-operations-to-make-array-values-equal-to-k/ 给你一个整数数组 nums 和一个整数 k 。 如果一个数组中所有 严格…...

紫光展锐5G SoC T8300:影像升级,「定格」美好世界

影像能力已成为当今衡量智能手机性能的重要标尺之一。随着消费者对手机摄影需求日益提升&#xff0c;手机厂商纷纷在影像硬件和算法上展开激烈竞争&#xff0c;力求为用户带来更加出色的拍摄体验。 紫光展锐专为全球主流用户打造的畅享影音和游戏体验的5G SoC——T8300&#x…...

java基础 关键字static

static static使用简介static结合类的生命周期1.加载2.链接(1) 验证&#xff08;Verification&#xff09;(2) 准备&#xff08;Preparation&#xff09;(3) 解析&#xff08;Resolution&#xff09; 3. 初始化4.使用5.卸载总结 staic作用总结静态变量静态代码块静态方法静态内…...

大数据学习(105)-大数据组件分析

&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一…...

Spark运行

一文读懂Spark&#xff1a;从核心概念到实战编程 在大数据处理领域&#xff0c;Spark凭借其高效的计算能力和灵活的架构脱颖而出。今天&#xff0c;就来和大家深入聊聊Spark&#xff0c;帮助初学者快速入门。Spark采用经典的master - slave结构。Driver如同master&#xff0c;…...

在macOS的docker中如何安装及运行ROS2

1、macOS环境及版本 2、docker for macos版本 3、拉取ROS2镜像 docker pull ros:iron 4、查看容器 docker images 5、启动 ROS2 容器 docker run -it --rm ros:iron -it &#xff1a;以交互模式运行容器。 --rm &#xff1a;退出时自动删除容器&#xff08;测试时推荐&am…...

FFmpeg安装和使用

1. 安装与环境配置 Windows # 方法1&#xff1a;官网下载预编译二进制包 https://ffmpeg.org/download.html#build-windows 解压后添加bin目录到系统PATH# 方法2&#xff1a;通过Chocolatey安装 choco install ffmpegmacOS # 使用Homebrew安装 brew install ffmpegLinux # …...

基于多模态大模型的ATM全周期诊疗技术方案

基于多模态大模型的ATM全周期诊疗技术方案 1. 数据预处理模块 算法1:多模态数据融合伪代码 def multimodal_fusion(data_dict):# 输入:包含MRI、EEG、实验室指标的字典# 输出:对齐后的张量序列# 模态对齐aligned_data = temporal_alignment(data_dict,sampling_rate...

写时复制Copy-on-Write(COW)

简单理解写时复制 读的时候&#xff0c;直接访问原对象。 写的时候&#xff0c;对复制原对象&#xff0c;对副本进行写操作&#xff0c;最后将副本替换原对象。 写时复制多用于读多写少的场景&#xff0c;因为写操作是用悲观锁进行的&#xff0c;如果写的场景多&#xff0c;…...