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

RISC-V IDE MRS2 开发笔记一:volatile关键字的使用

RISC-V IDE MRS2 开发笔记一:volatile关键字的使用

一、volatile是什么

二、GCC 中 volatile 的行为
2.1禁止编译器优化
2.2 不等于内存屏障
2.3 GCC扩展行为

三、什么时候需要 volatile
3.1防止编译器优化掉“有效代码”
3.2 访问硬件寄存器
3.3 中断服务程序

四、哪些地方不该用 volatile

一、volatile是什么

在 C 语言中,volatile 是一个类型修饰符,英文的意思是 “易变的”。
它告诉编译器:“这个变量的值随时可能被程序外部因素更改,因此在每次访问时都必须重新从内存中读取。”这意味着编译器不能对使用 volatile 修饰的变量进行编译优化。
在沁恒提供的外设库以及STM32官方库都大量使用了__IO、__O 等,其实本质上都是 volatile:
在这里插入图片描述

二、GCC 中 volatile 的行为
官网描述:
https://gcc.gnu.org/onlinedocs/gccint/Flags.html
https://gcc.gnu.org/onlinedocs/gcc/Volatiles.html

2.1禁止编译器优化

在GCC编译器中,volatile关键字具有优化无关性,其语义行为不受编译优化级别(如-O0、-Os等)的影响。都会在编译阶段禁止一些编译优化,比如,读/写访问的合并、死代码消除、寄存器缓存等。并且在 GCC 的中间表示中,volatile 会被特殊标记,访问 volatile 变量的指令会被标记为 volatile load 或 volatile store,即不可删除、不可合并的访问操作。
GCC 会使用 MEM_VOLATILE_P 标记这些内存访问,告诉中间层和后端:

  • 此内存访问必须按顺序保留
  • 每次访问都必须生成实际的指令

在这里插入图片描述

举个例子:

在这里插入图片描述

在这里插入图片描述

使用 GCC 的 -fdump-rtl-expand 选项可以清晰地看到 volatile 如何影响 RTL 表达式生成。被标记为 volatile 的变量在 RTL 中会显示为 mem/v:SI,其中 /v 表示访问具有 volatile 属性,禁止优化。这与 GCC 对 volatile 的语义一致:始终保持对内存的实际访问,防止编译器优化掉。

2.2 不等于内存屏障

引自官网:https://gcc.gnu.org/onlinedocs/gcc/Volatiles.html
volatile 保证“不会优化掉访问”,但不保证访问顺序,特别是对其他非 volatile 内存的影响顺序。
在这里插入图片描述

不能保证 *ptr = 123; 会在 vobj = 1; 之前执行。因为 *ptr 是普通内存,编译器可以重排这些指令。

在这里插入图片描述

如果需要严格的内存顺序,则必须使用更强的内存屏障(如__asm__ volatile(“” ::: “memory”)) 或使用GCC内置函数(__sync_synchronize())。这样 GCC 会认为 “所有内存都可能被修改”,不会重排 *ptr 和 vobj 的访问顺序。

2.3 GCC扩展行为

还可以配合内联汇编的使用:asm volatile确保汇编指令不被优化删除,即使输出未使用。
在这里插入图片描述

同样可以用 GCC 的 attribute((optimize(“O0”))) 来保护某些函数不被优化。

三、什么时候需要 volatile

3.1防止编译器优化掉“有效代码”

以图二的wait、wait_vol函数为例,其对应的汇编代码如下:
在这里插入图片描述

在 wait 函数中,编译器生成的指令仅在进入函数时读取一次 normal_var 的值(通过 lw 指令加载到 a5 寄存器),然后循环中始终基于该寄存器的值进行判断:如果 normal_var 在循环过程中由外部修改,由于变量未声明为 volatile,编译器假设其值不会被改变,因此不会再次从内存读取。这可能导致程序永远卡在循环中,无法感知变量变化,从而形成死循环。
相比之下,wait_vol 函数中对应的 volatile_var 被声明为 volatile,编译器因此不敢假设其值稳定,每次循环都重新发出 lw 指令,也就是不断从内存读取 volatile_var 的值。这体现了 volatile 的真实作用:强制每次都从内存取值,不允许优化,确保了对变量变化的感知。

3.2 访问硬件寄存器

在嵌入式系统中,经常通过内存映射直接访问硬件寄存器,这些寄存器的值会由外部硬件动态改变,而不是由程序直接控制。如果不加 volatile,编译器可能会出于优化目的缓存寄存器值或省略重复读取,从而导致数据错误。

以MR2创建的CH32V303CBT6模板工程为例,在\CH32V303CBT65\Debug\debug.c文件中,用于printf重定向的_write函数
在这里插入图片描述
在这里插入图片描述

在 _write 中,代码如下所示:
while (*(DEBUG_DATA0_ADDRESS) != 0u) {
// 等待硬件准备好
}
这是一个等待机制,通过while循环持续读取 DEBUG_DATA0_ADDRESS 的值直到硬件写入窗口空闲。如果 DEBUG_DATA0_ADDRESS 未使用 volatile 修饰,编译器可能会将其只读取一次,导致永远无法退出等待循环,进而卡死系统。

3.3 中断服务程序

在嵌入式系统中,中断服务程序与主程序之间共享变量是一种常见的设计模式。为了实现任务的及时响应,某些标志变量或数据缓冲区往往需要在主循环和中断服务程序之间共享。然而,由于中断具有异步性,其对变量的修改可能随时发生,这就要求编译器在访问这类变量时不得进行优化,否则可能导致主程序使用过期的值,从而引发严重逻辑错误。
以沁恒的CH32V307EVT的串口中断为例CH32V307EVT\EVT\EXAM\USART\USART_Interrupt\User\main.c

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

变量 RxCnt1、Rxfinish1 在主程序和 USART2_IRQHandler 中断服务程序中都可能被访问或修改,因此必须用 volatile 修饰,以防止编译器进行缓存优化。如果这些变量未使用 volatile 修饰,主程序可能会将它们的值缓存在寄存器中。
代码如下所示:

while(Rxfinish1 == 0) {
// 等待接收完成
}
如果编译器缓存了 Rxfinish1 的值,那么即使中断函数设置它为 1,主循环仍然会看到旧值(0),从而进入死循环。使用 volatile 后,编译器会强制每次从内存中重新读取变量值,保证获取的是中断修改后的最新状态。

四、哪些地方不该用 volatile

虽然 volatile 是强有力的工具,但滥用也会带来问题:

  • 普通局部变量:局部变量的作用域仅限于函数内部,不会被外部事件(如中断、多线程)修改。使用 volatile 会强制每次访问都从内存读写,禁用寄存器缓存优化,导致性能下降。
  • 多线程同步仅依赖volatile:volatile仅保证可见性(每次访问内存),但不保证原子性或操作顺序。

相关文章:

RISC-V IDE MRS2 开发笔记一:volatile关键字的使用

RISC-V IDE MRS2 开发笔记一:volatile关键字的使用 一、volatile是什么 二、GCC 中 volatile 的行为 2.1禁止编译器优化 2.2 不等于内存屏障 2.3 GCC扩展行为 三、什么时候需要 volatile 3.1防止编译器优化掉“有效代码” 3.2 访问硬件寄存器 3.3 中断服务…...

25、工业防火墙 - 工控网络保护 (模拟) - /安全与维护组件/industrial-firewall-dcs-protection

76个工业组件库示例汇总 工业防火墙 - 工控网络保护 (模拟) 概述 这是一个交互式的 Web 组件,旨在模拟工业防火墙在保护关键工控网络(特别是 DCS - 分布式控制系统)免受网络攻击(如勒索软件传播)方面的核心功能。组件通过可视化简化的网络拓扑、模拟网络流量、应用防火…...

LAN(局域网)和WAN(广域网)

你的问题非常清晰!我来用一个直观的比喻实际拓扑图帮你彻底理解LAN(局域网)和WAN(广域网)如何协同工作,以及路由器在其中的位置。你可以把整个网络想象成一座城市: 1. 比喻:城市交通…...

ArcGIS Pro 3.4 二次开发 - Arcade

环境:ArcGIS Pro SDK 3.4 .NET 8 文章目录 Arcade1 基本查询1.1 基本查询1.2 使用要素进行基本查询1.3 使用 FeatureSetByName 检索要素1.4 使用过滤器检索要素1.5 使用数学函数计算基本统计量1.6 使用 FeatureSet 函数的 Filter 和 Intersects 2 评估表达式2.1 评…...

PCB智能报价系统——————仙盟创梦IDE

软件署名 代码贡献: 紫金电子科技有限公司 文案正路:cybersnow 正文 对企业的竞争力有着深远影响。传统的 PCB 报价方式往往依赖人工核算,不仅耗时较长,还容易出现误差。随着科技的发展,PCB 自动报价系统应运而生&a…...

灾备认证助力构建数据资产安全防线‌

信息安全保障人员(CISAW)-灾难备份与恢复认证 1.权威认证体系:技术护城河‌ 在数字化进程加速的背景下,数据资产已成为政府与企业的核心资源,容灾备份能力成为保障业务连续性的关键。特别是近年来,因灾备缺…...

[特殊字符] 遇见Flask

一、初识Flask:像风一样自由 想象一下,你手里有一盒乐高积木——没有说明书,但每一块都精致小巧,任你组合成城堡、飞船,甚至整个宇宙。Flask就是这样一个存在。它不像Django那样“手把手教你搭房子”,而是…...

Axure高级交互设计:中继器嵌套动态面板实现超强体验感台账

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢!如有帮助请订阅专栏! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:中继器嵌套动态面板 主要内容:中继器内部嵌套动态面板,实现可移动式台账,增强数据表现…...

告别手动绘图!2分钟用 AI 生成波士顿矩阵

波士顿矩阵作为经典工具,始终是企业定位产品组合、制定竞争策略的核心方法论。然而,传统手动绘制矩阵的方式,往往面临数据处理繁琐、图表调整耗时、团队协作低效等痛点。 随着AI技术的发展,这一现状正在被彻底改变。boardmix博思白…...

iframe加载或者切换时候,短暂的白屏频闪问题解决

问题描述 iframe加载或者是切换iframe链接的时候,会有短暂的白屏,这个时候是在加载,目前没有想到避免的问题,应该是浏览器层面的,所以解决方法之一就是,用页面的主题背景色来遮盖一下,当他加载…...

Python数据可视化高级实战之一——绘制GE矩阵图

目录 一、课程概述 二、GE矩阵? 三、GE 矩阵图的适用范围 五、GE 矩阵的评估方法 (一)市场吸引力的评估要素 二、企业竞争实力的评估要素 三、评估方法与实践应用 1. 定量与定性结合法 2. 数据来源 六、GE矩阵的图形化实现 七、总结:GE 矩阵与 BCG 矩阵的对比分析 (一)GE…...

量子计算与云计算的融合:技术前沿与应用前景

目录 引言 量子计算基础 量子计算的基本原理 量子计算的优势与挑战 量子计算的发展阶段 云计算基础 云计算的基本概念 云计算的应用领域 云计算面临的挑战 量子计算与云计算的结合 量子云计算的概念与架构 量子云计算的服务模式 量子云计算的优势 量子云计算的发展…...

QMK固件RGB矩阵照明功能详解 - 打造你的专属炫彩键盘

QMK固件RGB矩阵照明功能详解 - 打造你的专属炫彩键盘 🌈 大家好!今天我要详细讲解QMK固件中的RGB矩阵照明功能,让你轻松打造一个真正炫彩的机械键盘!本文从基础原理到实战配置,手把手教你如何配置各种绚丽的灯光效果,即使你是小白也能轻松上手!文中所有代码都配有详细的…...

Rust 学习笔记:关于泛型的练习题

Rust 学习笔记:关于泛型的练习题 Rust 学习笔记:关于泛型的练习题问题 1下面代码能否通过编译?若能,输出是?下面代码能否通过编译?若能,输出是? Rust 学习笔记:关于泛型的…...

Panasonic松下焊接机器人节气

Panasonic松下焊接机器人节气装置 一、工作原理 松下焊接机器人节气装置的工作原理主要是通过智能控制技术,实现对焊接过程中气体流量的精确调节。例如,在焊接的不同阶段,根据焊接电流的大小自动调整气体的供给量。当焊接电流较强时&#x…...

2023 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(国赛) 解题报告 | 珂学家

前言 题解 2023 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(国赛)。 vp了下,题目挺好的,难度也适中,但是彻底红温了。 第二题,题意不是那么清晰, M i n ( K 1 , K 2 ) Min(K_1, K_2) Min(K1​,K2​)容易求&#x…...

LeetCode 3355.零数组变换 I:差分数组

【LetMeFly】3355.零数组变换 I:差分数组 力扣题目链接:https://leetcode.cn/problems/zero-array-transformation-i/ 给定一个长度为 n 的整数数组 nums 和一个二维数组 queries,其中 queries[i] [li, ri]。 对于每个查询 queries[i]&am…...

java21

1.数据结构之二叉树,二叉查找树,平衡二叉树 原理:和节点比较大小然后选左边还是右边 注意:中序遍历最常见,因为遍历的结果是从小到大 注意是任意节点,上面的二叉查找树的节点10的左子树高度是0,…...

ES的倒排索引和正排索引的区别及适用场景?为什么倒排索引适合全文搜索?

正排索引解析 1.存储机制 Elasticsearch 的文档存储机制比简单的固定字节分配更复杂,其核心原理如下: 1. 数值类型存储机制 对于 long/float/double 等数值类型: 文档ID2 → 偏移量 2 * sizeof(type) 例如:long 类型&#xf…...

ElasticSearch各种查询语法示例

1. 每种查询语法的区别与优缺点 Query DSL 区别: JSON 格式的结构化查询,功能强大,支持复杂查询逻辑,适用于 Elasticsearch 的核心查询场景。优点: 灵活,功能全面,支持全文搜索、精确匹配、聚合等;可组合…...

Ubuntu20.04部署KVM

文章目录 一. 环境准备关闭防火墙(UFW)禁用 SELinux更换镜像源检查 CPU 虚拟化支持 二. 安装KVM安装 KVM 及相关组件启动 libvirtd 服务验证安装创建虚拟机 一. 环境准备 4C8G,50G硬盘——VMware Workstation需要给虚拟机开启虚拟化引擎 roo…...

Android车载应用开发:Kotlin与Automotive OS深度实践

一、Android Automotive OS简介 Android Automotive OS(AAOS)是Google为车辆定制的操作系统,直接运行于车机硬件,提供完整的车载信息娱乐系统(IVI)。与Android Auto(手机投影方案)不…...

提示词工程(Prompt Engineering)是智能Agent交互中不可或缺的一环

Prompt Engineering 提示词,参考OpenAI提示词建议 2.5.1 概述 提示词工程(Prompt Engineering)是智能Agent交互中不可或缺的一环,它们指导智能体如何理解和回应用户的需求。这一节将探讨如何设计有效的提示词,以及如何通过精确的语言引导智能…...

九天画芯CEO张锦:AR 与 AI 融合重构智能终端生态,消费级市场迎来关键拐点

一、AR设备逆势突围:从技术验证到规模商用的跨越 根据洛图科技显示,2025 年 Q1 中国 XR(ARVR) 设备市场数据显示,AR 设备以 9.1 万台销量、116% 的同比增速远超 VR/MR 设备,这标志着消费级 AR 市场正式从 “…...

Python爬虫(32)Python爬虫高阶:动态页面处理与Scrapy+Selenium+BeautifulSoup分布式架构深度解析实战

目录 引言一、动态页面爬取的技术背景1.1 动态页面的核心特征1.2 传统爬虫的局限性 二、技术选型与架构设计2.1 核心组件分析2.2 架构设计思路1. 分层处理2. 数据流 三、代码实现与关键技术3.1 Selenium与Scrapy的中间件集成3.2 BeautifulSoup与Scrapy Item的整合3.3 分布式爬取…...

[案例七] NX二次开发标识特征的导入与布尔运算

本来做的是案例六NX二次开发减重块。但是当时在处理导入指定面时发现坐标转化存在很大问题,开了我很长时间,太难受了,决定放一放,昨天做了第六个案例采取了一种补救方法(实在不会的一种解决思路),个人认为NX这么优秀的软件应该有更好的方法,坐标转化真让人头大。刚开始…...

Canvas进阶篇:鼠标交互动画

Canvas进阶篇:鼠标交互动画 前言获取鼠标坐标鼠标事件点击事件监听代码示例效果预览 拖动事件监听代码示例效果预览 结语 前言 在上一篇文章Canvas进阶篇:基本动画详解 中,我们讲述了在Canvas中实现动画的基本步骤和动画的绘制方法。本文将进…...

Axure项目实战:智慧运输平台后台管理端-订单管理2(多级交互)

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢!如有帮助请订阅专栏! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:订单管理2 主要内容:中继器筛选、表单跟随菜单拖动、审批数据互通等 应用场景:订单管理…...

AG-UI:重构AI代理与前端交互的下一代协议标准

目录 技术演进背景与核心价值协议架构与技术原理深度解析核心功能与标准化事件体系典型应用场景与实战案例开发者生态与集成指南行业影响与未来展望1. 技术演进背景与核心价值 1.1 AI交互的三大痛点 当前AI应用生态面临三大核心挑战: 交互碎片化:LangGraph、CrewAI等框架各…...

鸿蒙版Flutter库torch_light手电筒功能深度适配

鸿蒙版Flutter库torch_light手电筒功能深度适配:跨平台开发者的光明之路 本项目作者:kirk/坚果 适配仓库地址 作者仓库:https://github.com/svprdga/torch_light# 在数字化浪潮的推动下,跨平台开发框架如 Flutter 凭借其高效、…...

【JAVA】中文我该怎么排序?

📘 Java 中文排序教学文档(基于 Collator) 🧠 目录 概述Java 中字符串排序的默认行为为什么需要 Collator使用 Collator 进行中文排序升序 vs 降序排序自定义对象字段排序多字段排序示例总结对比表附录:完整代码示例 …...

WPF MVVM Community Toolkit. Mvvm 社区框架

Community Toolkit. Mvvm 社区框架 微软官方文档 主要内容:CommunityToolkit.Mvvm 框架 概念,安装,使用(重要API:ObservableObject,RelayCommand)源生成器([ObservableProperty]&…...

云原生安全之PaaS:从基础到实践的技术指南

🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 云原生安全之PaaS:从基础到实践的技术指南 一、基础概念 PaaS(Platform as a Service)平台 PaaS是一种云计算服务模型,为开发者提供应用程序的开发、部署和运行环境,涵…...

软件设计师考试需背诵知识点

1. 网络技术标准与协议 2. OSI/RM七层模型 3. 对称加密算法 4. 常见的非对称加密算法 5. 排序算法比较 6. 海明码公式 设数据位是n位,校验位是k位,则n与k必须满足以下关系: 7. McCabe度量法 McCabe度量法的核心公式为: V(G)E−…...

智慧社区新防线:华奥系AI技术如何让夏季安防“零隐患”

夏季社区安防隐患频发 随着夏季高温、暴雨、台风等极端天气增多,社区安全风险显著上升。高空建筑外墙材料因暴晒脱落、地下管道锈蚀堵塞导致积水、电动车充电自燃等事件频发,传统“人防物防”模式响应滞后、管理粗放,难以满足精细化防控需求…...

pinia的简单使用

yarn add pinia // 用来存储token,用户信息,等需要多地方使用的信息 src目录下新建store文件夹->新建index.ts import { createPinia } from "pinia";const store createPinia()export default storemain.ts 引用store import { createApp } from v…...

【Linux笔记】——线程池项目与线程安全单例模式

🔥个人主页🔥:孤寂大仙V 🌈收录专栏🌈:Linux 🌹往期回顾🌹: 【Linux笔记】——简单实习一个日志项目 🔖流水不争,争的是滔滔不息 一、线程池设计二…...

用户有一个Django模型没有设置主键,现在需要设置主键。

用户有一个Django模型没有设置主键,现在需要设置主键。 from django.db import modelsclass CategoryAssistentModel(models.Model):second_level_category models.CharField(max_length100, nullTrue, blankTrue)third_level_category models.CharField(max_len…...

SkyWalking 报错:sw_profile_task 索引缺失问题分析与解决

文章目录 SkyWalking 报错:sw_profile_task 索引缺失问题分析与解决问题背景SkyWalking 是否会自动创建 sw_profile_task 索引?答案:不会在初始化时创建相关索引包括: 问题原因分析解决方案✅ 解决思路:手动创建 sw_pr…...

多模态学习笔记

在模态对齐任务中,同一时刻不同类型的数据(模态)需要做好对齐,才能更好的感知内容,下面对其常见的多模态对齐任务进行如下总结: (1)文本图像 图像和文本特征提取后的对齐方法主要分为两类:基于对比学习的方法和基于跨模态注意力的方法。以下是它们的细化说明及具体实…...

【 Redis | 实战篇 扩展 】

目录 前言: 1.达人探店功能 1.1.点赞功能 1.2.排行榜 2.关注 2.1.共同关注 2.2.关注推送 3.附近商铺 3.1.GEO基本用法 3.2.获取附近商铺 4.签到 4.1.BitMap 4.2.实现签到 4.3.统计连续签到 5.UV统计 前言: 实现达人探店,好友…...

【HarmonyOS Next之旅】DevEco Studio使用指南(二十五) -> 端云一体化开发 -> 业务介绍(二)

目录 1 -> 工作原理 2 -> 约束与限制 2.1 -> 支持的设备 2.2 -> 支持的国家/地区 2.3 -> 支持的签名方式 3 -> 总结 3.1 -> 关键功能与工具 3.2 -> 开发流程 3.3 -> 典型场景与优化 3.4 -> 常见问题与解决 3.5 -> 总结 1 -> 工…...

空调系统虚拟标定技术:新能源汽车能效优化的革命性突破

title: 空调系统虚拟标定技术:新能源汽车能效优化的革命性突破 date: 2025-05-15 categories: 新能源汽车技术 tags: [空调系统, 虚拟标定, PID控制, 数字孪生, 能效优化] description: 本文深度解析空调系统虚拟标定技术在新能源汽车中的应用,揭秘如何…...

MCP Server开发并使用自定义天气查询工具查询城市天气

1.本地安装node.js环境 2.本地创建mcp文件夹,搭建mcp环境 在文件夹下cmd执行npm init -y初始化npm项目 3.创建weather-server.js文件,代码如下 // weather-server.js import { McpServer } from "modelcontextprotocol/sdk/server/mcp.js"…...

virtualbox选项“启用套嵌vt-x/amd-v“不可用

“启用套嵌vt-x/amd-v”选项不可用。 解决方法: 切换到virtualbox安装目录,执行如下命令查看虚拟机名称: .\VBoxManage.exe list vms比如返回: winxp 执行如下命令开启64位,注意把"winxp"换成你的虚拟机名字&#x…...

windows powershell 判断 进程号是否存在

在 Windows PowerShell 中,你可以使用多种方法来检查一个特定的进程号(PID)是否存在。以下是几种常用的方法: 方法1:使用 Get-Process 命令 你可以尝试获取具有特定 PID 的进程。如果该进程存在,Get-Proce…...

JAVA SE 多线程(下)

文章目录 📕1. 常见的锁策略✏️1.1 乐观锁VS悲观锁✏️1.2 轻量级锁VS重量级锁✏️1.3 自旋锁✏️1.4 公平锁VS非公平锁✏️1.5 可重入锁和不可重入锁✏️1.6 读写锁 📕2. 死锁✏️2.1 哲学家就餐问题✏️2.2 形成死锁的必要条件✏️2.3 如何避免死锁 &…...

DeepSeek+Dify之九多模态大模型识别图片

Dify之八添加各种在线大模型 文章目录 背景整体流程测试数据用到的节点开始列表操作LLM结束实现步骤1、新建工作流2、开始节点3、列表操作4、LLM节点(多模态大模型检索)5、结束节点测试发布导出背景 有了上一篇文章的基础,现在可以了解下多模态大模型识别图片的工作流 整体…...

软件工程(七):MQTT协议

概念 特性描述协议类型应用层协议(基于 TCP/IP)通信模式发布/订阅(Publish/Subscribe)网络开销小报文头仅 2 字节起,非常轻量保持长连接使用 Keep Alive 机制,适合持续连接的设备面向物联网广泛用于智能家…...

网络 :网络基础【网络框架认识】

网络 :网络基础【对网络的认识】 (一)网络发展(二)协议1、协议是什么?2、协议分层3、OSI七层模型4、TCP/IP五层(或四层)模型5、系统与网络的关系6、总结 (三)网络传输流程1、网络传输…...