爲何要用:
任務間的通訊能夠經過全局變量或者信號量來完成。全局變量雖然能夠承載通訊的內容,可是接收方沒法意識到信息的到達,除非發送方向接收方發送一個信號量,或者接收方不斷該全局變量;信號量能夠當即使接收方知道某個事件的發生,但沒法傳遞具體內容。用信號量進行通訊就像咱們只撥通別人的手機而不與之通話;用消息隊列或者郵箱進行通訊則可達到既 撥通別人的手機又與之通話的效果。換句話說,消息隊列和郵箱能夠及時傳送事件的內容。數組
郵箱通訊的機理:
發送方經過內核服務把一封郵件投遞到郵箱,內核完成投遞任務後通知等待列表中的接收方收取郵件。在整個投遞過程當中,內核充當了郵遞員的角色。這裏的「郵件」一般是一個指針,接收方能夠經過該指針獲取郵件內容。函數
郵箱的基本操做:
內核一般提供以下的郵箱服務:初始化郵箱的內容。郵箱最初能夠包含或者不包含郵件。把郵件發送到郵箱(post)。若是郵箱已滿,則返回錯誤信息
(OS_MBOX_FULL)。以「掛起」方式接收郵件(pend)。若是郵箱爲空,則把取信者掛起;若超過必定時間郵箱仍爲空,則返回超時信息。
以「非掛起」方式接收郵件(accept)。若是郵箱爲空,則返回一個空指針。 當但願一次性向某個任務發送多則消息時,郵箱就有點見肘了。由於一個郵箱只能裝一封信。把多上郵箱集中到一塊兒管理和使用就變成了消息隊列,因此消息隊列的操做和郵箱很類似。能夠簡單地認爲,消息隊列是郵箱數組。 若是發送者是一對一的方式發送郵件,則等待列表中的優先級最高的任務將獲取郵件;若是是以廣播的方式發送郵件,則等待該郵件的全部任務將得到此郵件.post
消息隊列使用步驟:指針
1.創建一個指向消息數組的指針和數組的大小,該指針數組必須申明爲void類型,以下:
void *MessageStorage[size]
2. 聲明一個OS_EVENT類型的指針指向生成的隊列,以下:
OS_EVENT *QSem;
3.OSQcreate()函數建立消息隊列,以下:
QSem = OSQcreate(&MyArrayOfMsg[0],SIZE);
4.等待消息隊列中的消息,OSQPend()
5. 向隊列發送一條消息(FIFO),OSQPost();
6.1 向隊列發送一條消息(LIFO),OSQPostFront()
6.2 向消息隊列發送一則消息(LIFO或者FIFO)
INT8U OSQPostOpt (OS_EVENT *pevent, void *msg, INT8U opt)
七、 無等待的從消息隊列中得到消息,OSQAccept()
八、 清空消息隊列 INT8U OSQFlush (OS_EVENT *pevent)
九、 獲取消息隊列的狀態,OSQQuery()隊列