在uC/OS-II中郵箱是線程(任務)通訊的一種,使用郵箱能夠發送一個指針,當然也可以發送指針大小的數據。
大致原理是,如果郵箱中沒有郵件(數據),此時線程嘗試獲取,會導致線程進入掛起狀態。當郵箱中有郵件時,恢復最高優先級線程。
經常使用的幾個函數,如下:
1、OSMboxCreate()
創建一個郵箱,并進行初始化
2、OSMboxPend()
嘗試從郵箱獲取郵件,如果郵箱中有郵件則立即獲得,退出此函數。如果郵箱為空,調用線程進入掛起狀態,等待郵件到來。
在uC/OS-II中多個線程等待郵件時,不是采用鏈表的方式,采用鏈表就有優先級排序問題,排序時間和鏈表長度有關,時間不可控,實時性差一些。uC/OS-II采用了一種巧妙的方式,以后專門寫個文章敘述一下。
此函數不能在ISR中調用。
3、OSMboxPost()
嘗試發送郵件:
1)如果有線程正在等待郵件,則把郵件發送給優先級最高的線程。在uC/OS-II中無論等待的線程有多少個,從這些線程中挑選出最高優先級的時間是一樣的,這一點非常重要,也是實時操作系統的特點,時間可控。
2)如果沒有線程等待郵件,看一下郵箱是否已滿,滿則返回錯誤碼,空則把郵件放入郵箱。
4、OSMboxAccept
嘗試獲取郵件,如果郵箱里有郵件,直接取出來,如果沒有返回(void *)0郵件,不會掛起線程。
5、OSMboxPendAbort
取消掛起的線程,被恢復的線程獲得(void *)0郵件,這個函數有兩個選項,一個是只恢復最高優先級線程,另外一個是恢復所有正在等待的線程。
6、OSMboxPostOpt
這個函數比OSMboxPost()多了幾個選項:
NONE:和OSMboxPost()完全一樣。
BROADCAST:等待的線程全部獲得相同郵件。
NO_SCHED:恢復最高優先級的線程,但是不進行線程調度
7、OSMboxDel
刪除郵箱,刪除時有兩個選項:
NO_PEND:只有沒有線程掛起等待時才能刪除郵箱
ALWAYS:直接刪除,如果有線程等待,恢復等待線程,線程獲得(void *)0郵件。
8、OSMboxQuery
查詢郵箱,結果放在OS_MBOX_DATA結構體中。
-
單線程
+關注
關注
0文章
17瀏覽量
1782 -
ucos-ii
+關注
關注
1文章
11瀏覽量
3609
發布評論請先 登錄
相關推薦
評論