<h4><strong>环形缓冲区(ringbuffer)</strong></h4>
讯享网
环形缓冲区是嵌入式系统中十分重要的一种数据结构,比如在串口处理中,串口中断接收数据直接往环形缓冲区丢数据,而应用可以从环形缓冲区取数据进行处理,这样数据在读取和写入的时候都可以在这个缓冲区里循环进行,程序员可以根据自己需要的数据大小来决定自己使用的缓冲区大小。
环形缓冲区,顾名思义这个缓冲区是环形的,那么何谓环形这个意思也很好理解,就是用一个指针去访问该缓冲区的最后一个内存位置的的后一位置时回到环形缓冲区的起点。类似一个环一样
在此之前,我们来回顾一下队列的基本概念:队列 (Queue):是一种先进先出(First In First Out ,简称 FIFO)的线性表,只允许在一端插入(入队),在另一端进行删除(出队)。
环形缓冲区是队列的一个应用,环形缓冲区(环形队列)的实现:在计算机中,也是没有环形的内存的,只不过是我们将顺序的内存处理过,让某一段内存形成环形,使他们首尾相连,简单来说,这其实就是一个数组,只不过有两个指针,一个指向列队头,一个指向列队尾。指向列队头的指针(Head)是缓冲区可读的数据,指向列队尾的指针(Tail)是缓冲区可写的数据,通过移动这两个指针(Head) &(Tail)即可对缓冲区的数据进行读写操作了,直到缓冲区已满(头尾相接),将数据处理完,可以释放掉数据,又可以进行存储新的数据了。
下面是环形缓冲区的一些数据结构定义
1.环形缓冲区控制块定义
讯享网
2.环形缓冲区状态定义
环形缓冲区实现方式
1.初始化环形缓冲区,使用静态环形缓冲区前,需要调用该函数进行初始化。该函数将把用户指定的缓冲区空间的指针传递给环形缓冲区控制块,并初始化环形缓冲区控制块的参数。
参数 :
rb ringbuffer 环形缓冲区句柄
pool 缓冲区指针
size 缓冲区大小
讯享网
2.往环形缓冲区中写入数据,调用此函数可以往指定环形缓冲区中写入指定长度的数据,如果剩余空间不足将丢弃剩余数据。
参数:
rb ringbuffer 环形缓冲区句柄

ptr 待写入数据的指针
length 待写入数据的大小,如果 length 大于剩余空间将丢弃剩余的数据
返回:实际写入字节数。
3.往环形缓冲区中强制压入数据,调用此函数可以往指定环形缓冲区中强制写入指定长度的数据,如果剩余空间不足将覆盖原有数据。
参数 :
rb ringbuffer 环形缓冲区句柄
ptr 待压入数据的指针 length 待压入数据的大小,如果 length 大于剩余空间将丢弃剩余的数据
返回 :实际写入字节数。
讯享网
4.从环形缓冲区中取出数据,调用此函数可以从环形缓冲区中读取指定长度的数据。
参数 :
rb ringbuffer 环形缓冲区句柄
ptr 取出数据的写入地址 length 待取出数据的大小
返回 :实际取出数据的字节数
5.往环形缓冲区中写入一个字节,调用此函数可以往指定环形缓冲区中写入一个字节的数据,如果剩余空间不足将写入失败。
参数:
rb ringbuffer 环形缓冲区句柄
ch 待写入数据
返回 :写入成功返回1;环形缓冲区已满,写入失败则返回0。
讯享网
6.往环形缓冲区中强制写入一个字节,调用此函数可以往指定环形缓冲区中强制写入一个字节的数据,如果剩余空间不足将覆盖原有数据。

参数 :
rb ringbuffer 环形缓冲区句柄
ch 待写入数据
返回 :写入成功返回1,如果缓冲区已满将覆盖已有数据
7.从环形缓冲区中取出一个字节的数据,调用此函数可以从环形缓冲区中读取一个字节的数据。
参数:
rb ringbuffer 环形缓冲区句柄
ch 存储待取出字节的变量
返回 :0 环形缓冲区已空,取出失败;1 成功取出
讯享网
8.获取环形缓冲区中已使用的空间大小,调用此函数可以获取环形缓冲区中已被使用的字节数。
参数: rb 环形缓冲区句柄
返回 :已使用的大小;0 则表示环形缓冲区已空
9.复位环形缓冲区,调用此函数将复位环形缓冲区,环形缓冲区控制块中的读写指针被置0。
参数 :rb ringbuffer 环形缓冲区句柄
讯享网
10.创建环形缓冲区对象,调用该函数将释放缓冲区和唤醒缓冲区控制块所占的内存空间。
参数 :size 环形缓冲区大小
11.销毁环形缓冲区,调用该函数将释放缓冲区和唤醒缓冲区控制块所占的内存空间。
参数 :rb ringbuffer 环形缓冲区句柄
讯享网

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/136413.html