使用消息隊列可以在任務之間傳遞多條消息。消息隊列由三個部分組成:事件控制塊、消息隊列和消息。
消息隊列的數據結構如下圖所示。從圖中可以看到,消息隊列相當於一個共用一個任務等待列表的消息郵箱數組,事件控制塊成員OSEventPtr指向了一個叫做隊列控制塊(OS_Q)的結構,該結構管理了一個數組MsgTbl[ ],該數組中的元素都是一些指向消息的指針。
爲了對消息指針數組進行有效的管理,μC/OS-II把消息指針數組的基本參數都記錄在一個叫做隊列控制塊的結構中,其中可以移動的指針爲OSQIn和OSQOut,而指針OSQStart和OSQEnd只是一個標誌(常指針)。當可移動的指針OSQIn或OSQOut移動到數組末尾,也就是與OSQEnd相等時,可移動的指針將會被調整到數組的起始位置OSQStart。也就是說,從效果上來看,指針OSQEnd與OSQStart等值。於是,這個由消息指針構成的數組就頭尾銜接起來形成了一個如圖所示的循環的隊列。
隊列控制塊的源碼如下:
typedef struct os_q { /* QUEUE CONTROL BLOCK */
struct os_q *OSQPtr; /* Link to next queue control block in list of free blocks */
void **OSQStart; /* Pointer to start of queue data */
void **OSQEnd; /* Pointer to end of queue data */
void **OSQIn; /* Pointer to where next message will be inserted in the Q */
void **OSQOut; /* Pointer to where next message will be extracted from the Q */
INT16U OSQSize; /* Size of queue (maximum number of entries) */
INT16U OSQEntries; /* Current number of entries in the queue */
} OS_Q;
µC/OS-Ⅱ提供了九種對消息隊列進行操作的函數,函數所屬文件是OS_Q.C。
上述函數與消息郵箱的操作函數類似,不詳細分析。