循环缓冲区
来源:互联网 发布:手机访问mac本地网站 编辑:程序博客网 时间:2024/05/15 02:06
循环缓冲区需要读端和写端2个指针来标定一块buffer,写端写到buffer的边界的时候,会跳到另一个边界继续写,直到写端指针和读端指针重合,这个时候缓冲区FULL状态,不可以再写,读端会一直读数据直到和写端指针重合,这个时候缓冲区为EMPTY状态,不可以再读。比如下面这段缓冲,存储了数字数据,r和w分别是读写指针|-------------------------------------------|1 2 3 4 5r w当读了2个数据1和2,同时写入了1个6的时候如下:|-------------------------------------------| 3 4 5 6 r w当上面步骤一直到写到buffer临界区时候:|-------------------------------------------| 8 9 0 r w这个时候再写5和9就是这样:会循环到开头继续写。|-------------------------------------------| 9 8 9 0 5 w r 这样的循环缓冲对流stream的实现非常的实用,空间利用率很高。
相关函数操作:
(1) 定义循环缓存:
#define MAX_BUFF_LEN 1024 // 定义缓存大小
typedef struct // 定义数据结构
{
uint data;
}DATA_BUFF_T;
typedef struct // 定义缓存结构
{
uint readPos;
uint writePos;
DATA_BUFF_T DATA[MAX_BUFF_LEN];
}DATAS_BUFF_T;
static DATAS_BUFF_T Buff0; // 定义缓存
(2)初始化循环缓存:
Buff0.readPos = 0;
Buff0.writePos = 0;
(3)判断缓存中是否有数据:
BOOL HaveData_Buff(void)
{
if (Buff0.readPos != Buff0.write.Pos)
{
return 1;
}
else
{
return 0;
}
}
(4)向缓存中写数据:
BOOL WriteData(uint data)
{
uint nextPos;
nextPos = (Buff0.writePos + 1) % MAX_BUFF_LEN;
if (nectPos != Buff0.readPos) // 判断缓存是否满
{
Buff0.DATA[writePos].data = data;
Buff0.writePos = nextPos;
return 1;
}
else
{
return 0;
}
}
(5)从缓存中读数据:
uint ReadData(void)
{
uint dataTemp;
if (HaveData_Buff() == 1)
{
dataTemp = Buff0.DATA[ReadPos].data;
ReadPos = (ReadPos + 1) % MAX_BUFF_LEN;
}
return dataTemp;
}
- 循环缓冲区
- 循环缓冲区
- 循环缓冲区
- 循环缓冲区类
- 键盘输入循环缓冲区问题
- 队列实现循环缓冲区
- 循环缓冲区的定义
- boost 循环缓冲区
- Linux中的循环缓冲区
- Android 循环缓冲区
- 队列实现循环缓冲区
- C++版循环缓冲区类
- 循环缓冲区的一点笔记
- Linux内核中的循环缓冲区
- Linux内核中的循环缓冲区
- linux内核中的循环缓冲区
- 循环缓冲区(数据块)
- 串口实用的循环缓冲区
- undo表空间
- 临时表空间
- Muduo 网络编程示例之八:用 Timing wheel 踢掉空闲连接
- java多线程总结
- profile 小结
- 循环缓冲区
- 代码让UIImage具有渐变效果
- (转自北邮人论坛)分手之后还能做朋友吗?
- Android控件之AutoCompleteTextView、MultiAutoCompleteTextView探究
- WinSock重叠I/O模型
- 是爱是恨
- Android 获取短信会话列表
- 十个境界
- 卡耐基人性的弱点读后感