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