循環緩衝區

 

循環緩衝區需要讀端和寫端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;

 

}

 

發佈了14 篇原創文章 · 獲贊 8 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章