找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1647|回复: 0
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主
ID:344805 发表于 2018-6-4 17:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
环形存储原理:(用一个类来说明)环形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;                           
}
};

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表