上面的訊息郵箱的建立函式,函式引數為乙個指標,將改變量的位址賦值給oseventptr,故oseventptr中存放的是將要傳遞的訊息的指標。訊息郵箱的oseventtype型別為:os_event_type_mbox。
存放訊息就是將訊息的指標賦值給事件控制塊中的oseventptr變數,同時在在有任務等待此事件時,呼叫函式
(void)os_eventtaskrdy(pevent, pmsg, os_stat_mbox, os_stat_pend_ok);此函式中有如下的**段:
從上面的**可以知道
,可以直接將訪問的訊息指標賦值給等待此事件優先順序最高的任務。
ptcb->ostcbmsg = pmsg;同時將此任務的ostcbstatpend狀態改為:os_stat_pend_ok。
上面的**將會在訊息的獲取函式中看到。
訊息的獲取函式為:
void *osmboxpend (os_event *pevent, int16u timeout, int8u *perr)
在此函式中有如下的**段:
首先判斷當前事件控制塊中oseventptr指標是否為空,當不為空時,則表示此時已經有訊息存在,直接將此訊息指標返回。如果為空時,將當前任務的任務狀態改為:ostcbstat |= os_stat_mbox; 表示此任務因為等待訊息郵箱事件而掛起(ostcbstatpend = os_stat_pend_ok)。接著呼叫函式os_eventtaskwait (os_event *pevent)使任務從就選錶中刪除,同時在事件等待表中記錄此任務。在此函式中有:
ostcbcur->ostcbeventptr = pevent; /* store ptr to ecb in tcb */
表示當前任務正在等待的時間控制塊。之後進行任務排程,當通過函式 osmboxpost (os_event *pevent, void *pmsg)傳送乙個訊息佇列的時候時會將最高優先順序的任務的ostcbstatpend的變數賦值為:os_stat_pend_ok,當等待的訊息獲取到之後,函式osmboxpend()繼續向下執行,通過case條件來執行不同的處理:
switch (ostcbcur->ostcbstatpend)
之後將當前任務中的
ostcbeventptr ,ostcbmsg進行賦空值操作。
ostcbcur->ostcbstat = os_stat_rdy; /* set task status to ready */
ostcbcur->ostcbstatpend = os_stat_pend_ok; /* clear pend status*/
ostcbcur->
ostcbeventptr= (os_event *)0; /* clear event pointers */
#if (os_event_multi_en > 0)
ostcbcur->ostcbeventmultiptr = (os_event **)0;
#endif
ostcbcur->
ostcbmsg= (void *)0; /* clear received message*/
osmboxdel(),osmboxaccept(),
int8u osmboxpendabort (os_event *pevent, int8u opt, int8u *perr)函式中的:opt,
* opt determines the type of abort performed:
* _pend_opt_none abort wait for a single task (hpt) waiting on the mailbox
* os_pend_opt_broadcast abort wait for all tasks that are waiting on the mailbox
相對簡單,不在分析。
ucos 訊息佇列
1 訊息佇列 訊息佇列可以同時傳遞多個訊息,當時間控制塊中的變數oseventtype值為 os event type q表示此事件控制塊是用來表示訊息佇列的。訊息佇列資料結構如下 在上面的事件控制塊的oseventptr指標指向了訊息佇列結構體 os q。改結構體os q管理者乙個訊息陣列,這個陣...
ucos訊息佇列
如果把郵箱比作訊號量的公升級版,那訊息佇列就是郵箱的公升級版,郵箱可以實現從乙個任務向另乙個任務傳送乙個指標變數,訊息佇列則可以實現從乙個任務向 另乙個任務傳送多個指標變數,而且每個指標指向的資料結構變數也可以有不同。使用訊息佇列需要注意的恩地方是 乙個任務或者中斷服務子程式可以呼叫osqpost ...
uC OS 的訊息佇列 uC OS學習筆記(七)
1.訊息佇列的介紹 使用訊息佇列可在任務之間傳遞多條訊息。訊息佇列相當於訊息郵箱集合,乙個郵箱只能在任務間傳遞一條訊息,而訊息佇列則可以傳遞多條訊息。訊息佇列由三部分組成 事件控制塊 訊息佇列和訊息。2.訊息佇列的操作 a 建立訊息佇列 qsqcreate void start,int16u siz...