环形buffer 环形数组等原理例程

环形存储原理:(用一个类来说明)环形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;                           
 }
};



版权声明:本文为m0_37738150原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。