#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);
学习记录