循环缓冲区

 

循环缓冲区需要读端和写端2个指针来标定一块buffer,写端写到buffer的边界的时候,会跳到另一个边界继续写,直到写端指针和读端指针重合,这个时候缓冲区FULL状态,不可以再写,读端会一直读数据直到和写端指针重合,这个时候缓冲区为EMPTY状态,不可以再读。
比如下面这段缓冲,存储了数字数据,r和w分别是读写指针

|-------------------------------------------|
1  2  3  4  5
r                 w

当读了2个数据1和2,同时写入了1个6的时候如下:
|-------------------------------------------|
      3  4  5  6
      r              w

当上面步骤一直到写到buffer临界区时候:
|-------------------------------------------|
                                  8  9  0  
                                  r           w

这个时候再写5和9就是这样:会循环到开头继续写。
|-------------------------------------------|
 9                                 8  9  0  5
    w                              r        

这样的循环缓冲对流stream的实现非常的实用,空间利用率很高。
相关函数操作:

(1)    定义循环缓存:

#define   MAX_BUFF_LEN     1024    // 定义缓存大小

typedef struct    // 定义数据结构

{

    uint    data;

}DATA_BUFF_T;

typedef struct    // 定义缓存结构

{

    uint    readPos;

    uint    writePos;

    DATA_BUFF_T    DATA[MAX_BUFF_LEN];

}DATAS_BUFF_T;

static DATAS_BUFF_T   Buff0;    // 定义缓存

(2)初始化循环缓存:

Buff0.readPos = 0;

Buff0.writePos = 0;

(3)判断缓存中是否有数据:

BOOL HaveData_Buff(void)

{

    if (Buff0.readPos != Buff0.write.Pos)

    {

        return 1;

    }

    else

    {

        return 0;

    }

}

(4)向缓存中写数据:

BOOL WriteData(uint data)

{

    uint    nextPos;

    nextPos = (Buff0.writePos + 1) % MAX_BUFF_LEN;

    if (nectPos != Buff0.readPos)    // 判断缓存是否满

    {

        Buff0.DATA[writePos].data = data;

        Buff0.writePos = nextPos;

        return 1;

    }

    else

    {

        return 0;

    }

}

(5)从缓存中读数据:

uint ReadData(void)

{

    uint dataTemp;

    if (HaveData_Buff() == 1)

    {

        dataTemp = Buff0.DATA[ReadPos].data;

        ReadPos = (ReadPos + 1) % MAX_BUFF_LEN;

    }

    return  dataTemp;

 

}

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值