环形缓冲区

#ifndef _CIRCLE_BUF_H //
#define _CIRCLE_BUF_H //定义宏

#include <stdint.h>
typedef struct circle_buf{
    uint32_t r;
	  uint32_t w;
	  uint32_t len;//大小
    uint8_t* buf;//buf
}circle_buf,*p_circle_buf;
//初始化
void circle__buf_init(p_circle_buf pCircleBuf,uint32_t len,uint8_t* buf);//初始化
int circle_buf_read(p_circle_buf pCircleBuf,uint8_t* pVal);//读
int cirble_buf_write(p_circle_buf pCircleBuf,uint8_t val);//写
#endif 

circle_buffer.h 

circle_buffer.c

#include <stdint.h>
#include "circle_buffer.h"


void circle_buf_init(p_circle_buf pCircleBuf, uint32_t len, uint8_t *buf)
{
	//读位置和写位置等于0 初始化
	pCircleBuf->r = pCircleBuf->w = 0;
	pCircleBuf->len = len;
	pCircleBuf->buf = buf;
}

int circle_buf_read(p_circle_buf pCircleBuf, uint8_t *pVal)
{
	//如果读位置不等于写位置 说明不空
	if (pCircleBuf->r != pCircleBuf->w)
	{
		*pVal = pCircleBuf->buf[pCircleBuf->r];
		
		pCircleBuf->r++;
		
		if (pCircleBuf->r == pCircleBuf->len)
			pCircleBuf->r = 0;
		return 0;
	}
	else
	{
		return -1;
	}
}

int circle_buf_write(p_circle_buf pCircleBuf, uint8_t val)
{
	uint32_t next_w;
	
	next_w = pCircleBuf->w + 1;
	if (next_w == pCircleBuf->len)
		next_w = 0;
	
	if (next_w != pCircleBuf->r)
	{
		//当前写位置等于val
		pCircleBuf->buf[pCircleBuf->w] = val;
		//更新写位置
		pCircleBuf->w = next_w;
		return 0;
	}
	else
	{
		return -1;
	}
}

使用:

 //先定义环形缓冲区的大小和名字
static uint8_t g_data_buf[100];
//环形缓冲区 全局变量
static circle_buf g_key_bufs;

//初始化  取址全局变量,100,全局变量
 circle_buf_init(&g_key_bufs, 100, g_data_buf);

//读取值放入环形缓冲区 把key_val放入bugs
circle_buf_write(&g_key_bufs, key_val);

 学习记录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

头真的要秃啦

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

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

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

打赏作者

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

抵扣说明:

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

余额充值