055-73109823
当前位置:主页»关于kaiyun»市政环卫»

嵌入式硬件通信接口:使用RingBuffer处理数据(二)详细设计过程

文章出处:kaiyun 人气:发表时间:2023-12-10 21:26
本文摘要:经过上一篇《嵌入式硬件通信接口-用于RingBuffer处置数据(一)》非常简单理解循环缓冲区,读书代码后,接着开始设计自己的循环缓冲区功能模块。设计思路这里设计的难题在于,如何把触tail这个写出地址,每减少一个数据时tail自减,在写出的过程中,如果用于缓冲区的所有空间,那么head相等tail的时候,这个情况有可能是空或者剩,必须在程序设计时候,多特注意。

kaiyun

经过上一篇《嵌入式硬件通信接口-用于RingBuffer处置数据(一)》非常简单理解循环缓冲区,读书代码后,接着开始设计自己的循环缓冲区功能模块。设计思路这里设计的难题在于,如何把触tail这个写出地址,每减少一个数据时tail自减,在写出的过程中,如果用于缓冲区的所有空间,那么head相等tail的时候,这个情况有可能是空或者剩,必须在程序设计时候,多特注意。在实际项目用于中,仍必须考虑到的两个问题:读书多个字节时,缓冲区内格式化数量比用户想读的个数较少,这时候是稿子节把格式化的都读出来,还是必要报错?写出多个字节时,缓冲区内可用数量比用户想写的个数较少,这时候是稿子节把可用的都写出剩,还是必要报错?鉴于这样的问题,在读多字节和写出多字节这两个模块上减少一个变量mode,用作原作模块在读取多字节时遇上长度超出范围,是稿子节之后处置还是必要报错。还有,比起于上一篇文章中参照的源码,这里的设计思路使用的是地址指针的方式,而不是偏移量。

并且为了区别于缓冲区空或者剩,将壮烈牺牲掉一个字节的空间:当缓冲区机的时候head相等tail,当缓冲区剩的时候head在tail邻接的后一个方位。本次的设计,用于head指向缓冲区中可读数据的首地址,用于tail指向缓冲区中可读数据的末地址(同时这也是可用数据的首地址):数据流是5504180207B7这样的一连串16十进制数,接收端再行接到的是0x55,后接到的是0x04,以这样的顺序稿子节通过物理层模块接管。

这也是一个数据包的常规帧结构,也合乎人从左到右的读者顺序。所以在这里以head指向的是数据包的头,tail指向数据包的尾,head到tail之间就是一个可读数据的范围,同时,tail指向的是可用区域的首地址,当有新的数据进去时,新的数据不会被从tail地址之后写出到内存,而后tail在环内递减。告诉了循环缓冲区的这几个属性:缓冲区大小、缓冲区在内存中的地址范围、存取数据时的读取地址。

可根据这些属性,结构一个循环缓冲区的结构体:typedefstruct{uint32_tsize;uint8_t*head;uint8_t*tail;uint8_t*buff;}rb_t;ringbuffer缩写rb,其中size回应用户申请人顺利的或定义的buffer空间大小;head是一个地址指针,指向缓冲区读书的首地址;tail也是个地址指针,指向缓冲区读书的末地址(也就是写出的首地址);buff还是一个指针,仍然指向用户定义或者程序动态申请人的内存buffer首地址。当我们必须用于环形缓冲区前,必须定义数组变量或者申请人内存,作为数据实际存储的地方,同时定义一个rb_t的结构体,用作关联数组变量或者内存空间。功能模块将已完成以下模块:初始化可读书数量可写出数量读书一个字节读书多个字节写出一个字节写出多个字节查阅登录位移的数据查阅登录数据否在缓冲区并取其在内存的地址废黜清空关于命名,不得已做到个解释:dcclib是DigCore_Library的缩写,这是功能模块库层的代码;rb是ringbuffer模块缩写。初始化初始化的目的是把用户定义的即将用于的数组,与结构体变量关联一起,先前的操作者瓦解数组,必要操作者结构体变量,于是以如此,结构体变量的初始化后,将对size、head、tail、buff各个成员赋值。

kaiyun

(图片额.)可读书数量head指向的是可读数据的首地址,该地址内是有数据可以读书的;tail指向的是可读数据的末地址,该地址内没数据可读书,同时tail指向的是一个机的字节,作为写出的首地址。可写出数量这个必须注意的是总有一个字节空间不能写出,因此size大小的空间内,除了可读书,只剩就是一个空字节和可用数量。读书一个字节读书一个字节时,基于指针地址的操作者模式,必须注意的是读书指针自增后多达缓冲区的范围时,将读书指针调头返回缓冲区的接续方位。读书多个字节读书多个字节,必定是基于读书一个字节的基础上构建的。

这里比起于前一篇文章提及的参照项目源码,有所不同的是减少了读模式的自由选择,当要读的数据个数小于可读书数量时,可以利用mode来自由选择否依然稿子节地把不读的都读出来。如果在调用模块时mode划为FORCE的强迫加载,要读的数据个数小于可读书数量时,将以RET_RB_RDWRN的错误回到码,目的解释加载的数据严重不足,但是也早已把格式化的都朗读了!。


本文关键词:kaiyun,嵌入式,硬件,通信,接口,使用,RingBuffer,处理,经

本文来源:kaiyun-www.wozhuisu.com

同类文章排行

最新资讯文章

Copyright © 2009-2023 www.wozhuisu.com. kaiyun科技 版权所有  http://www.wozhuisu.com  XML地图  kaiyun·开云(中国)官方网站