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

缓冲技术在嵌入式中的应用

引言 

在嵌入式中,不可避免地会遇到数据的收发。

其实,数据的收发有很多情况。

总体上,分为数据的收和发:

其中,数据发送是一个主动的行为,我们对要发送数据的数量特点等都是知道的,比如我们通过串口发送数据,这时候,使用常规发送方式,或者结合使用DMA都是可以的;

相较而言,数据的接收就会麻烦一些,因为接收数据,对于用户来说是一个被动响应的行为。接收数据也有很多种情况:

1、接收定长数据;

2、接收不定长数据;

3、接收的数据是随机到来的,比如串口屏的触摸发送键值到下位机,这种情况下,触摸行为是没有任何规律的,数据之间发送的间隔一般也比较长;

4、一直不断地接收大量数据,比如单片机需要一直接收串口数据;

5、接收数据后透传出去;

6、接收数据保存起来,等待上层应用访问;

以上几种情况分别如何处理呢?

以串口为例:

首先,不管是哪种情况,只要是底层接收数据,就一定要使用缓冲技术,为什么呢?

这是因为底层数据接收的速度很快,而我们处理数据的速度没那么快,如果只是简单的一两个语句来处理,比如给变量赋个值,做个简单的判断,没什么问题,如果语句多了,比如printf,也有可能来不及处理,关于这点可以参考这篇文章:

基于串口的BLE模组CC2640R2使用总结_路溪非溪的博客-CSDN博客

那么,这些情况的缓冲有何区别呢?

1、接受定长数据相对简单,使用普通串口接收或者DMA都可以;

2、接收不定长数据,就需要使用串口中断+空闲中断或者DMA+空闲中断,仍然参考:

基于串口的BLE模组CC2640R2使用总结_路溪非溪的博客-CSDN博客

3、接收数据随机到来,因为数据接收没那么快,一次可能只接受一两帧数据,所以不需要太大的缓冲区;具体参考:F103串口和DMA配合使用总结_路溪非溪的博客-CSDN博客

4、这个情况就需要相对大一些的缓冲区,因为数据来得比较快,可能还来不及处理就被覆盖了,具体参考这篇文章:F103串口和DMA配合使用总结_路溪非溪的博客-CSDN博客

5、接收数据后透传出去,这个基本都是底层的传输,所以接收缓冲后,就可以发出去,这个参考:基于串口的BLE模组CC2640R2使用总结_路溪非溪的博客-CSDN博客

6、接收数据保存起来供上层使用,这里就有个问题,底层接收数据保存起来,上层处理速度没那么快,就需要考虑一些问题,缓冲区设置多大合适呢?多久处理一次呢?

以上提到的就是缓冲区的用法,用来解决快速的数据接收和慢速的数据处理之间不匹配的问题,具体看这张图就能理解了:

其实,这里比较麻烦的也是比较常见的情况就是上面几种情况的综合:

接受不定长数据+不断接收数据帧+保存起来供上层使用。

具体参考:F103串口和DMA配合使用总结_路溪非溪的博客-CSDN博客

串口空闲中断+DMA可以解决前两个问题,再就是接收的数据需要放在一个缓冲区里面,上层应用需要时就来拿这个数据。

考虑这种场景:

电路中有连续的电压,单片机通过AD采样数据,注意,这时候连续的数据就被离散化了,只要采样率满足采样定理,就能无失真地还原出原有信号的样子。

假如我们要采的是正弦信号的RMS值,那么就是个恒定的直流量,其中有一些波动是很正常的事情。此时,数据接收后缓存起来,缓存一些数据后做个均值滤波等等处理,然后得到一个比较稳定的值,再将这个值存在一个变量中,此时,这个变量其实刷新的速率也是很快的。到这里,其实是底层的事情。

现在,我上层需要将这些数据拿来显示在屏幕上,如果来一个数据我们就显示一个数据,那么,就强迫上层跟着下层的速度,首先跟不跟得上不说,上层这么快显示数据没有什么必要,增加数据发送的负担不说,我们人眼也识别不过来,如果底层1s刷新1000个点,那我1秒去拿10个数据来显示也可以,也就是在定时器中,每隔100ms去拿一个数据,最好调整下这个间隔以适配我们人眼的观察视觉,而且,如果不这样,底层有时因为其他干扰数据发送时快时慢,我们上层显示也会时快时慢,如果定时去取值显示,就不会受底层速度的干扰,从而实现了底层快速和上层慢速的隔离,各司其职,用缓冲区作为“中介”。

就像这样拿数据显示:

另外还有一点,如果我发数据给串口屏太多太频繁,可能会影响到同时发送的其他数据从而造成卡顿。

这里面有一点值得注意,就是,如果这样显示,那不就是有很多数据没有拿到?首先,这里拿的是个RMS值,理想上是个恒定值,而且本来就是满足采样定理所采集到的离散值,从连续到离散,本来也有很多数据没采到,但是不影响效果。

到底什么是缓冲技术呢? 

缓冲区可以说是计算机中的一个连接站,用于连接计算机中高速、低速运行的部件。

作用:缓冲通常用于临时存储数据,以平衡不同速度的数据传输过程之间的差异。它可以用来解决数据传输速度不匹配的问题。

工作原理:缓冲区是一个存储区域,用于暂时保存数据,待数据传输速度对齐后再将数据发送出去。在数据传输过程中,如果数据接收速度较快,数据会被存储在缓冲区中。

数据处理: 缓冲区通常不会对数据进行处理或修改,它只是临时存储数据的容器。

可以参考这个总结:

缓冲是两种不同速度设备之间的传输信息时平滑传输过程的常用手段。

引入缓冲技术的原因:

1、  为了进一步缓和CPU和I/O设备之间速度不匹配的矛盾。

2、  提高CPU与I/O设备之间的并行性。

3、  为了减少中断次数和CPU的中断处理时间。如果没有缓冲,慢速I/O设备每传一个字节就要产生一个中断,CPU必须处理该中断。如果用了缓冲技术,则慢速的I/O设备将缓冲区填满时,才向CPU发出中断,从而减少了中断次数和CPU的中断处理时间。

4、  为了解决DMA或通道方式下数据传输的瓶颈问题。DMA或通道方式都适用于成批数据传输,在无缓冲的情况下,慢速I/O设备只能一个字节一个字节的传输信息,这造成DMA方式或通道方式数据传输的瓶颈。缓冲区的设置适应了DMA或通道方式的成批数据传输方式,解决了数据传输的瓶颈问题。

这里顺便提一下,另外还有个概念叫缓存,注意区分:

作用: 缓存用于存储已经计算过或获取过的数据,以便在后续访问时能够更快地获取数据,从而提高系统的响应速度。

工作原理: 缓存会将经常访问的数据复制到更快的存储介质中,如内存,以便在后续访问时无需再从原始数据源获取。这样能够减少数据访问时间,提高性能。

数据处理:缓存中的数据通常可以根据需要进行处理,以满足特定的访问要求。例如,可以将数据库查询结果存储在缓存中,以减少数据库访问频率。

实际应用:Web浏览器使用缓存来存储已经访问过的网页,以便下次访问同一网页时能够更快地加载。

两者主要区别如下:

用途不同:缓冲主要用于平衡数据传输速度差异,而缓存主要用于提高数据访问速度。

数据处理:缓冲不对数据进行处理,只是暂时存储,而缓存可以对数据进行处理以满足特定需求。

存储介质:缓冲通常用于暂时存储数据,存储在相同或类似的介质上,而缓存通常将数据存储在更快的存储介质中,如内存。

数据类型:缓冲可以用于各种数据类型,包括传输中的数据,而缓存通常用于经常被访问的数据。

总之,缓冲和缓存在数据处理中有着不同的作用和机制,了解它们的区别有助于更好地理解在不同情况下如何使用它们来优化数据传输和访问性能。

环形缓冲区 

可直接参考:

【数据结构】环形缓冲区介绍,原理讲解+代码实现。(内核__嵌入式__c语言数组)

相关文章:

缓冲技术在嵌入式中的应用

引言 在嵌入式中,不可避免地会遇到数据的收发。 其实,数据的收发有很多情况。 总体上,分为数据的收和发: 其中,数据发送是一个主动的行为,我们对要发送数据的数量特点等都是知道的,比如我们通过…...

vscode交叉编译cmake工程,toolchains设置

在 Visual Studio Code 中编译 CMake 项目时,使用自定义工具链(toolchains)可以很有用,特别是当你需要交叉编译或使用不同的编译器时。以下是在 Visual Studio Code 中使用自定义工具链的一般步骤,以aarch64的嵌入式为…...

MATLAB算法实战应用案例精讲-【优化算法】季节优化算法(SOA)(附MATLAB代码实现)

前言 世界上许多地方一年有四个季节:春、夏、秋、冬。每个季节的天气都不一样。随着天气的变化,生物,尤其是树木会改变它们的行为来适应天气。森林中的每一个个体都被称为一棵树。在满足终止条件之前,森林中的树木通过类似于自然界树木生命周期的四种操作:更新、竞争、播种…...

DevOps持续集成与交付

概述 Jenkins是一个支持容器化部署的、使用Java运行环境的开源软件,使用Jenkins平台可以定制化不同的流程与任务、以自动化的机制支持DevOps领域中的CI与CD,在软件开发与运维的流程中自动化地执行软件工程项目的编译、构建、打包、测试、发布以及部署&a…...

lambda的使用案例(1)

lambda的使用案例 1、分组转换为map Map<String, List<IdaasUserInfoVO>> map userWithOrgVOS1.stream().collect(Collectors.groupingBy(IdaasUserInfoVO::getOrgId));2、map循环 map.forEach(this::saveOrUpdateUser); private void saveOrUpdateUser(String …...

nodejs+vue装修公司CRM系统设计elementui

第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;技术背景 5 3.2.2经济可行性 6 3.2.3操作可行性&#xff1a; 6 3.3 项目设计目标与原则 6 3.4系统流程分析 7 3.4.1操作流程 7 3.4.2添加信息流程 8 3.4.3删除信息流程 9 第4章 系统设计 11 …...

开源博客项目Blog .NET Core源码学习(3:数据库操作方式)

开源博客项目Blog采用SqlSugar模块连接并操作数据库&#xff0c;本文学习并记录项目中使用SqlSugar的方式和方法。   首先&#xff0c;数据库连接信息放在了App.Hosting项目的appsettings.json中DbConfig节&#xff0c;支持在DbConfig节配置多个数据库连接信息&#xff0c;以…...

QT--Opencv下报错Mat/imwrite/imread找不到文件

像file not found这类错误 原因是编程系统找不到所指库文件&#xff0c;以此为例&#xff0c;排查自己的每个位置是否有误 1. .pro文件 添加opencv动态库 INCLUDEPATH /usr/include \/usr/include/opencv4 \/usr/include/opencv4/opencv2LIBS /usr/lib/aarch64-linux-gnu…...

风光储一体化能源中心 | 数字孪生智慧能源

自“双碳”目标提出以来&#xff0c;我国能源产业不断朝着清洁低碳化、绿色化的方向发展。其中&#xff0c;风能、太阳能等可再生能源在促进全球能源可持续发展、共建清洁美丽世界中被寄予厚望。风能、太阳能具有波动性、间歇性、随机性等特点&#xff0c;主要通过转化为电能再…...

JavaScript数组分组

数组分组: 含义: 数据按照某个特性归类 1. reducefn(cur, index)作为对象的key,值为按照fn筛选出来的数据 // 利用reduce分组 function group(arr, fn) {// 不是数组if (!Array.isArray(arr)) {return arr}// 不是函数if (typeof fn ! function) {throw new TypeError(fn…...

IEEE PDF eXpress系统报错:TimesNewRoman PS-BoldMT, ItalicMT, PSM

问题&#xff1a; IEEE PDF eXpress系统报错&#xff1a;Errors: Font TimesNewRomanPS-BoldMT, TimesNewRomanPS-ItalicMT, TimesNewRomanPSMT is not embedded (137x on pages 2-6) 答案&#xff1a; 主要原因是PDF的字体嵌入问题&#xff0c;可以看到下图中没有报错中的字体…...

【MATLAB源码-第40期】基于matlab的D*(Dstar)算法栅格路径规划仿真。

1、算法描述 D*算法路径规划 D*算法&#xff08;Dynamic A*&#xff09;是A*算法的一种变种&#xff0c;主要用于在地图中的障碍物信息发生变化时重新计算路径&#xff0c;而不需要从头开始。该算法适用于那些只有部分信息已知的环境中。 工作原理&#xff1a; 1. D*算法首先…...

Pikachu-xxe (xml外部实体注入漏洞)过关笔记

Pikachu-xxe过关笔记 有回显探测是否有回显file:///协议查看本地系统文件php://协议查看php源代码&#xff08;无法查看当前网页代码&#xff0c;只能看别的&#xff09;http://协议爆破开放端口&#xff08;两者的加载时间不同&#xff09; 无回显第一步第二步第三步 运行结果…...

Unity实现设计模式——责任链模式

Unity实现设计模式——责任链模式 责任链模式定义&#xff1a;将请求的发送和接收解耦&#xff0c;让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链&#xff0c;并沿着这条链传递这个请求&#xff0c;直到链上的某个接收对象能够处理它为止。 在职责链模式中&…...

Java中String转换为double类型

这次的java作业是写一个数字转换的小项目&#xff0c;其中从输入框中获取的是String类型&#xff0c;但是要进行数字操作&#xff0c;此时要用到很多操作String类型数据的方法了。 从javafx输入框中获取到String类型后&#xff0c;首先是要判断是否能转换为数字或者小数形式&a…...

不同埋深地下管线的地质雷达响应特征分析

不同埋深地下管线的地质雷达响应特征分析 前言 以混凝土管线为例&#xff0c;建立了不同埋深&#xff08;70cm、100cm、130cm&#xff09;地下管线的二维模型&#xff0c;进行二维地质雷达正演模拟&#xff0c;分析不同材质管线的地质雷达响应特征。 文章目录 不同埋深地下管…...

重新认识mysql

title: “重新认识mysql” createTime: 2022-03-06T15:52:4108:00 updateTime: 2022-03-06T15:52:4108:00 draft: false author: “ggball” tags: [“mysql”] categories: [“db”] description: “” 文章目录 title: "重新认识mysql" createTime: 2022-03-06T15:…...

系统集成|第十九章(笔记)

目录 第十九章 风险管理19.1 风险管理的概述及相关概念19.2 主要过程19.2.1 规划风险管理19.2.2 识别风险19.2.3 实施定性风险分析19.2.4 实施定量风险分析19.2.5 规划风险应对19.2.6 控制风险 上篇&#xff1a;第十八章、安全管理 下篇&#xff1a;第二十章、收尾管理 第十九…...

【Linux】Linux远程访问Windows下的MySQL数据库

1.建立Windows防火墙规则 首先需要开放windows防火墙&#xff0c;针对3306端口单独创建一条规则&#xff0c;允许访问。 打开windows安全中心防火墙与保护&#xff0c;点击高级设置 进入之后&#xff0c;点击入站规则&#xff0c;新建一条规则 新建端口入站规则 端口填写330…...

android安卓core tombstone .pb

Tombstone原理分析_内核工匠的博客-CSDN博客 android tombstone分析_tombstone 分析_良知犹存的博客-CSDN博客 Tombstone简介 当一个native程序开始执行时&#xff0c;系统会注册一些连接到debuggerd的signal handlers。针对进程出现的不同的异常状态&#xff0c;Linux kernel…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...