XxxRingBuffer
介绍
简介
C语言实现的非传统的多功能环形缓冲区,满足先进先出(队列)、后进先出(栈)、数据窗口等多种场景需求。
获取方式
特性
- 灵活,提供了头插/尾插/头取/尾取/仅读不取/是否满/是否有数据/有多少数据/有多少空位/清空的接口,可自由组合应对不同场景需求;
- 主动插入数据导致已满时,允许数据覆盖,也可以组合一些接口,避免数据覆盖;
本人实际应用场景
1. 数据采集(ADC,传感器数据);
2. 异步数据处理,如通信数据(串口);
期待别的小伙伴能应用到其他的场景中,最大化开发驱动潜力
格式
编码格式:UTF-8
注释格式:doxygen
文件介绍
README_Picture
README文档内用到的图片
Test
测试程序;
LICENSE
许可证,遵循MIT协议
README.md
说明文档
XxxRingBuffer.c 和 XxxRingBuffer.h
核心代码
注意事项
- 如果属于临界资源,请自行实现临界保护;
- 实际有效的环形缓冲区最大长度为注册长度-1;
- 直接使用插入函数造成环形缓冲区已满是允许数据覆盖的,如果不想出现这种情况,请利用
XxxRingBuffer_IsFull()
与XxxRingBuffer_HowManyIdle()
结合插入函数自行二次封装; - 当消费速度大于生产速度(不会出现数据覆盖),且尾插头取或头插尾取时,是支持同时插取的(支持一个任务插同时一个任务取),即虽是临界资源但允许无需临界保护。注意同时插或同时取的任务仅限数量一(禁止多个任务同时插,或多个任务同时取,这时就需要临界保护);
使用流程
移植
把XxxRingBuffer.c与XxxRingBuffer.h两个文件复制粘贴到自己工程内即可。
应用步骤
- 定义环形缓冲区对象指针;
- 定义一个数组当环形缓冲区的数据存储内存;
- 分配内存空间给环形缓冲区对象指针;
- 注册;
- 根据实际应用场景选择插入/提取/仅读等函数;
应用模版
#include "XxxRingBuffer.h"
#include <stdlib.h> /* malloc */
STR_XxxRingBuffer* m_pRBuf; /**< 1.环形缓冲区对象指针 */
unsigned char m_buf[10]; /**< 2.环形缓冲区的数据存储内存 */
int main(void)
{
int tempFlag;
m_pRBuf = (STR_XxxRingBuffer*)malloc(XxxRingBuffer_GetSize()); /* 3.给环形缓冲区对象申请空间 */
if(NULL == m_pRBuf)
{
printf("申请堆空间失败\n");
return 0;
}
tempFlag = XxxRingBuffer_Register(m_pRBuf, m_buf, sizeof(m_buf)); /* 4.注册环形缓冲区 */
if(0 != tempFlag)
{
printf("注册失败[%d]\n", tempFlag);
return 0;
}
else
{
printf("注册成功\n");
}
/*
5.根据实际应用场景选择插入/提取/仅读等函数
*/
while(1)
{
}
return 0;
}
用法举例
1. 尾插头取/头插尾取,即先进先出。若是严格的队列,可加上“有多少空位”的判断再选择插入长度,防止数据覆盖;
2. 尾插尾取/头插头取,即后进先出。若是严格的栈,可加上“有多少空位”的判断再选择插入长度,防止数据覆盖;
3. 尾插+仅读不取,即数据窗口;
代码说明
源文件XxxRingBuffer.c
数据结构
STR_XxxRingBuffer结构体
struct _STR_XxxRingBuffer{
unsigned char* pBuf; /**< 缓冲区起点指针 */
unsigned char* pBufEnd; /**< 缓冲区末尾指针 */
unsigned char* pTail; /**< 尾指针 */
unsigned char* pHead; /**< 头指针 */
};
成员 |
调用者
初始化/读/写 权限 | 赋值范围限制 | 作用 |
---|---|---|---|
pBuf | ✔xx | 保存数据存储缓冲区的起点 | |
pBufEnd | xxx | 保存数据存储缓冲区的终点 | |
pTail | xxx | 尾插时做写指针,尾取时做读指针 | |
pHead | xxx | 头插时做写指针,头取时做读指针 |
测试结果
测试源码在./Test/main.c
该测试环境为:linux
进入Test文件夹
cd ./Test
编译
gcc main.c ../XxxRingBuffer.c -o main
运行
./main
注册测试
尾插测试
清空测试
头插测试
头取测试
尾取测试
仅读(指定长度)测试
更新日志
2024_02_01
初版发布完成
更新计划
- 已完结