C語言 ringBuffer 實現

2021-10-06 01:13:43 字數 1860 閱讀 9544

ringbuffer 稱作環形緩衝,也有叫 circlebuffer 的。就是取記憶體中一塊連續的區域用作環形緩衝區的資料儲存區。這塊連續的儲存會被反覆使用,向 ringbuffer 寫入資料總是從寫指標的位置開始,如寫到實際儲存區的末尾還沒有寫完,則將剩餘的資料從儲存區的頭開始寫;從該 ringbuffer 讀出資料也是從讀指標的位置開始,如讀到實際儲存區的末尾還沒有讀完,則從儲存區的頭開始讀剩下的資料。

為了保證寫入的資料不會覆蓋 ringbuffer 裡還沒有被讀出的資料,以及讀出的資料不是已經讀出過的舊資料,需要使用乙個變數 btoread 表示該 ringbuffer 中有效的資料。使用變數 length 表示該環形緩衝區中真實的緩衝大小。使用指標 source 指向實際的快取位址。

使用 ringbuffer 讀寫資料,要確保讀寫資料的速率和實際緩衝區大小的匹配。如果不匹配,可能會導致溢位,比如讀資料太慢,而寫資料很快,實際的快取區又太小,導致整個緩衝區都是還沒有被讀出的資料,此時新的資料就無法寫入。正確使用 ringbuffer 可以保證資料的連續,降低讀模組和寫模組之間的耦合性。更多關於生產者-消費者模型的知識可以看這篇部落格。

ringbuffer 的結構體

typedef struct ringbuffer_t;
建立 ringbuffer 函式

void create_ringbuffer(ringbuffer_t *ringbuf, uint8_t *buf, uint32_t buf_len)

清空 ringbuffer 函式

void clear_ringbuffer(ringbuffer_t *ringbuf)

讀資料函式

uint32_t write_ringbuffer(uint8_t *buffer, uint32_t size, ringbuffer_t *ringbuf)

else

ringbuf->bw = (ringbuf->bw + size) % ringbuf_len;

ringbuf->btoread += size;

return size;

}

寫資料函式

uint32_t read_ringbuffer(uint8_t *buffer, uint32_t size, ringbuffer_t *ringbuf)

else

ringbuf->br = (ringbuf->br + size) % ringbuf_len;

ringbuf->btoread -= size;

return size;

}

獲取 ringbuffer 中的有效資料

uint32_t get_ringbuffer_btoread(ringbuffer_t *ringbuf)

獲取 ringbuffer 的長度

uint32_t get_ringbuffer_length(ringbuffer_t *ringbuf)

對 ringbuffer 的使用,首先需要又一塊真實並且連續的資料儲存區。可以使用 malloc 從堆區分配,也可以使用乙個陣列。

在寫資料之前,需要對此時 ringbuffer 的剩餘空間和要寫入資料的大小進行比較。剩餘空間使用長度 length 減去待讀出資料量 btoread 得到。

在讀出資料之前,則需要對此時 ringbuffer 可讀出的有效資料 btoread 進行判斷。

讀出的資料不夠,或者沒有足夠的空間寫如資料,可以在呼叫讀寫函式之前進行判斷,假如情況不滿足,就不呼叫相應的讀寫函式。

環形緩衝區的實現原理(ring buffer)

在通訊程式中,經常使用環形緩衝區作為資料結構來存放通訊中傳送和接收的資料。環形緩衝區是乙個先進先出的迴圈緩衝區,可以向通訊程式提供對緩衝區的互斥訪問。1 環形緩衝區的實現原理 環形緩衝區通常有乙個讀指標和乙個寫指標。讀指標指向環形緩衝區中可讀的資料,寫指標指向環形緩衝區中可寫的緩衝區。通過移動讀指標...

C語言佇列實現

以下解釋片面,但便於初學者理解 1.佇列是先進先出的資料結構 2.佇列結構體只有頭和尾兩個指標,並不包含儲存的資料。它只負責記錄佇列的頭尾指向,方便理解佇列的實現。3.佇列成員結構體包含乙個用來儲存資料的變數,和乙個指向下個成員的指標,指標指向下乙個佇列成員。4.入隊要更改佇列結構體隊尾指標到下乙個...

lfu演算法實現c語言 lru演算法c語言實現

a 分配頁面 b 置換演算法 c 程式訪問 d 換出頁面 正確答案 d 單選題 22.設某程序的頁訪問串為 1 3 1 2 4,工作集為 3 塊,問 按 lru 頁面替換演算法,儲存管理採取虛擬儲存技術 組成 物理記憶體 主機板上的ram 和硬碟上的 虛擬記憶體聯合組成 頁面大小 4kb 例 頁面排...