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

news2024/7/6 18:54:38

引言 

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

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

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

其中,数据发送是一个主动的行为,我们对要发送数据的数量特点等都是知道的,比如我们通过串口发送数据,这时候,使用常规发送方式,或者结合使用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语言数组)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1049139.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通俗讲解深度学习轻量网络MobileNet-v1/v2/v3

MobileNet网络是由google团队在2017年提出的,专注于移动端或者嵌入式设备中的轻量级CNN网络。相比传统卷积神经网络,在准确率小幅降低的前提下大大减少模型参数与运算量。(相比VGG16准确率减少了0.9%,但模型参数只有VGG的1/32)。MobileNet网络…

读取.nrrd和.dcm文件格式医学图片可视化与预处理

nrrd数据格式 MITK默认会将医学图像保存为格式为NRRD的图像,在这个数据格式中包含: 1、一个单个的数据头文件:为科学可视化和医学图像处理准确地表示N维度的栅格信息。 2、既能分开又能合并的图像文件。 nrrd_options输出 {u’dimension’:…

CoreData/数据存储管理, CoreDataRelationships/关系型数据结构存储管理 的使用

1. CoreData 数据的增删改查操作 1.1 创建数据实体管理文件 点击菜单栏 File -> New -> File... -> Core Data 栏下,选择 Data Mode,创建 FruitsContainer.xcdatamodeld 文件 1.2 创建 FruitEntity 实体表 打开 FruitsContainer.xcdatamodeld 文…

Quartus医院病房呼叫系统病床呼叫Verilog,源代码下载

名称:医院病房呼叫系统病床呼叫 软件:Quartus 语言:Verilog 要求: 1、用1~6个开关模拟6个病房的呼叫输入信号,1号优先级最高;1~6优先级依次降低; 2、 用一个数码管显示呼叫信号的号码;没信号呼叫时显示0;有多个信号呼叫时,显…

2023年鄂州中级职称申报时间是什么时候呢?

鄂州在6.7月份组织了一次水平能力测试,鄂州中级职称申报时间终于出来了,关于鄂州中级职称申报的一些情况,甘建二告诉你: 一、鄂州中级职称申报时间: 1.网上申报审核时间。个人申报2023年09月27日至2023年10月10日&…

单链表操作 C实现

struct LNode { //定义一个节点 int data; //数据域 struct LNode *next; //指针域 }; 0.初始化 typedef sturct LNode{ //定义单链表结点类型 int date ; //每个结点存放一个数据元素struct LNode *next; //指针指向下…

leetCode 62.不同路径 动态规划 + 空间复杂度优化

62. 不同路径 - 力扣(LeetCode) 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” &#xf…

运行软件mfc100u.dll缺失是怎么办?mfc100u.dll丢失解决方法分享

Mfc100u.dll 丢失的问题可能困扰着许多使用计算机的用户。Mfc100u.dll 是一个重要的动态链接库文件,它包含了许多功能模块,如字符串处理、数学计算、文件操作等。当 Mfc100u.dll 文件丢失或损坏时,可能会导致许多应用程序无法正常运行&#x…

【深度学习实验】卷积神经网络(六):卷积神经网络模型(VGG)训练、评价

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. 构建数据集(CIFAR10Dataset) a. read_csv_labels() b. CIFAR10Dataset 2. 构建模型(FeedForward&…

Chrome(谷歌浏览器)如何关闭搜索栏历史记录

目录 问题描述解决方法插件解决(亲测有效)自带设置解决步骤首先打开 地址 输入:chrome://flags关闭浏览器,重新打开Chrome 发现 已经正常 问题描述 Chrome是大家熟知的浏览器,但是搜索栏的历史记录如何自己一条条的删…

学校宿舍一键视频对讲

学校宿舍一键视频对讲 大学宿舍一键视频对讲是指在大学宿舍内安装一套视频对讲系统,通过一键操作,实现与宿舍内其他人进行视频通话的功能。 该系统通常包括以下组成部分: 1. 室内终端:每个宿舍内安装一个室内终端,室…

JavaScript求数组的交集和差集

1. 求交集(从2个数组中找到相同的元素, 组成新数组, 注意去重): 1) Setfilterincludes // 求交集: const arr1 [0, 1, 2] const arr2 [3, 2, 0] function intersectSet(arr1, arr2) {return [...new Set(arr1)].filter(item>arr2.includes(item)) } const values inter…

26593-2011 无损检测仪器 工业用X射线CT装置性能测试方法

声明 本文是学习GB-T 26593-2011 无损检测仪器 工业用X射线CT装置性能测试方法. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了工业用X 射线CT 装置(以下简称CT 装置)性能测试的术语、定义、缩略语以及空间 分辨力、密度分辨率…

BChecks 自定义poc检测 - 把BurpSuite 打造成强大的漏洞扫描器

BChecks是什么? BChecks可以创建和导入的自定义扫描检查。Burp Scanner在执行其内置扫描例程的同时运行这些检查,帮助您定位扫描并使测试工作流尽可能高效。 每个BCheck都定义为一个以.bcheck文件扩展名结尾的纯文本文件。这些文件使用自定义语言来指定…

配置OSPF路由

OSPF路由 1.OSPF路由 1.1 OSPF简介 OSPF(Open Shortest Path First,开放式最短路径优先)路由协议是另一个比较常用的路由协议之一,它通过路由器之间通告网络接口的状态,使用最短路径算法建立路由表。在生成路由表时,…

Spring Cloud Netflix 教程和源码

本教程目标 想要系统地学习 Spring Cloud Netflix, 把自己的学习过程记录下来。 状态 持续更新中 微服务架构 微服务架构是一种将应用程序拆分为一组独立的、可独立部署的服务的架构模式。每个服务都运行在自己的进程中,可以独立地进行开发、测试和…

数据库管理-第108期 因Exadata存储节点操作系统空间异常的紧急处理(20230928)

数据库管理-第108期 因Exadata存储节点操作系统空间异常的紧急处理(20230928) 众所周知,明天放假了,本着对客户数据库软硬件负责任的态度,进行了一次深入彻底的软硬件巡检(就是检查包括计算节点、存储节点…

vue3中状态适配

写一个函数,在函数中定义一个对象 用于存放键值对,最后返回指定状态所对应的的值,即对象[指定状态] 的 对象的值。 在模板中把状态传入 // vue3 setup语法糖中 const formatXXXState (xxxState)>{const stateMap {键1: 值1,键2: 值2,.…

Linux-正则三剑客

目录 一、正则简介 1.正则表达式分两类: 2.正则表达式的意义 二、Linux三剑客简介 1.文本处理工具,均支持正则表达式引擎 2.正则表达式分类 3.基本正则表达式BRE集合 4.扩展正则表达式ere集合 三、grep 1.简介 2.实践 3.贪婪匹配 四、sed …

VS+Qt+opencascade三维绘图stp/step/igs/stl格式图形读取显示

程序示例精选 VSQtopencascade三维绘图stp/step/igs/stl格式图形读取显示 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对《VSQtopencascade三维绘图stp/step/igs/stl格式图形读取显示》编写…