全域性變數
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_opt_time_hmsm_strict,&err); //延時2s
}}
led任務1
void led1_task(void *p_arg)
}}
和訊號量類似,訊息佇列可用於傳遞資訊,不同的是訊息佇列的資料結構可以攜帶具體的資料引數,並以指標的方式傳遞,同時還有lifo(後進先出)和fifo(先進先出)兩種模式,用於配合緊急狀態下的訊息輸出,個人認為訊息佇列的最大用處是對於連續訊號在不同任務之間的傳遞,需要注意的是,當乙個任務從訊息佇列中取出乙個訊息後,訊息佇列會剔除該資訊,也就是同乙個資訊不會被收到兩次,保證資訊的連續和實時性。
osqpend()函式中包含的os_msgqget()函式中包含以下**即實現了該功能
...
p_void = p_msg->msgptr;//獲取訊息指標
*p_msg_size = p_msg->msgsize;
if (p_ts != (cpu_ts *)0)
p_msg_q->outptr = p_msg->nextptr;//訊息指向下乙個訊息物件,相當於剔除已經接受的郵箱(郵箱佇列是乙個閉環的結構,使其能夠不斷迴圈下去)
if (p_msg_q->outptr == (os_msg *)0) else
p_msg->nextptr = osmsgpool.nextptr; /* return message control block to free list */
osmsgpool.nextptr = p_msg;
osmsgpool.nbrfree++;//增加空閒郵箱數量
osmsgpool.nbrused--;
*p_err = os_err_none;
return (p_void);
在上面的**中可以看到,資訊是通過指標msg作為osqpost()的引數進行傳輸的,其指向記憶體中宣告的一塊區域,如果在目標任務收到該指標後,不會再使用該記憶體的情況下,建議直接free釋放該區域記憶體,避免資料過多導致記憶體碎片化。
參考ucos學習筆記——訊息佇列
ucosiii訊息佇列
UCOS之訊號量
c os ii 中的訊號量由兩部分組成 乙個是訊號量的計數值,它是乙個 16 位的無符號整數 0 到65,535之間 另乙個是由等待該訊號量的任務組成的等待任務表。使用者要在 os cfg.h中將os sem en開關量常數置成1,這樣 c os ii 才能支援訊號量。當訊號量不為0時,任務即可獲得...
ucos 計數訊號量
1 計數訊號量 1.1 建立訊號量 當事件控制塊os event中的oseventtype os event type sem時,則表示此處建立的事件為訊號量。上面為計數訊號量的建立函式,建立函式不能在中斷中呼叫,在全域性的事件控制塊列表中取出乙個事件控制塊pevent,對pevent進行初始化操作...
uCOS學習筆記 二 互斥訊號量與訊息佇列
互斥訊號量與訊息佇列 互斥訊號量 訊息佇列 互斥訊號量是乙個核心物件 一種資料結構 對於互斥訊號量而言,它的共享資源只能被乙個任務所訪問,乙個任務想要去訪問共享的資源必須在它被允許執行前去獲得互斥量,並在對資源訪問後釋放互斥量。訊息佇列是中斷服務程式和 或其他任務所傳送的乙個核心物件,傳送者將其需要...