环形缓冲区
环形缓冲区总结
- 避免频繁的内存创建取消、分配。内存一直只用了一块
- 在通信程序中,经常使用环形缓冲区作为数据结构来存放通信中发送和接收的数据。环形缓冲区是一个先进先出的循环缓冲区,可以向通信程序提供对缓冲区的互斥访问
环形缓冲区的几个基本操作
如何申请内存空间呢?
申请内存空间
- 这里定义一个数组,数组的大小有自己来决定
接下来就要对这个数组进行读写操作了,先看看写操作。
写操作
既然是要写操作,就要知道写的地址,
- 这里的pW就是我们定义的写地址,最开始是指向零地址的
- 这里每写入一个地址,指向的地址就会增加一个
但是这里需要考虑到一个问题,当我们的pW为7的时候,这时候就会越界,这是不允许的,
想想可以用这种方法一般的用法是 if(++size==BUFFER_SIZE) size=0;
当越界时候,又从头开始
下面推荐一种方法
这种写法更加好一点,当pW=7的时候,(pW+1)% 8 =0,如下所示
读操作
读操作和写操做是一样的
环形缓冲区小结
环形缓冲区有四个要素,宏定义除外把这三个要素定义在结构体里
在读写操作的时候需要判断我们的缓冲区是否为空或者是否为满,如何判断呢???
判断缓冲区是否为空
假设我们写了四个数据,这时候pW等于4
假如我们读取了这四个数据,这时候就没有要读取的数据了,环形缓冲区的数据为空,这时候pR=pW=4;所以,只需要判断环形缓冲区读写地址是否相同就可以判断环形缓冲区里面是否为空------------pR==pW;则为空
判断缓冲区是否写满
假设当我们在写到第七位的时候,再写一位,这时候,pw=pR这时候为空???,但是这时候已经是写满了,找到一种合适的计算方法就是:(pW+1)%BUFFER_SIZE == pR 当满足这个条件的时候,就证明已经写满了,将要写的数据丢弃掉
接下来开始写环形缓冲区:
构建环形缓冲区
在.h文件中声明结构体
在.c文件中定义函数
初始化环形缓冲区
缓冲区最开始无读写数据,都指向0
写缓冲区
需要满足条件时候才写,写满了不操作,丢弃掉
读缓冲区
这里也有限制条件,缓冲区有数据的时候才读
这里就三个函数,把这三个函数声明在.h文件中声明,以便别的函数调用。
构建环形缓冲区这两个文件放在仓库了