该程序不依赖任何外部代码,只有ringbuf.c,ringbuf.h两个文件。
c语言环形队列代码,先入先出。
ringbuf.h
/**********************************
* @file ringbuf.h
* @author yujinjiang
* @date 2024.1.10
* *******************************/
#ifndef __RING_BUF_H_
#define __RING_BUF_H_
#include "stdint.h"
typedef struct
{
uint8_t *buf;
int32_t wp;
int32_t rp;
int32_t size;
int32_t freesize;
}ringbuf_t;
uint8_t ringbuf_isEmpty(ringbuf_t *ringbuf);
void ringbuf_init(uint8_t *buf,uint32_t size_byte,ringbuf_t *ringbuf);
//return 0:false 1:success
uint8_t ringbuf_read(uint8_t *buf,uint32_t size_byte,ringbuf_t *ringbuf);
//return 0:false 1:success
uint8_t ringbuf_write(uint8_t *buf,uint32_t size_byte,ringbuf_t *ringbuf);
uint32_t ringbuf_data_size_get(ringbuf_t *ringbuf);
uint32_t ringbuf_free_size_get(ringbuf_t *ringbuf);
void ringbuf_clear(ringbuf_t *ringbuf);
#endif
ringbuf.c
/**********************************
* @file ringbuf.c
* @author yujinjiang
* @date 2024.1.10
* *******************************/
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include "ringbuf.h"
#define RINGBUF_DEBUG_EN (0)
uint8_t ringbuf_isEmpty(ringbuf_t *ringbuf)
{
if(ringbuf->freesize == ringbuf->size){
ringbuf_clear(ringbuf);
return 1;
}
else{
return 0;
}
}
void ringbuf_init(uint8_t *buf,uint32_t size_byte,ringbuf_t *ringbuf)
{
memset(buf,0,size_byte);
ringbuf->buf = buf;
ringbuf->wp = 0;
ringbuf->rp = 0;
ringbuf->size = size_byte;
ringbuf->freesize = ringbuf->size;
}
uint8_t ringbuf_read(uint8_t *buf,uint32_t size_byte,ringbuf_t *ringbuf)
{
uint8_t *pbuf = (uint8_t*)ringbuf->buf;
uint32_t size = ringbuf->size;
if(ringbuf_isEmpty(ringbuf)){
#if RINGBUF_DEBUG_EN
printf("read false : buffer null!!\n");
#endif
return 0;
}
if(size_byte > ringbuf_data_size_get(ringbuf)){
return 0;
}
if(ringbuf->wp >= ringbuf->rp){
memcpy(buf,&ringbuf->buf[ringbuf->rp],size_byte);
ringbuf->rp += size_byte;
}
else{
memcpy(buf,&pbuf[ringbuf->rp],size - ringbuf->rp);
memcpy(&buf[size - ringbuf->rp],pbuf,size_byte - (size - ringbuf->rp));
ringbuf->rp = size_byte - (size - ringbuf->rp);
}
ringbuf->freesize += size_byte;
return 1;
}
uint8_t ringbuf_write(uint8_t *buf,uint32_t size_byte,ringbuf_t *ringbuf)
{
uint8_t *pbuf = (uint8_t*)ringbuf->buf;
uint32_t size = ringbuf->size;
if(ringbuf_free_size_get(ringbuf) < size_byte){
#if RINGBUF_DEBUG_EN
printf("write false: buffer full!\n");
#endif
return 0;
}
if(ringbuf_isEmpty(ringbuf)){
memcpy(pbuf,buf,size_byte);
ringbuf->wp = size_byte;
ringbuf->freesize -= size_byte;
return 1;
}
if(size - ringbuf->wp >= size_byte){
memcpy(&pbuf[ringbuf->wp],buf,size_byte);
ringbuf->wp += size_byte;
}
else{
memcpy(&pbuf[ringbuf->wp],buf,size - ringbuf->wp);
memcpy(&pbuf[0],&buf[size - ringbuf->wp],size_byte - (size - ringbuf->wp));
ringbuf->wp = size_byte - (size - ringbuf->wp);
}
if(ringbuf->wp == ringbuf->size){
ringbuf->wp = 0;
}
ringbuf->freesize -= size_byte;
return 1;
}
uint32_t ringbuf_data_size_get(ringbuf_t *ringbuf)
{
uint32_t reg = 0;
if(ringbuf_isEmpty(ringbuf)){
return 0;
}
else{
reg = ringbuf->size - ringbuf->freesize;
}
return reg;
}
uint32_t ringbuf_free_size_get(ringbuf_t *ringbuf)
{
return ringbuf->freesize;
}
void ringbuf_clear(ringbuf_t *ringbuf)
{
ringbuf->wp = 0;
ringbuf->rp = 0;
ringbuf->freesize = ringbuf->size;
}