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