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 							/* 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

注册测试

XxxRingBuffer多功能环形缓冲区_第1张图片

尾插测试

XxxRingBuffer多功能环形缓冲区_第2张图片

清空测试

XxxRingBuffer多功能环形缓冲区_第3张图片

头插测试

XxxRingBuffer多功能环形缓冲区_第4张图片

头取测试

XxxRingBuffer多功能环形缓冲区_第5张图片


XxxRingBuffer多功能环形缓冲区_第6张图片


XxxRingBuffer多功能环形缓冲区_第7张图片

尾取测试

XxxRingBuffer多功能环形缓冲区_第8张图片


XxxRingBuffer多功能环形缓冲区_第9张图片


XxxRingBuffer多功能环形缓冲区_第10张图片

仅读(指定长度)测试

XxxRingBuffer多功能环形缓冲区_第11张图片
XxxRingBuffer多功能环形缓冲区_第12张图片


更新日志

2024_02_01

初版发布完成


更新计划

  1. 已完结

你可能感兴趣的:(我的开源驱动,c语言,单片机,软件工程)