1、uC/OS-II隊列原理
消息隊列是線程間通訊的一種,主要用作數(shù)據(jù)緩沖,用途非常廣泛。一般情況下遵循先進先出原則。先來看隊列結(jié)構(gòu)體:

uC/OS-II使用一個指針數(shù)組實現(xiàn)了消息隊列,數(shù)組中每個元素可以存放一個指針。當然如果不傳輸指針傳輸普通數(shù)據(jù)也是可以的。
這個指針數(shù)組經(jīng)過函數(shù)OSQCreate()處理后變成如下這個樣子。OSQIn、OSQOut都指向起始位置。

這其實是一個環(huán)形隊列結(jié)構(gòu),現(xiàn)在把上面的圖形掰彎,如下:

工作原理大致是:
當OSQPost()函數(shù)向隊列中放數(shù)據(jù)后,OSQIn移動一個位置。如果OSQIn指針已經(jīng)旋轉(zhuǎn)到末尾,則重新指向起始位置。OSQIn指向數(shù)據(jù)即將要插入的位置,換句話說它指的地方是“空的”。
OSQPend()函數(shù)從隊列中取出數(shù)據(jù)后OSQOut移動一個位置。如果OSQOut指針已經(jīng)旋轉(zhuǎn)到末尾,則重新指向起始位置。OSQOut指向最“舊”的數(shù)據(jù), 換句話說它指的地方是“滿的”。
數(shù)據(jù)取放示意圖如下:

2、隊列相關(guān)函數(shù)介紹
OSQCreate()
初始化事件結(jié)構(gòu)體,根據(jù)參數(shù)提供的內(nèi)存起始地址以及大小,把這一塊內(nèi)存初始化為環(huán)形隊列。
OSQPost()
此函數(shù)嘗試存入數(shù)據(jù),如果有線程正在等待數(shù)據(jù),則選取最高優(yōu)先級的線程,并把它恢復為運行態(tài)。數(shù)據(jù)直接給了等待線程,沒有進入環(huán)形隊列。
如果沒有線程等待,此函數(shù)把數(shù)據(jù)放入隊列,放入后OSQIn移動一個位置,如果OSQIn已經(jīng)到了OSQEnd位置,重新設(shè)置為OSQStart。
如果隊列已經(jīng)滿了,再次調(diào)用此函數(shù),直接返回錯誤碼,不會覆蓋隊列中的數(shù)據(jù)。
OSQPend()
此函數(shù)嘗試從隊列取出數(shù)據(jù),如果隊列中有數(shù)據(jù),那么把最舊的數(shù)據(jù)取出來。交給線程即可。如果隊列是空隊列,則掛起當前線程,直至其它線程向隊列發(fā)送數(shù)據(jù)或者線程等待超時。
OSQAccept()
隊列中有數(shù)據(jù)取出來,沒有數(shù)據(jù)也不會掛起線程??捎糜诓樵?。
OSQFlush()
清空隊列
OSQPostFront()
反向放數(shù)據(jù),把數(shù)據(jù)放到隊列尾部。
OSQQuery()
隊列信息查詢,信息放到結(jié)構(gòu)體中。
-
緩沖器
+關(guān)注
關(guān)注
6文章
2213瀏覽量
48633 -
消息隊列
+關(guān)注
關(guān)注
0文章
34瀏覽量
3234 -
ucos-ii
+關(guān)注
關(guān)注
1文章
11瀏覽量
3923
發(fā)布評論請先 登錄
uC/OS-II簡介
uC/OS-II簡介
uC/OS-II簡介
uC/OS-II簡介
uC/OS-II簡介
uC/OS-II簡介
如何去解決uC/OS-II中優(yōu)先級翻轉(zhuǎn)問題?
uC/OS-II源碼包的下載
為什么想學uc/OS-II
基于uc/os-ii 的嵌入式GUI研究與應用
uC/OS-II 應用程序基本結(jié)構(gòu)及重要的API介紹
正點原子開拓者FPGA Qsys視頻:uCOS II消息郵箱和消息隊列
【嵌入式系統(tǒng)—實時操作系統(tǒng)】uC/OS-II 及其STM32F103移植

uC/OS-II隊列原理 隊列相關(guān)函數(shù)介紹
評論