在uC/OS-II中郵箱是線程(任務(wù))通訊的一種,使用郵箱能夠發(fā)送一個指針,當(dāng)然也可以發(fā)送指針大小的數(shù)據(jù)。
大致原理是,如果郵箱中沒有郵件(數(shù)據(jù)),此時線程嘗試獲取,會導(dǎo)致線程進(jìn)入掛起狀態(tài)。當(dāng)郵箱中有郵件時,恢復(fù)最高優(yōu)先級線程。
經(jīng)常使用的幾個函數(shù),如下:
1、OSMboxCreate()
創(chuàng)建一個郵箱,并進(jìn)行初始化
2、OSMboxPend()
嘗試從郵箱獲取郵件,如果郵箱中有郵件則立即獲得,退出此函數(shù)。如果郵箱為空,調(diào)用線程進(jìn)入掛起狀態(tài),等待郵件到來。
在uC/OS-II中多個線程等待郵件時,不是采用鏈表的方式,采用鏈表就有優(yōu)先級排序問題,排序時間和鏈表長度有關(guān),時間不可控,實(shí)時性差一些。uC/OS-II采用了一種巧妙的方式,以后專門寫個文章敘述一下。
此函數(shù)不能在ISR中調(diào)用。
3、OSMboxPost()
嘗試發(fā)送郵件:
1)如果有線程正在等待郵件,則把郵件發(fā)送給優(yōu)先級最高的線程。在uC/OS-II中無論等待的線程有多少個,從這些線程中挑選出最高優(yōu)先級的時間是一樣的,這一點(diǎn)非常重要,也是實(shí)時操作系統(tǒng)的特點(diǎn),時間可控。
2)如果沒有線程等待郵件,看一下郵箱是否已滿,滿則返回錯誤碼,空則把郵件放入郵箱。
4、OSMboxAccept
嘗試獲取郵件,如果郵箱里有郵件,直接取出來,如果沒有返回(void *)0郵件,不會掛起線程。
5、OSMboxPendAbort
取消掛起的線程,被恢復(fù)的線程獲得(void *)0郵件,這個函數(shù)有兩個選項(xiàng),一個是只恢復(fù)最高優(yōu)先級線程,另外一個是恢復(fù)所有正在等待的線程。
6、OSMboxPostOpt
這個函數(shù)比OSMboxPost()多了幾個選項(xiàng):
NONE:和OSMboxPost()完全一樣。
BROADCAST:等待的線程全部獲得相同郵件。
NO_SCHED:恢復(fù)最高優(yōu)先級的線程,但是不進(jìn)行線程調(diào)度
7、OSMboxDel
刪除郵箱,刪除時有兩個選項(xiàng):
NO_PEND:只有沒有線程掛起等待時才能刪除郵箱
ALWAYS:直接刪除,如果有線程等待,恢復(fù)等待線程,線程獲得(void *)0郵件。
8、OSMboxQuery
查詢郵箱,結(jié)果放在OS_MBOX_DATA結(jié)構(gòu)體中。
-
單線程
+關(guān)注
關(guān)注
0文章
18瀏覽量
1839 -
ucos-ii
+關(guān)注
關(guān)注
1文章
11瀏覽量
3771
發(fā)布評論請先 登錄
uc os-ii官方網(wǎng)站
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源碼包的下載
為什么想學(xué)uc/OS-II
The uC/OS-II port for Keil C V
基于uc/os-ii 的嵌入式GUI研究與應(yīng)用
uC/OS-II 應(yīng)用程序基本結(jié)構(gòu)及重要的API介紹
【嵌入式系統(tǒng)—實(shí)時操作系統(tǒng)】uC/OS-II 及其STM32F103移植

評論