XxxRingBuffer多功能环形缓冲区

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两个文件复制粘贴到自己工程内即可。

应用步骤

  1. 定义环形缓冲区对象指针;
  2. 定义一个数组当环形缓冲区的数据存储内存;
  3. 分配内存空间给环形缓冲区对象指针;
  4. 注册;
  5. 根据实际应用场景选择插入/提取/仅读等函数;
应用模版
#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保存数据存储缓冲区的起点
pBufEndxxx保存数据存储缓冲区的终点
pTailxxx尾插时做写指针,尾取时做读指针
pHeadxxx头插时做写指针,头取时做读指针

测试结果

测试源码在./Test/main.c

该测试环境为:linux

进入Test文件夹

cd ./Test

编译

gcc main.c ../XxxRingBuffer.c -o main

运行

./main

注册测试

在这里插入图片描述

尾插测试

在这里插入图片描述

清空测试

在这里插入图片描述

头插测试

在这里插入图片描述

头取测试

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

尾取测试

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

仅读(指定长度)测试

在这里插入图片描述
在这里插入图片描述


更新日志

2024_02_01

初版发布完成


更新计划

  1. 已完结
  • 20
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小星星星球

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值