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();
新聞熱點
疑難解答