1、UCOSIII任務(wù)間通信
1.1、任務(wù)間通信
一個任務(wù)或者中斷服務(wù)程序有時候需要和另一個任務(wù)交流信息,這個就是消息傳遞的過程就叫做任務(wù)間通信;任務(wù)間的消息傳遞可以通過2種途徑:一是通過全局變量,二是通過發(fā)布消息。
使用全局變量的時候每個任務(wù)或者中斷服務(wù)程序都必須保證其對全局變量的獨(dú)占訪問。消息也可以通過消息隊列作為中介發(fā)布給任務(wù)。
1.2 什么是消息?
消息包含一下幾個部分:指向數(shù)據(jù)的指針,數(shù)據(jù)的長度和記錄消息發(fā)布時刻的時間戳,指針指向的可以是一塊數(shù)據(jù)區(qū)域或者甚至是一個函數(shù)。 消息的內(nèi)容必須一直保持可見性,可見性是指代表消息的變量必須在接收消息的任務(wù)代碼范圍內(nèi)有效。這是因為發(fā)布的數(shù)據(jù)采用的是指針傳遞,也就是引用傳遞,并不是值傳遞。也就是說,發(fā)布的消息本身并不產(chǎn)生拷貝,我們可以使用動態(tài)內(nèi)存分配的方式來給消息分配一個內(nèi)存塊,或者,也可以傳遞一個指向全局變量、全局數(shù)據(jù)結(jié)構(gòu)、全局?jǐn)?shù)組或者函數(shù)的指針。
2、UCOSIII消息隊列
2.1消息隊列的操作:
中斷服務(wù)程序只能使用OSQPost()函數(shù),在UCOSIII中對于消息隊列的讀取是先進(jìn)先出FIFO,也可以后進(jìn)先出LIFO的方式,采用后進(jìn)先出的方式發(fā)布的消息會繞過其他所有位于消息隊列中的消息而最先傳遞給任務(wù)。
小沙漏表示任務(wù)指定一個超時時間,如果任務(wù)在這段時間內(nèi)沒接收到消息就會喚醒任務(wù),并返回錯誤碼告訴UCOIII任務(wù)是被超時而喚醒的不是因為接收到了消息。超時時間設(shè)置為0那任務(wù)就會一直等待下去,知道接收到消息。
消息隊列中有一個列表,就是消息隊列記錄了所有正在等待獲得消息的任務(wù),當(dāng)一則消息發(fā)布到隊列中時,最高優(yōu)先級任務(wù)獲得該消息,發(fā)布方也可以向消息隊列中所有等待的任務(wù)廣播一則消息。
2.2 消息隊列是UCOSIII中的一個內(nèi)核對象,為結(jié)構(gòu)體OS_Q。
struct os_q {
OS_OBJ_TYPE Type;
CPU_CHAR *NamePtr;
OS_PEND_LIST PendList;
#if OS_CFG_DBG_EN > 0u
OS_Q *DbgPrevPtr;
OS_Q *DbgNextPtr;
CPU_CHAR *DbgNamePtr;
#endif
OS_MSG_Q MsgQ //消息列表
};
OS_MSG_Q也是一個結(jié)構(gòu)體,如下:
struct os_msg_q {
OS_MSG *InPtr;
OS_MSG *OutPtr;
OS_MSG_QTY NbrEntriesSize;
OS_MSG_QTY NbrEntries;
OS_MSG_QTY NbrEntriesMax;
};
消息發(fā)布以后會被存放在OS_MSG類型的數(shù)據(jù)結(jié)構(gòu)中,OS_MSG如下:
struct os_msg {
OS_MSG *NextPtr;
void *MsgPtr;
OS_MSG_SIZE MsgSize;
CPU_TS MsgTS;
};
2.3 消息隊列API函數(shù)
2.3.1 創(chuàng)建消息隊列
void OSQCreate (OS_Q *p_q, //指向一個消息隊列,采用OS_Q Msg_Que定//義一個消息隊列
CPU_CHAR *p_name, //消息隊列的名字
OS_MSG_QTY max_qty, //消息隊列的長度,必須大于0
OS_ERR *p_err) //保存錯誤碼
2.3.2 等待消息隊列
void *OSQPend (OS_Q *p_q,//指向一個消息隊列
OS_TICK timeout,//等待消息的超時時間
OS_OPT opt,//選擇是否使用阻塞模式,有2個選項
OS_MSG_SIZE *p_msg_size,//指向一個變量用來表示接收到消息長度
CPU_TS *p_ts,//指向一個時間戳,表明什么時候接收到消息
OS_ERR *p_err)
2.3.3 向消息隊列發(fā)送消息
void OSQPost (OS_Q *p_q,//指向一個消息隊列
void *p_void,//指向?qū)嶋H發(fā)送的內(nèi)容
OS_MSG_SIZE msg_size,//設(shè)定消息的大小,字節(jié)數(shù)
OS_OPT opt,//選擇消息發(fā)送操作的類型,基本有四種也可結(jié)合
OS_ERR *p_err)
3、UCOSIII任務(wù)內(nèi)建消息隊列
同任務(wù)內(nèi)嵌信號量一樣,UCOSIII的每個任務(wù)中也有內(nèi)建消息隊列。而且多個任務(wù)等待同一個消息隊列的應(yīng)用很少見,UCOSIII中每個任務(wù)多有其內(nèi)建消息隊列的話用戶可以不用通過外部的消息隊列而直接向任務(wù)發(fā)布消息。
如果需要使用任務(wù)內(nèi)建消息隊列功能的時候需要將宏OS_CFG_TASK_Q_EN置1來使能相關(guān)的代碼。
任務(wù)內(nèi)建消息隊列的函數(shù)在os_task.c中
3.1等待任務(wù)內(nèi)建消息
void *OSTaskQPend (OS_TICK timeout,//等待消息的超時時間
OS_OPT opt,//是否使用阻塞模式
OS_MSG_SIZE *p_msg_size,//存放消息大小的變量
CPU_TS *p_ts,//時間戳
OS_ERR *p_err)
3.2 發(fā)送任務(wù)內(nèi)建消息
void OSTaskQPost (OS_TCB *p_tcb,//指向接收消息任務(wù)的TCB
void *p_void,//發(fā)送給一個任務(wù)的消息
OS_MSG_SIZE msg_size,//消息的大小
OS_OPT opt,//發(fā)送操作類型:LIFO和FIFO
OS_ERR *p_err)
上一篇:UCOSIII事件標(biāo)志組和同時等待多個內(nèi)核對象
下一篇:UCOSIII中斷和時間管理
推薦閱讀
史海拾趣
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- ROHM推出“PFC+反激控制參考設(shè)計”,助力實現(xiàn)更小巧的電源設(shè)計!
- 實現(xiàn)自我溝通和與世界溝通的新方式
- 上汽集團(tuán)將推10萬級半固態(tài)電池車型
- Bourns 推出其最小封裝尺寸 AEC-Q200 認(rèn)證車規(guī)級厚膜電阻
- 特斯拉大量使用激光雷達(dá)!
- 為何只有特斯拉采用PC芯片,而其他車企采用手機(jī)級車規(guī)芯片?
- 孚能科技:全固態(tài)電池進(jìn)入中試生產(chǎn)階段,計劃年底建成 0.2GWh 中試線
- 三星顯示獲梅賽德斯-邁巴赫S級48英寸OLED屏幕訂單
- Clearmotion全主動懸掛系統(tǒng)將搭載保時捷,蔚來ET9已應(yīng)用
- R-SARC上車國產(chǎn)車型 京西智行讓智能底盤科技平權(quán)
- 學(xué)習(xí)贏京東卡 | 從12V電池及供電網(wǎng)絡(luò)優(yōu)化的角度分析電動汽車E/E架構(gòu)的趨勢
- 吉時利DMM6500 6½ 位數(shù)字觸摸屏萬用表六大功能,滿足工程師的切身需求,獻(xiàn)給有夢想的你!
- 有獎直播 | 德州儀器基于 Arm 的 AM62 處理器簡介
- 端午節(jié)芯幣兌換禮品專場
- 分享贏開發(fā)板:告訴小伙伴,2018年ST全國巡回研討會開始啦
- 看羅德與施瓦茨視頻講解,了解示波器藝術(shù),答題贏好禮!
- TI有獎直播|精密 ADC 在變送器中的應(yīng)用
- 有獎直播|安森美先進(jìn)的封裝和驅(qū)動技術(shù)助力碳化硅能源應(yīng)用
- 用心分享,一起成長!EEWORLD月月有獎優(yōu)秀主題/回復(fù)第28期開始啦~