自已项目上一直用的循环buffer的源码,可用于中断。
c文件
#include "buffer.h"
#if C_CODE //c code
void DataBufferInit(DataBuffer *intance)
{
if(NULL == intance){
return;
}
intance->last_recv_time = 0;
intance->first = 0;
intance->last = 0;
intance->full = 0;
}
uint16_t BufferAvailable(DataBuffer *intance)
{
if(NULL == intance){
return 0;
}
uint16_t len = 0;
if(intance->last > intance->first)
{
len = intance->last - intance->first;
}else if(intance->last < intance->first)
{
len = (BUFFER_DAT_LEN - intance->first) + intance->last;
}else if(intance->last == intance->first)
{
len = 0;
}
return len;
}
uint8_t BufferRead(DataBuffer *intance)
{
if(NULL == intance){
return 0;
}
uint8_t dat = 0;
if( BufferAvailable(intance) )
{
dat = intance->dat[intance->first++];
intance->first %= BUFFER_DAT_LEN;
}
return dat;
}
void BufferWrite(DataBuffer *intance ,uint8_t dat)
{
if(NULL == intance){
return;
}
if(BufferAvailable(intance) < BUFFER_DAT_LEN - 1)
{
intance->dat[intance->last++] = dat;
intance->last %= BUFFER_DAT_LEN;
}
UpdateTime(intance ,curr_time_ms());
}
//有问题,没有判断剩余长度
void BufferWriteMulti(DataBuffer *intance ,uint8_t *dat , uint16_t len)
{
if(NULL == intance || NULL == dat){
return;
}
if(len >= BUFFER_DAT_LEN)
{
return;
}
for(uint16_t i = 0 ; i < len ; i++)
{
if(BufferAvailable(intance) < BUFFER_DAT_LEN)
{
intance->dat[intance->last++]=*dat++;
intance->last%=BUFFER_DAT_LEN;
}
}
}
void BufferClear(DataBuffer *intance)
{
if(NULL == intance){
return;
}
intance->first = intance->last;
}
void UpdateTime(DataBuffer *intance ,uint64_t time_)
{
if(NULL == intance){
return;
}
intance->last_recv_time = time_;
}
#else //c++ code
uint32_t curr_time_ms();
uint16_t DataBuffer::BufferAvailable()
{
uint16_t len = 0;
if(intance.last > intance.first)
{
len = intance.last - intance.first;
}else if(intance.last < intance.first)
{
len = (BUFFER_DAT_LEN - intance.first) + intance.last;
}else if(intance.last == intance.first)
{
len = 0;
}
return len;
}
uint8_t DataBuffer::BufferRead()
{
uint8_t dat = 0;
if( BufferAvailable() )
{
dat = intance.dat[intance.first++];
intance.first %= BUFFER_DAT_LEN;
}
return dat;
}
void DataBuffer::BufferWrite(uint8_t dat)
{
if(BufferAvailable() < BUFFER_DAT_LEN - 1)
{
intance.dat[intance.last++] = dat;
intance.last %= BUFFER_DAT_LEN;
}
UpdateTime(curr_time_ms());
}
//有问题,没有判断剩余长度
void DataBuffer::BufferWriteMulti(uint8_t *dat , uint16_t len)
{
uint16_t i = 0;
if(len >= BUFFER_DAT_LEN)
{
return;
}
for( ; i < len ; i++)
{
if(BufferAvailable() < BUFFER_DAT_LEN)
{
intance.dat[intance.last++]=*dat++;
intance.last%=BUFFER_DAT_LEN;
}
}
}
void DataBuffer::BufferClear()
{
intance.first = 0;
intance.last = 0;
}
void DataBuffer::UpdateTime(uint64_t time_)
{
intance.last_recv_time = time_;
}
#endif
h文件
#ifndef _BUFFER_H_
#define _BUFFER_H_
//循环buffer,可以用于中断,当缓冲区满了以后不会再写进buffer(不会冲掉之前的数据)
#include "main.h"
#define BUFFER_DAT_LEN 64
#define curr_time_ms GetSysTime
#define CPP_CODE 0
#define C_CODE !CPP_CODE
#if C_CODE //c code
typedef struct buffer_struct
{
uint16_t last; //写数据的位置
uint16_t first; //读数据的位置
uint16_t dat[BUFFER_DAT_LEN];
uint64_t last_recv_time;
bool full;
}DataBuffer;
void DataBufferInit(DataBuffer *);
uint16_t BufferAvailable(DataBuffer *); //计算buffer长度不能用标志位,避免临界区
uint8_t BufferRead(DataBuffer *);
void BufferWrite(DataBuffer * ,uint8_t dat);
void BufferClear(DataBuffer *);
void BufferWriteMulti(DataBuffer * ,uint8_t *dat , uint16_t len);
void UpdateTime(DataBuffer *intance ,uint64_t time_);
#else //c++ code
class DataBuffer
{
public:
typedef struct buffer_struct
{
uint16_t last; //写数据的位置
uint16_t first; //读数据的位置
uint16_t dat[BUFFER_DAT_LEN];
uint64_t last_recv_time;
bool full;
buffer_struct()
{
last_recv_time = 0;
first = 0;
last = 0;
full = 0;
}
}BufferStruct;
BufferStruct intance;
uint16_t BufferAvailable(); //计算buffer长度不能用标志位,避免临界区
uint8_t BufferRead();
void BufferWrite(uint8_t dat);
void BufferClear();
void BufferWriteMulti(uint8_t *dat , uint16_t len);
void UpdateTime(uint64_t time_);
};
#endif
#endif