前言
作为一个非科班的人员来说,第一次听到环形缓存区,觉得是一个很高大上的词汇,后来研究发下,其实现方法比较简单,但是其却解决了数据存取的大问题。下面就以非科班的角度来叙述一下环形缓存区(简称:环缓(嬛嬛))。
一、环缓是什么?
一开始我认为环形缓存区是一个“环”,其实不然,他就是一个存储区域,我们用指针(或者回环的策略)将其首位相连,形成一个貌似头和尾连接起来的环形区域。
如下图所示,当数据从区域0按顺序向下存储到区域7后,接下来会继续向区域0存数据。
二、如何使其首尾相连
1.引入库
如上图一个8个字节的数组,INT data[8],read是代表数据读到数组的第几个数了,write是代表数据写入到数组的第几个数了。
我们数据写入是从data[0]开始,写到data[7],然后当写入第9个字节的数据时,写入data[0],继续向下写。在数据写入data[0]后,wirte指向下一个将要写入的空间data[1]。
读取数据也是如此。
读取数据和写入数据是相对独立的。
我们要保证数据不被新写入的数据覆盖掉,需要在被写入之前,把数据读出来。
2.结构体示例
代码如下(示例):
typedef struct //环形缓存区结构体
{
INT8U RxBuf[RX_BUF_SIZE];//接收缓存数组
INT16U rx_write,rx_read;//接收读、写指针
} RxDataTypeDef;
总结
当然本文中的read和write还不能称之为指针,是数组的下标,但是一般数组是存储位置连续的,所以这个下标和指针效果一致。但是简单用起来没啥问题。若有问题,可以私信我,我很愿意和大家友好交流。(在写道本文这里,我想起,环形缓存区的进阶应该是链表吧,链表就是可能不连续的存储位置,用指针连接起来的。)