uc os II 分析(10) 訊息佇列

2021-07-24 13:55:31 字數 1560 閱讀 8921

訊息佇列在任務間可以傳遞多條訊息,由3部分組成:事件控制塊、訊息佇列和訊息、

oseventtype=os_event_type_q時,描述的就是訊息佇列。

1.訊息指標陣列

訊息佇列的核心iushi訊息指標陣列。

osqsize: 陣列的長度;

osqenter:已存放訊息指標的元素數目;

osqstart: 指標,指向訊息指標的起始陣列;

osqout:指標,指向被取出訊息的位置,當它移動到與osqend相等時,被調整到指向陣列的起始單元

2種插入資料方式:

先進先出: osqin:插入, osqout:輸出;

後進先出: osqout;

2. 佇列控制塊

訊息指標陣列的管理: 訊息指標陣列的基本引數都記錄在乙個教佇列控制塊的結構中;

typedef   struct os_q

struct os_q   *osqptr;

void   ** osqstart;

void  ** osqend;

void  ** osqin;

void **  osqout;

int16u   osqsize;

int16u   osqentries;

}os_q;

3. 建立訊息佇列

os_event   osqcreate(

void  *  *start,      //指標陣列的位址

int16u   size     // 陣列長度

);4. 請求訊息佇列

為了從訊息佇列中獲取訊息。函式原型:

void * osqpend( os_event  *pevent,

int16u  timeout,

int8u   *err);

返回值: 訊息指標;

希望任務無等待地請求乙個訊息佇列,則需要呼叫osqaccept(),函式原型:

void    osqaccept(  os_event  *pevent);

5. 向訊息佇列傳送訊息

osqpost():先進先出;  osqpostfront():後進先出『

int8u   osqpost(os_event   *pevnet,   void *msg);

int8u  osqpostfront(  os_event  *pevent,   void *msg)

任務希望以廣播的方式通過訊息佇列傳送訊息:函式原型:

int8u   osqpostopt(os_event   *pevent,   void *msg,  int8u   opt);

6.清空訊息佇列

int8u    osqflush(  os_event  *pevent);

7. 刪除訊息佇列

os_event  *osqdel( os_event  *pevent);

8.  查詢訊息佇列

int8u   osqquery(os_event  *pevent,  os_q_data  *pdata);

pdata:c存放狀態資訊的結構;

typedef   struct os_q_data;

uCOS II郵箱和訊息佇列

1 ucos ii郵箱和訊息佇列 郵箱和訊息佇列是ucos ii中任務間的通訊機制,它可以使乙個任務或者中斷服務子程式向另乙個任務傳送以指標方式定義的變數。因具體的應用有所不同,每個指標指向的資料結構變數也有所不同。兩者都基於事件控制塊os event。與郵箱相比,訊息佇列在os event基礎上加...

UCOS II 訊息佇列學習一

訊息佇列通常可以應用以下兩個地方 1.儲存外部事件 外部事件由中斷收集,然後儲存到佇列。2.串列埠接收程式中的接收迴圈緩衝區,可理解為訊息佇列。使用乙個訊息佇列的步驟如下 1 建立乙個指向訊息陣列的指標和陣列的大小,該指標陣列必須申明為void型別,如下 void myarrayofmsg size...

uC OS II 最簡單的訊息佇列

define messages max size 1000 訊息佇列緩衝區的大小 void msggrp messages max size 訊息陣列,訊息陣列存放著各訊息的指標 os event strqueue 訊息佇列 int8u datatemp 需要傳送的範例資料 void comosqc...