ucos 訊息佇列

2021-06-19 06:53:06 字數 2830 閱讀 1678

1:訊息佇列

訊息佇列可以同時傳遞多個訊息,當時間控制塊中的變數oseventtype值為:os_event_type_q表示此事件控制塊是用來表示訊息佇列的。訊息佇列資料結構如下:

在上面的事件控制塊的oseventptr指標指向了訊息佇列結構體:os_q。改結構體os_q管理者乙個訊息陣列,這個陣列中存放是訊息的指標。

2:佇列控制塊

os_q的定義如下:

typedef struct os_q os_q;

其中osqstart和osqend 是常指標,分別指向佇列訊息陣列的開始和結尾,osqin和osqout指標隨著資料的插入和刪除而改變。這些值的改變可以在佇列的建立及訊息的獲取,post函式中看到。

訊息佇列的初始化函式與其他初始化函式:事件控制塊,任務控制塊類似的。有乙個全域性陣列(定義了佇列個數)及空閒鍊錶(空閒的佇列數)。如下全域性變數:

經過上面的初始化以後,os_max_qs個訊息佇列連線成乙個鍊錶,osqfreelist指向鍊錶的開始。每當任務建立乙個訊息佇列時,就會從空閒的佇列鍊錶osqfreelist中取出乙個來使用。空閒佇列鍊錶的如下:

3:訊息佇列建立

由於在訊息佇列中,存放訊息的是指標陣列,故在建立訊息佇列之前,必須先建立乙個用來存放訊息的指標陣列。

os_event  *osqcreate (void **start, int16u size)

os_enter_critical();

pevent = oseventfreelist;                    /* get next free event control block    */空閒的事件控制塊

if (oseventfreelist != (os_event *)0)

os_exit_critical();

if (pevent != (os_event *)0) else

}return (pevent);

}4:向訊息佇列傳送訊息

ucos中有倆種方式來向指標陣列中存放訊息。一種是先進先出fifo,另一種是:後進先出lifo。

這倆種方式分別使用函式osqpost()和osqpostfront()來實現。

fifo時,訊息佇列將在osqin  指向的位置插入訊息,

osqout 指向輸出訊息的指標。

os_enter_critical();

if (pevent->oseventgrp != 0)

pq = (os_q *)pevent->oseventptr;                   /* point to queue control block                 */

if (pq->osqentries >= pq->osqsize)

*pq->osqin++ = pmsg;                               /* insert message into queue                    */

pq->osqentries++;                                  /* update the nbr of entries in the queue       */

if (pq->osqin == pq->osqend)

os_exit_critical();

lifo時,使用osqout 來完成訊息的出入。

os_enter_critical();

if (pevent->oseventgrp != 0)

pq = (os_q *)pevent->oseventptr;                  /* point to queue control block                  */

if (pq->osqentries >= pq->osqsize)

if (pq->osqout == pq->osqstart)

pq->osqout--;

*pq->osqout = pmsg;                               /* insert message into queue                     */

pq->osqentries++;                                 /* update the nbr of entries in the queue        */

os_exit_critical();

ucos訊息佇列

如果把郵箱比作訊號量的公升級版,那訊息佇列就是郵箱的公升級版,郵箱可以實現從乙個任務向另乙個任務傳送乙個指標變數,訊息佇列則可以實現從乙個任務向 另乙個任務傳送多個指標變數,而且每個指標指向的資料結構變數也可以有不同。使用訊息佇列需要注意的恩地方是 乙個任務或者中斷服務子程式可以呼叫osqpost ...

uC OS 的訊息佇列 uC OS學習筆記(七)

1.訊息佇列的介紹 使用訊息佇列可在任務之間傳遞多條訊息。訊息佇列相當於訊息郵箱集合,乙個郵箱只能在任務間傳遞一條訊息,而訊息佇列則可以傳遞多條訊息。訊息佇列由三部分組成 事件控制塊 訊息佇列和訊息。2.訊息佇列的操作 a 建立訊息佇列 qsqcreate void start,int16u siz...

ucos訊號量訊息佇列

全域性變數 static int msg int os q data msg 訊息佇列主任務 void start task void p arg led任務0 void led0 task void p arg if err os err none ostimedlyhmsm 0,0,3,0,os...