环形存储原理:(用一个类来说明)环形buff是先进先出,有两个指针,一个指示在尾部放数据,一个指示在首部取出数据,
最开始都在0的位置,比如用在串口接受一个数据时,并不马上处理,用的时候再取出。
class RingBuffer
{
private:
uint8_t* Buffer; //类似一个数组的指针
uint16_t Size; //数据大小
uint16_t BeginPos; //头部指针,实际并不是指针类型,算是一个标记
uint16_t EndPos; //尾部指针,实际并不是指针类型,算是一个标记
uint8_t m_IsFull; //buffer是否满了
public:
void putchar(char ch) //存一个数据
{
Buffer[EndPos] = ch; //存
EndPos++; //指针加一
if(EndPos>Size) //存的指针超过数组size,则返回0位置
{EndPos=0;}
}
uint8_t getchar(void) //取一个数据
{
uint8_t ch;
ch = Buffer[BeginPos]; //取
BeginPos++; //指针加一
return ch;
}
void Ringisfull() //判断环形buffer是否满了
{
if (BeginPos == EndPos) //在最初始化状态时,BeginPos =0,EndPos=0,
//比如:当Endpos跑满一圈回到0,而BeginPos一直没人来取数据,那么两者重合,buffer满
//只有等BenginPos处被取走数据,那么才能接着存。否则数据满了还没处理,是不能覆盖的
m_IsFull = 1;
}
};
|