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...