ucos 訊息郵箱

2021-06-19 06:19:05 字數 2520 閱讀 4492

上面的訊息郵箱的建立函式,函式引數為乙個指標,將改變量的位址賦值給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...