顶层设计-IM系统架构
一、系统总体架构概览
即时通讯(IM)系统的核心目标,是让用户可以随时随地稳定地发送和接收消息。为了支撑成千上万用户同时在线交流,我们需要将整个系统划分成多个专职模块,每个模块只负责一件事情,彼此协同配合。
最基础的一层是 WebSocket 服务。WebSocket 是一种保持长连接的通信方式,可以让客户端和服务器随时互发消息。但一个 WebSocket 服务器的连接数是有限的,一般能同时维护几千个连接,因此我们通常会部署多个 WebSocket 服务实例,组成一个“集群”,来支撑海量在线用户。
在 WebSocket 服务之上,还有一系列专门的服务模块:
-
IM 服务:负责消息的收发与转发,也就是把你发的消息送到对方那里。
-
Logic 服务:处理登录后的操作,比如你上线、加好友、建群,这些都归它管。
-
Auth 服务:负责登录验证,确保你是你。
-
Router 服务:像导航员一样,决定消息该送去哪台服务器上的哪个用户。
除了模块分工,IM 系统还有一个重要设计:消息一定要先保存再发出去。这保证了即使网络出问题,消息也不会丢。保存之后,系统会通过消息队列把消息交给后续处理模块继续处理,比如发送到你好友的“信箱”里。
总的来说,整个系统像流水线一样,每一步都专注做好一件事,最终让消息安全、快速地送达每一位用户手中。
二、核心服务模块介绍
整个 IM 系统就像一个团队,每个成员负责不同的工作。下面我们来看看这些“成员”都做些什么。
1. WebSocket 服务
这是系统的“入口”。每个在线用户,都会通过 WebSocket 和服务器保持一个长连接。这个连接就像一条专属通道,方便用户随时发消息、收消息。
但一个 WebSocket 服务器能撑的连接数量有限,一般几千个就到头了。所以我们会部署很多台,组成一个“集群”,大家一起分担压力。
2. IM 服务
这是系统中最重要的“中转站”。
你发出一条消息后,IM 服务会先把它保存到数据库,然后丢进一个消息队列,再交给后面专门的模块去处理。为什么要这样?为了确保消息不会丢失,即使网络闪了一下,消息也还在。
它还负责把消息转发给接收方,比如你发了一句话给朋友,IM 服务就会负责把这句话送过去。
3. Logic 服务
Logic(逻辑)服务管的是用户行为。
比如:
-
登录后多久没动了,要不要认为你掉线了?
-
你加了一个好友,要不要让对方知道?
-
创建一个群聊,拉了谁进来?
这些操作都属于“逻辑事件”,由这个服务来处理。
4. Auth 服务
Auth 是认证服务,意思是“你是谁”的确认。
比如你输入账号密码登录,系统会调用 Auth 服务确认这个账号是否合法。如果你用的是第三方登录(比如微信、GitHub),Auth 也负责对接这些服务,确保只有通过验证的人才能进来。
5. Router 服务
Router(路由)服务的职责是找人。
比如你要给好友发消息,系统得先知道:他现在在哪台服务器上?连的是哪一个 WebSocket 实例?Router 服务会告诉你消息应该往哪发。
当然可以,这里是 “三、消息处理机制” 的内容,继续保持通俗、清晰、简洁的风格,面向小白讲解:
三、消息处理机制
当你在聊天窗口里按下“发送”按钮,背后其实触发了一连串操作。下面我们来看看,一条消息从你手里出去,到达对方的手里,中间到底经历了什么。
1. 消息先入库,再发送
你发的每一条消息,系统都会先保存起来,也就是“入库”。
为什么要先保存?这是为了防止消息丢失。比如你发完消息后,网络突然断了,如果没保存就直接发,很可能这条消息就彻底丢了。保存之后,就算后续出问题,也可以补发。
所以,IM 服务会:
-
把消息写入数据库(比如 MongoDB、MySQL 等)
-
然后告诉你:“发送成功!”
2. 消息写入队列
消息保存后,不会直接发给对方,而是先丢到一个“消息队列”中。
这个队列就像一个“中转仓库”,专门用来缓冲和调度消息。这样可以让处理流程更灵活,比如根据用户在线状态、网络条件、处理能力,安排合适的时间发消息。
3. 写扩散与用户信箱
消息进入队列后,有多个“消息处理器”来处理这些消息。
其中一个关键思路叫做 “写扩散”,意思是:
-
系统会主动把这条消息写到**目标用户的“信箱”**里,
-
每个用户都有自己的消息列表(就像邮箱收件箱),
-
登录时或收到推送时,系统会从信箱中取出消息送给你。
这样做的好处是:接收方什么时候来都能拿到消息,不怕错过。
4. 热点信箱的设计
对于一些经常聊天的热门用户(比如大 V 或群主),他们的消息非常多。
如果每个用户都维护完整的信箱,系统会变得很慢。因此我们会设计一个 “热点信箱”,专门处理这类高频用户,减少重复写入,提升效率。
比如一个群有几千人,系统不需要把同一条群消息复制几千遍,而是用热点信箱+聚合机制,智能分发。
四、聚合层设计
前面说过,每个用户都有一个自己的“信箱”,专门用来存放别人发给 TA 的消息。对于一些活跃用户,除了普通信箱外,还会有一个**“热点信箱”**,存放高频或群聊消息。
聚合层的作用,就是把这些分散的消息来源统一起来,给用户呈现一份最终的收件列表。
1. 为什么需要聚合层?
想象一下:
-
一部分消息在用户自己的信箱里;
-
一部分消息在群聊的热点信箱里;
-
还有一些可能来自系统通知、客服等。
如果客户端要自己去找这些消息,就像你自己跑到各个邮箱、微信群、通知中心去翻,麻烦又低效。
所以,我们引入聚合层:
-
它会自动去不同地方收集消息;
-
然后按时间顺序整理好;
-
最后一口气推送给用户。
2. 聚合层怎么工作?
流程其实不复杂:
-
用户上线后,客户端向聚合层请求“新消息”;
-
聚合层会去:
-
用户个人信箱取消息;
-
热点信箱查是否有该用户感兴趣的群消息;
-
-
将多个来源的消息合并在一起;
-
排好顺序,按页返回给用户。
这样一来,用户只需要调一次接口,就能拿到所有需要的消息,既快又省资源。
3. 推模式 vs 拉模式
聚合层支持两种方式:
-
拉模式:客户端主动问“有没有新消息?”
-
推模式:系统检测到有新消息,直接通知客户端来取。
实际使用时,两者会配合起来使用,确保消息不漏、不慢、不中断。
五、可靠推送与 ACK 策略
在 IM 系统中,“消息已送达”不代表“对方已经收到”。为了确保消息真正到达用户手里,并且对方确实收到了,系统需要一套可靠推送机制,其中一个关键环节就是 ACK(应答确认)。
1. 什么是 ACK?
ACK 是英文 Acknowledgement 的缩写,意思是“确认”。
举个例子:你给朋友发了一条消息,系统通过 WebSocket 把消息推到了朋友的手机上,这时候朋友的设备会给服务器回一个“我收到了”的信号,这个信号就是 ACK。
只有服务器收到这个 ACK,才说明消息真正送达了客户端。
2. 为什么需要 ACK?
如果没有 ACK,系统根本不知道消息有没有送到。可能你朋友网络不通、手机掉线,甚至消息被系统中的某个节点“弄丢了”,这些都需要系统感知并做补救。
所以,ACK 有两个核心作用:
-
确认送达:保证用户真的收到了消息。
-
触发下一步逻辑:比如更新“消息状态”,从“已发送”变成“已送达”。
3. 如果没有收到 ACK 怎么办?
系统会设置一个超时时间,比如 5 秒。如果超过这个时间还没收到 ACK,就认为“推送失败”。
这时候系统可能会:
-
重试推送:再次把消息发一遍。
-
切换推送通道:如果 WebSocket 不通,可以尝试发离线推送(比如通知栏提示)。
-
记录失败状态:方便后续排查或提醒用户“消息可能没送达”。
4. ACK 的流程总结一下:
-
服务器把消息推送到客户端
-
客户端收到消息,立刻回 ACK
-
服务器收到 ACK,标记消息为“送达成功”
-
如果长时间没收到 ACK,就重试或记录失败
相关文章:
顶层设计-IM系统架构
一、系统总体架构概览 即时通讯(IM)系统的核心目标,是让用户可以随时随地稳定地发送和接收消息。为了支撑成千上万用户同时在线交流,我们需要将整个系统划分成多个专职模块,每个模块只负责一件事情,彼此协同…...
Maven Deploy的依赖与引用方的依赖不同
提供的依赖:dependency:tree - com.alibaba.csp:sentinel-springboot-starter:jar:3.0.1-SNAPSHOT:compile [INFO] | - com.alibaba.csp:sentinel-datasource-nacos:jar:3.0.1:compile [INFO] | - com.alibaba.csp:sentinel-datasource-extension:jar:3.0.1:compil…...
如何让 Google 收录 Github Pages 个人博客
版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/ 如何确认自己的网站有没有被 google 收录 假设网址是:https://cyrus-studio.github.io/blog 搜索:site:https://cyrus-studio.github…...
物体雅克比、空间雅克比、解析雅克比、几何雅克比
在机器人学中,雅可比矩阵是连接广义坐标速度与末端执行器速度的关键工具。根据应用场景和参考系的不同,雅可比矩阵可分为物体雅可比(Body Jacobian)、空间雅可比(Space Jacobian)、解析雅可比(A…...
PCL PolygonMesh 与 TextureMesh 源码阅读与简单测试
Title: PCL PolygonMesh 与 TextureMesh 源码阅读与简单测试 文章目录 I . PolygonMesh1. PolygonMesh 结构体2. Vertices 结构体与点云索引3. 测试 PolygonMesh II. TextureMesh1. TextureMesh 结构体2. TexMaterial 结构体3. 纹理坐标与纹理坐标索引4. 测试 TextureMesh 以下…...
CSS面试题汇总
在前端开发领域,CSS 是一项不可或缺的技术。无论是页面布局、样式设计还是动画效果,CSS 都扮演着重要的角色。因此,在前端面试中,CSS 相关的知识点往往是面试官重点考察的内容。为了帮助大家更好地准备面试,本文汇总了…...
光谱相机的空间分辨率和时间分辨率
一、空间分辨率 定义与参数 概念:指单个像素对应实际地物的最小尺寸,常用地面采样距离(GSD,单位:米)或像素大小(单位:微米)表示。 分类: 高空…...
【研0学习计划表】
前言 以下学习计划并不固定: 1.若当前阶段的学习任务学习结束,对下一阶段的学习计划进行适当调整,提前进入下一阶段学习任务。 若当前阶段学习任务未完成,则根据每一阶段的学习情况,进行学习总结,然后对下…...
还没用过智能文档编辑器吗?带有AI插件的ONLYOFFICE介绍
在当今激烈的数字化竞争中,文档处理效率直接影响企业的决策与响应速度。然而,许多办公平台仅支持基础流程,查阅、批注和修改仍需借助外部工具,增加了操作复杂性和沟通成本。本文将探讨如何在自己的网站、平台、系统或者服务中集成…...
机器学习前言2
1.机器学习 2.机器学习模型 3.模型评价方法 4.如何选择合适的模型 介绍 机器学习(Machine Learning, ML)是人工智能(AI)的核心分支,致力于通过数据和算法让计算机系统自动“学习”并改进性能,而无需显式编…...
在多个SpringBoot程序中./相对路径下隐患、文件覆盖问题
概述 两个 Spring Boot 应用生成的配置文件被覆盖,是因为 相对路径的解析依赖于当前工作目录(Working Directory),而你可能在运行应用时未正确设置各自的工作目录。以下是具体原因和解决方案: 原因分析 相对路径…...
弦理论的额外维度指的是什么,宇宙中有何依据
弦理论中的额外维度是解释微观世界与宏观宇宙矛盾的关键假设之一。它们并非科幻中的平行宇宙,而是通过严谨的数学框架提出,并可能留下可观测的宇宙学痕迹。以下是具体解析: 一、弦理论为何需要额外维度? 数学自洽性要求 弦理论中…...
FC7300 GPT MCAL 配置引导
一、配置约束 FCPIT:仅FC7240型号芯片支持。如果GPT模块与PWM/ICU/OCU模块使用相同的FTU实例,配置工具将报告一个错误。如果GPT通道使用FTU,时钟源来自PCC,则GptFtuChannelClkSrc必须选择GPT_FTU_BUS_CLK。二、MCU 组件 - 配置WDG采用的定时器时钟 Examle:WDG选用AONTIMER…...
LangFlow技术深度解析:可视化编排LangChain应用的新范式 -(2)流编辑器系统
Flow Editor System | langflow-ai/langflow | DeepWiki 流编辑器系统 相关源文件 流编辑器系统是 Langflow 的核心交互式组件,允许用户直观地创建、编辑和管理 LLM 驱动的应用程序。它提供了一个直观的画布,用户可以在其中添加节点、将其与边缘连接并…...
okcc呼叫中心系统搭建的方案方式
传统企业呼叫中心多采用 PC和手机软件,很难与客户保持良好的沟通。因此,需要建设一套呼叫中心系统来实现与客户实时有效沟通。那么,呼叫中心搭建的方案方式有哪些呢?下面详细介绍一下。 呼叫中心系统的搭建方式需根据企业规模、预算和业务需…...
asp.net IHttpHandler 对分块传输编码的支持,IIs web服务器后端技术
IHttpHandler,不支持分块传输编码(Chunked Transfer)吧? IHttpHandler 对分块传输编码的支持 实际上,IHttpHandler 完全支持分块传输编码(Chunked Transfer Encoding),但具体行为取…...
芍药BAHD酰基转移酶-文献精读128
PoDPBT, a BAHD acyltransferase, catalyses the benzoylation in paeoniflorin biosynthesis in Paeonia ostii PoDPBT,一种BAHD酰基转移酶,在芍药(Paeonia ostii)中催化芍药苷生物合成中的苯甲酰化反应。 摘要 PoDPBT是属于BA…...
GTS-400 系列运动控制器板卡介绍(三十三)---运动程序单线程累加求和
运动控制器函数库的使用 运动控制器驱动程序、dll 文件、例程、Demo 等相关文件请通过固高科技官网下载,网 址为:www.googoltech.com.cn/pro_view-3.html 1 Windows 系统下动态链接库的使用 在 Windows 系统下使用运动控制器,首先要安装驱动程序。在安装前需要提前下载运动…...
C# 面向对象 构造函数带参无参细节解析
继承类构造时会先调用基类构造函数,不显式调用基类构造函数时,默认调用基类无参构造函数,但如果基类没有写无参构造函数,会无法调用从而报错;此时,要么显式的调用基类构造函数,并按其格式带上参…...
数字化工厂升级引擎:Modbus TCP转Profinet网关助力打造柔性生产系统
在当今的工业自动化领域,通信协议扮演着至关重要的角色。Modbus TCP和Profinet是两种广泛使用的工业通信协议,它们分别在不同的应用场景中发挥着重要作用。然而,有时我们可能需要将这两种协议进行转换,以实现不同设备之间的无缝通…...
【编译原理】词法分析器
//简单实现,伪代码 int code,value; strToken :" "; //置strToken为空串 GetChar();GetBC(); if(IsLetter()) beginwhile(IsLetter() or IsDigit())beginConcat();GetChar();endRetract();code:Reserve();if(code0)beginvalue:InsertId(strToken);retu…...
记录一次vue项目页面内嵌iframe页面实现跨域上传和下载附件的功能
功能背景:项目部署在外网,然后其中有一个功能需要上传下载附件,附件是上传到华为云对象存储服务OBS中(私有云),所以采用iframe嵌套页面的方式解决跨域问题。 实现思路: 1、父窗口封装一个组件专…...
【Win32 API】 lstrcpyA()
作用 将字符串复制到指定的字符串缓冲区。 函数 LPSTR lstrcpyA(LPSTR lpString1, LPCSTR lpString2); 参数 lpString1 类型:LPTSTR 一个缓冲区,用于接收由 lpString2 参数指向的字符串的内容。 缓冲区必须足够大才能包含字符串,包括终止…...
报表控件stimulsoft教程:如何在报表和仪表板中创建热图
Stimulsoft Ultimate (原Stimulsoft Reports.Ultimate)是用于创建报表和仪表板的通用工具集。该产品包括用于WinForms、ASP.NET、.NET Core、JavaScript、WPF、PHP、Java和其他环境的完整工具集。无需比较产品功能,Stimulsoft Ultimate包含了…...
Axure疑难杂症:剖析面包屑导航“用户不迷路”(玩转导航)
亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:剖析面包屑导航“用户不迷路” 主要内容:面包屑导航各种做法 应用场景:页面导航、页面路径、用户选择路径、…...
中exec()函数因$imagePath参数导致的命令注入漏洞
exec(zbarimg -q . $imagePath, $barcodeList, $returnVar); 针对PHP中exec()函数因$imagePath参数导致的命令注入漏洞,以下是安全解决方案和最佳实践: 一、漏洞原理分析 直接拼接用户输入$imagePath到系统命令中,攻击者可通过注入特殊字…...
HTML常用标签用法全解析:构建语义化网页的核心指南
HTML作为网页开发的基石,其标签的合理使用直接影响页面的可读性、SEO效果及维护性。本文系统梳理HTML核心标签的用法,结合语义化设计原则与实战示例,助你构建规范、高效的网页结构。 一、基础结构与排版标签 1.1 文档结构 <!DOCTYPE htm…...
【Linux】动静态库链接原理
📝前言: 这篇文章我们来讲讲Linux——动静态库链接原理 🎬个人简介:努力学习ing 📋个人专栏:Linux 🎀CSDN主页 愚润求学 🌄其他专栏:C学习笔记,C语言入门基础…...
Axure设计的“广东省网络信息化大数据平台”数据可视化大屏
在数据驱动决策的时代,数据可视化大屏成为了展示数据、洞察趋势的重要工具。今天,让我们一同深入了解由Axure设计的“广东省网络信息化大数据平台”数据可视化大屏,看看它如何通过精心的布局和丰富的图表类型,将复杂的数据以直观易…...
linux安装宝塔面板到数据盘
操作很简单,假如数据盘挂载在cipan1,在数据盘新建目录www,为了方便对应。 执行一下命令,创建软连接 ln -s /cipan1/www www 此时,根目录就出现了www文件夹 下面正常安装宝塔即可...
数学实验(Matlab编程基础)
一、函数文件 Matlab编程基础 Matlab作为一种广泛应用于科学计算的工具软件,不仅具有强大的数值计算、符号计算、矩阵运算能力和丰富的绘图功能,同时也具有和C、FORTRAN等高级语言一样进行程序设计 利用Matlab的程序控制功能,可以将有关Ma…...
不同坐标系下MATLAB绘制阵列的方向图
不同坐标系下MATLAB绘制阵列的方向图 球坐标系,极坐标系、直角坐标系 文章目录 前言一、极坐标系二、球坐标系三、直角坐标系总结 前言 \;\;\;\;\; 在阵列信号处理和天线设计中,方向图(Pattern)是描述波束形成性能的关键工具&…...
python可视化:北方省市人口流动与春运数据综合分析5
python可视化:北方省市人口流动与春运数据综合分析5 一、北方省市常住人口数据及变化趋势(2023-2024第一季度) 1. 主要城市常住人口数据(按城市等级分类) 城市类型2023Q1常住人口(万)2024Q1常住人口(万)变化量(万)变…...
Java并发编程-线程池(四)
文章目录 线程池实现原理WorkerWorker 核心设计总结 runWorker(Worker w)总结 线程池实现原理 上一篇我们看了 addWork 方法,那接下来就让我们详细看看内部类Worker。 Worker private final class Workerextends AbstractQueuedSynchronizerimplements Runnable …...
力扣热题——最长相邻不相等子序列 |
题目要求从字符串数组 words 中选出一个最长的子序列,使得该子序列中相邻字符串对应的 groups 数组中的值不同。通过贪心算法,可以高效地解决该问题。具体步骤为:初始化一个结果列表,遍历 words 数组,检查当前字符串的…...
筑牢信息安全防线:涉密计算机与互联网隔离的理论实践与风险防控
在数字化时代,信息安全已成为国家安全体系的重要组成部分。涉密计算机作为承载敏感信息的核心载体,其安全防护工作直接关系到国家利益与社会稳定。违规连接互联网这一行为,如同在严密的防护体系中打开一扇危险的"暗门",…...
sqli-labs靶场29-31关(http参数污染)
目录 前言 less29(单引号http参数污染) less30(双引号http参数污染) less31(双引号括号http参数污染) 前言 在JSP中,使用request.getParameter("id")获取请求参数时,如果存在多个同名参数&a…...
基于Linux环境实现Oracle goldengate远程抽取MySQL同步数据到MySQL
基于Linux环境实现Oracle goldengate远程抽取MySQL同步数据到MySQL 场景说明: 先有项目需要读取生产库数据,但是不能直接读取生产库数据,需要把生产数据同步到一个中间库,下游系统从中间库读取数据。 生产库mysql - OGG - 中间库…...
linux,我启动一个springboot项目, 用java -jar xxx.jar ,但是没多久这个java进程就会自动关掉
当使用 java -jar xxx.jar & 启动 Spring Boot 项目后进程自动关闭时,可能由多种原因导致。以下是常见排查步骤和解决方案: 一、查看日志定位原因 进程异常关闭通常会在控制台或日志中留下线索,建议先获取完整日志: 1. 查看…...
pytorch 14.3 Batch Normalization综合调参实践
文章目录 一、Batch Normalization与Batch_size综合调参二、复杂模型上的Batch_normalization表现1、BN对复杂模型(sigmoid)的影响2、模型复杂度对模型效果的影响3、BN对复杂模型(tanh)的影响 三、包含BN层的神经网络的学习率优化…...
供应链安全检测系列技术规范介绍之一|软件成分分析
软件成分分析的概念及意义 软件成分分析Software Compostition Analysis(SCA)是一种用于管理开源组件应用安全的方法。软件成分分析系统可以快速跟踪和分析应用软件的开源组件,发现相关组件、支持库以及它们之间直接和间接依赖关系࿰…...
pytorch 15.1 学习率调度基本概念与手动实现方法
文章目录 一、学习率对模型训练影响 二、学习率调度基本概念与手动实现方法1.模型调度基本概念2.手动实现学习率调度3.常用学习率调度思路 从本节开始,我们将介绍深度学习中学习率优化方法。学习率作为模型优化的重要超参数,在此前的学习中,我…...
c++ 类的语法4
测试析构函数、虚函数、纯虚函数: void testClass5() {class Parent {public:Parent(int x) { cout << "Parent构造: " << x << endl; }~Parent() {cout << "调用Parent析构函数" << endl;}virtual string toSt…...
品铂科技在UWB行业地位综述(2025年更新)
一、行业领先地位 国内UWB领域头部企业 在2025年中国UWB企业综合实力排行榜中位列第一,技术研发、市场份额及行业影响力均处于领先地位。连续多年获评中国物联网产业联盟“中国最有影响力物联网定位企业”。 2.全球技术竞争力 .2016年IPSN微软国际室内…...
muduo库EventLoop模块详解
muduo库EventLoop模块深度解析 EventLoop是muduo网络库实现Reactor模型的核心调度中枢,负责驱动整个事件循环机制,协调Poller、Channel、TimerQueue等组件的工作。其设计遵循"One Loop Per Thread"原则。 一、核心职责与设计思想 1. 核心职责…...
循环导入(Circular Import) 错误
ImportError: cannot import name event_type_data_tree from partially initialized module routers.ticket (most likely due to a circular import) (E:\ai12345\backend\app\routers\ticket.py) 这是什么错,中文回答 这个错误是 循环导入(Circular …...
基于大数据的租房信息可视化系统的设计与实现【源码+文档+部署】
课题名称 基于大数据的租房信息可视化系统的设计与实现 学 院 专 业 计算机科学与技术 学生姓名 指导教师 一、课题来源及意义 租房市场一直是社会关注的热点问题。随着城市化进程的加速,大量人口涌入城市,导致租房需求激增。传统的租…...
奥运数据可视化:探索数据讲述奥运故事
在数据可视化的世界里,体育数据因其丰富的历史和文化意义,常常成为最有吸引力的主题之一。今天我要分享一个令人着迷的奥运数据可视化项目,它巧妙地利用交互式图表和动态动画,展现了自1896年至今奥运会的发展历程和各国奥运成就的…...
linux环境下 安装svn并且创建svn版本库详细教程
一、安装SVN 通过yum安装Subversion 在Linux系统中执行以下命令安装: yum install subversion -y 安装完成后,验证版本: svnserve --version 二、创建版本库 选择存储路径并创建目录 通常将版本库放在/var/svn或/usr/local/…...
STM32控制电机
初始化时钟:在 STM32 的程序中,初始化系统时钟,一般会使用 RCC(Reset and Clock Control)相关函数来配置时钟。例如,对于 STM32F103 系列,可能会使用 RCC_APB2PeriphClockCmd 函数来使能 GPIO 和…...