在嵌入式開發中離不開裝置通訊,而在通訊中穩定性最高的莫過於環形緩衝區演算法,
當讀取速度大於寫入速度時,在環形緩衝區的支援下不會丟掉任何乙個位元組(硬體問題除外)。
在通訊程式中,經常使用環形緩衝區作為
資料結構
來存放通訊中傳送和接收的資料。環形緩衝區是乙個先進先出的迴圈緩衝區,可以向通訊程式提供對緩衝區的互斥訪問。
1、環形緩衝區的實現原理
環形緩衝區通常有乙個讀指標和乙個寫指標。讀指標指向環形緩衝區中可讀的資料,寫指標指向環形緩衝區中可寫的緩衝區。通過移動讀指標和寫指標就可以實現緩衝區的資料讀取和寫入。在通常情況下,環形緩衝區的讀使用者僅僅會影響讀指標,而寫使用者僅僅會影響寫指標。如果僅僅有乙個讀使用者和乙個寫使用者,那麼不需要新增互斥保護機制就可以保證資料的正確性。如果有多個讀寫使用者訪問環形緩衝區,那麼必須新增互斥保護機制來確保多個使用者互斥訪問環形緩衝區。
圖 1、圖 2 和圖 3 是乙個環形緩衝區的執行示意圖。
圖1 初始狀態
圖二 向環形緩衝區中新增了乙個資料
圖三環形緩衝區進行了讀取和新增
圖 1 是環形緩衝區的初始狀態,可以看到讀指標和寫指標都指向第乙個緩衝區處;
圖 2 是向環形緩衝區中新增了乙個資料後的情況,可以看到寫指標已經移動到資料塊 2 的位置,而讀指標沒有移動;
圖 3 是環形緩衝區進行了讀取和新增後的狀態,可以看到環形緩
沖區中已經新增了兩個資料,已經讀取了乙個資料。
這個只是示意圖
下面是用c語言寫的**:
[cpp]view plain
copy
?#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 指向下乙個元素。上述的操作並不複雜,不過有乙個小小的麻煩 空環和滿環...