裸機中環(huán)形隊列與RTOS中消息隊列的區(qū)別
時間:2021-08-19 16:29:22
手機看文章
掃描二維碼
隨時隨地手機看文章
[導讀]關注星標公眾號,不錯過精彩內容作者|?strongerHuang微信公眾號|?嵌入式專欄“環(huán)形隊列”和“消息隊列”在嵌入式領域有應用非常廣泛,相信有經驗的嵌入式軟件工程師對它們都不陌生。但經??吹揭恍┏鯇W者問一些相關的問題,今天就來分享一下關于“環(huán)形隊列”和“消息隊列”的內容。環(huán)...
關注 星標公眾號,不錯過精彩內容作者 |?strongerHuang微信公眾號 |?嵌入式專欄
“環(huán)形隊列”和“消息隊列”在嵌入式領域有應用非常廣泛,相信有經驗的嵌入式軟件工程師對它們都不陌生。
但經常看到一些初學者問一些相關的問題,今天就來分享一下關于“環(huán)形隊列”和“消息隊列”的內容。
環(huán)形隊列環(huán)形隊列是在實際編程極為有用的數據結構,它是一個首尾相連的FIFO的數據結構,采用數組的線性空間,數據組織簡單,能很快知道隊列是否滿為空,能以很快速度的來存取數據。
環(huán)形隊列通常用于通信領域,比如UART、USB、CAN、網絡等。
1.環(huán)形隊列實現原理內存上沒有環(huán)形的結構,因此環(huán)形隊列實上是數組的線性空間來實現。當數據到了尾部它將轉回到0位置來處理。
因此環(huán)列隊列的邏輯:將數組元素q[0]與q[MAXN-1]連接,形成一個存放隊列的環(huán)形空間。
為了方便讀寫,還要用數組下標來指明隊列的讀寫位置。head/tail.其中head指向可以讀的位置,tail指向可以寫的位置。環(huán)形隊列的關鍵是判斷隊列為空,還是為滿。當tail追上head時,隊列為滿時;當head追上tail時,隊列為空。但如何知道誰追上誰,還需要一些輔助的手段來判斷.?如何判斷環(huán)形隊列為空,為滿有兩種判斷方法:a.附加一個標志位tag
b.限制tail趕上head,即隊尾結點與隊首結點之間至少留有一個元素的空間。
2.附加標志實現原理
a.采用第一個環(huán)形隊列有如下結構:
初始化狀態(tài):
隊列為空:
“環(huán)形隊列”和“消息隊列”在嵌入式領域有應用非常廣泛,相信有經驗的嵌入式軟件工程師對它們都不陌生。
但經常看到一些初學者問一些相關的問題,今天就來分享一下關于“環(huán)形隊列”和“消息隊列”的內容。
環(huán)形隊列環(huán)形隊列是在實際編程極為有用的數據結構,它是一個首尾相連的FIFO的數據結構,采用數組的線性空間,數據組織簡單,能很快知道隊列是否滿為空,能以很快速度的來存取數據。
環(huán)形隊列通常用于通信領域,比如UART、USB、CAN、網絡等。
1.環(huán)形隊列實現原理內存上沒有環(huán)形的結構,因此環(huán)形隊列實上是數組的線性空間來實現。當數據到了尾部它將轉回到0位置來處理。
因此環(huán)列隊列的邏輯:將數組元素q[0]與q[MAXN-1]連接,形成一個存放隊列的環(huán)形空間。
為了方便讀寫,還要用數組下標來指明隊列的讀寫位置。head/tail.其中head指向可以讀的位置,tail指向可以寫的位置。環(huán)形隊列的關鍵是判斷隊列為空,還是為滿。當tail追上head時,隊列為滿時;當head追上tail時,隊列為空。但如何知道誰追上誰,還需要一些輔助的手段來判斷.?如何判斷環(huán)形隊列為空,為滿有兩種判斷方法:a.附加一個標志位tag
- 當head趕上tail,隊列空,則令tag=0
- 當tail趕上head,隊列滿,則令tag=1
b.限制tail趕上head,即隊尾結點與隊首結點之間至少留有一個元素的空間。
- 隊列空:? ?head==tail
- 隊列滿:? ?(tail 1)% MAXN ==head
2.附加標志實現原理
a.采用第一個環(huán)形隊列有如下結構:
typedef struct ringq{ int head; /* 頭部,出隊列方向*/ int tail; /* 尾部,入隊列方向*/ int tag ; int size ; /* 隊列總尺寸 */ int space[RINGQ_MAX]; /* 隊列空間 */}RINGQ;初始化狀態(tài):
q->head = q->tail = q->tag = 0;隊列為空:
( q->head == q->tail) 




