循环缓冲区

来源:互联网 发布:手机访问mac本地网站 编辑:程序博客网 时间:2024/05/15 02:06

 

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

 

}

 

原创粉丝点击