uC/OS的訊息郵箱使用經驗
uC/OS下任務之間通訊的方式之一有訊息郵箱,使用訊息郵箱有兩種方式:
(1)資料的存放
(2)傳遞指向一個數據的指標,就是傳遞多個數據。
經驗小結如下:
一、資料存放,存放單個數據
郵箱可以傳遞任何型別資料,在傳遞時,先將資料用(void*)進行型別變化,變為void*這種萬用型別,而在接收郵箱資料時,再還原為本身的資料型別,舉例如下:
OSMboxPost(Mbox,(void*)key_value);
其中key_value是一個字元型變數,該變數的型別為INT8U,先轉換為(void*),在接收訊息端
key = (INT8U)OSMboxPend(Mbox,0,&err);
其中key為INT8U格式,注意在OSMboxPend前面增加了型別轉換(INT8U)
二、傳遞指標
傳送:OSMboxPost(Mbox,(void*)SendData);
接收:data_ptr = (INT8U*)OSMboxPend(Mbox,0,&err);
其中SendData為傳遞的資料名稱,data_ptr為接收資料指標。
另外:郵箱中不能存放傳遞0值,因為把一個0值放入郵箱,經過void *型別變化後,變成了void *0,而判斷郵箱中是否有資料正是通過判斷郵箱中指向Message的指標是否為0來判斷,這樣雖然放入了一個0變數,但郵箱中卻無法判斷這個0值,認為郵箱中還是空。
還有就是,在執行一次OSMboxPend後,會將郵箱清空,只有下次有新的資料到郵箱後,才能等到資料,這一點與現實中的郵箱email是類似的,一旦檢視新郵件後,在新郵件序列中,就沒有了該次新郵件提醒了,這一點,在OSMboxPend函式中也有體現:
OS_ENTER_CRITICAL();
pmsg = pevent->OSEventPtr;
if (pmsg != (void *)0)
{ /* See if there is already a message*/
pevent->OSEventPtr = (void *)0; /* Clear the mailbox(清除郵箱)*/
OS_EXIT_CRITICAL();