前言
本篇文章将为大家介绍一下什么是环形缓冲区,在很多场合都可以使用环形缓冲区,他既可以进行数据的写入也可以进行数据的读取,使用环形缓冲区可以减小数据丢失的风险,更加保证了数据的安全性和有效性。
一、什么是环形缓冲区?
在通信程序中,经常使用环形缓冲器作为数据结构来存放通信中发送和接收的数据。环形缓冲区是一个先进先出的循环缓冲区,可以向通信程序提供对缓冲区的互斥访问。
二、为什么要使用环形缓冲区及环形缓冲区实用场景
环形缓冲区说白了就是一个数组,这个数组里面能存储非常多的数据。使用环形缓冲区可以帮助我们保证数据的安全及数据的可靠性。
环形缓冲区可以用于各种信息的存放。
1.多次按下按键
有的设备性能不是很好,在多次操作按键后,可能就只有少数几次按键是有效的,因为设备无法快速读取这些按键值并且进行处理,我们可以将按键的数据一个个的存放进环形缓冲区,处理时再去一个个的取出这些就可以保证数据不会被丢失。
三、环形缓冲区原理及代码的编写
原理
环形缓冲区就是一个很大的数组,我们给他分配一个读指针和一个写指针。
当写入数据时W指向下一个数组的地址,R不变。
同样的道理当读取数据时R加加,W不变。
环形缓冲区为空的条件,W和R同时等于0。
环形缓冲区为满的条件,W+1等于环形缓冲区的大小。
代码编写
/*BUF_SIZE就是一个宏大小一般定义为128*/ static int Buf[BUF_SIZE]={0}; //缓冲区 static int W=0; //写指针 static int R=0; //读指针 /*环形缓冲区初始化*/ void Buff_Init(void) { Buff_Clear(); } /*写数据*/ void Buff_Write(int data) { if((W+1)%BUF_SIZE!=R) //队列未满 { Buf[W]=data; W=(W+1)%BUF_SIZE; } } /*读数据*/ int Buff_Read(void) { int data=0; if(R!=W) //队列非空 { data=Buf[R]; R=(R+1)%BUF_SIZE; } return data; } /*环形缓冲区清0*/ void Buff_Clear(void) { W=0; R=0; }
总结
环形缓冲区在嵌入式开发中会经常使用到,我希望大家能够将这个知识点牢记于心。