環形緩衝區的應用ringbuffer

2021-07-29 12:11:03 字數 1638 閱讀 4489

在嵌入式開發中離不開裝置通訊,而在通訊中穩定性最高的莫過於環形緩衝區演算法,

當讀取速度大於寫入速度時,在環形緩衝區的支援下不會丟掉任何乙個位元組(硬體問題除外)。

在通訊程式中,經常使用環形緩衝區作為

資料結構

來存放通訊中傳送和接收的資料。環形緩衝區是乙個先進先出的迴圈緩衝區,可以向通訊程式提供對緩衝區的互斥訪問。

1、環形緩衝區的實現原理

環形緩衝區通常有乙個讀指標和乙個寫指標。讀指標指向環形緩衝區中可讀的資料,寫指標指向環形緩衝區中可寫的緩衝區。通過移動讀指標和寫指標就可以實現緩衝區的資料讀取和寫入。在通常情況下,環形緩衝區的讀使用者僅僅會影響讀指標,而寫使用者僅僅會影響寫指標。如果僅僅有乙個讀使用者和乙個寫使用者,那麼不需要新增互斥保護機制就可以保證資料的正確性。如果有多個讀寫使用者訪問環形緩衝區,那麼必須新增互斥保護機制來確保多個使用者互斥訪問環形緩衝區。

圖 1、圖 2 和圖 3 是乙個環形緩衝區的執行示意圖。

圖1 初始狀態

圖二 向環形緩衝區中新增了乙個資料

圖三環形緩衝區進行了讀取和新增

圖 1 是環形緩衝區的初始狀態,可以看到讀指標和寫指標都指向第乙個緩衝區處;

圖 2 是向環形緩衝區中新增了乙個資料後的情況,可以看到寫指標已經移動到資料塊 2 的位置,而讀指標沒有移動;

圖 3 是環形緩衝區進行了讀取和新增後的狀態,可以看到環形緩

沖區中已經新增了兩個資料,已經讀取了乙個資料。

這個只是示意圖

下面是用c語言寫的**:

[cpp]view plain

copy

print

?#include 

#include 

#define maxsize 8

intringbuf[maxsize];  

intrealdx = 0;  

intwriteldx = 0;  

intnext_data_handle(

intaddr)  

intwrite_data(

intdata)  

}  intread_data()  

intmain(

intargc, 

char

*argv)  

}while

(cmd!=

'q');  

return

0;  

}  

執行的結果如下:

主要是要理解這個環形設計的思想。

**:

環形緩衝區

include include include include include define buffsize 1024 1024 define min x,y x y x y pthread mutex t lock pthread mutex initializer struct cycle b...

環形緩衝區

define print buf size 16 1024 static char g pcnetprintbuf 環形緩衝區的首位址 static int g ireadpos 0 環形緩衝區讀的位置 static int g iwritepos 0 環形緩衝區寫的位置 intinit 判斷環形緩...

環形緩衝區

環形緩衝區要維護兩個索引,分別對應寫入端 w 和讀取端 r 寫入 push 的時候,先確保環沒滿,然後把資料複製到 w 所對應的元素,最後 w 指向下乙個元素 讀取 pop 的時候,先確保環沒空,然後返回 r 對應的元素,最後 r 指向下乙個元素。上述的操作並不複雜,不過有乙個小小的麻煩 空環和滿環...