系統(tǒng)的整體功能是通過各個(gè)任務(wù) 和ISR的協(xié)同運(yùn)行來實(shí)現(xiàn)的。運(yùn)行步驟的協(xié)調(diào)就是行為同步。 一 .用于行為同步的通信手段 1. 任務(wù)之間的動(dòng)作配合和協(xié)調(diào)關(guān)系稱為行為同步。 體現(xiàn)在: 任務(wù)之間的運(yùn)行按照某種預(yù)定的順序來進(jìn)行。在一次同步過程中,一個(gè)任務(wù)(ISR)為控制方,使用OS的通信手段發(fā)出控制信息;另一個(gè)任務(wù)為被控制方,通過通信手段得到控制信息后就進(jìn)入就緒狀態(tài),根據(jù)優(yōu)先級(jí)高低,或立即進(jìn)入運(yùn)行態(tài),或隨后進(jìn)入運(yùn)行態(tài)。 被控制方的運(yùn)行狀態(tài)由控制方發(fā)出的信息來控制。 2.實(shí)現(xiàn)行為同步的通信手段 取值只能為01的信號(hào)量稱為二值信號(hào)量。 表示某種事件是否發(fā)生。 使用范圍:被控制方總能夠及時(shí)響應(yīng)控制方發(fā)出的信號(hào),完成響應(yīng)處理任務(wù)。并在下一次信號(hào)到來之前進(jìn)入等待狀態(tài)。 直接使用 :計(jì)數(shù)信號(hào)量或消息郵箱作為二值信號(hào)量。 使用范圍:被控制方不能保證在下一次信號(hào)來到之前處理完本次控制方發(fā)出的信號(hào),但總體上可以響應(yīng)所有信號(hào)。 如果被控制方總能夠及時(shí)響應(yīng)控制方發(fā)出的信號(hào),完成響應(yīng)任務(wù),并在下一次信號(hào)來之前進(jìn)入等待狀態(tài),則計(jì)數(shù)信號(hào)量=二值信號(hào)量。 OSSemPost() 函數(shù)使 處于等待該信號(hào)量的任務(wù) 從等待狀態(tài)進(jìn)入就緒狀態(tài)(不一定運(yùn)行,要看任務(wù)優(yōu)先級(jí)),信號(hào)量不加1,如果沒有等待的任務(wù),則信號(hào)量加1 OSSemPend() 調(diào)用它來獲取信號(hào)量。
如果當(dāng)前信號(hào)量為0,則調(diào)用后任務(wù)掛起,等待控制方發(fā)送的信號(hào)量。
如果當(dāng)前信號(hào)量不為0,則調(diào)用后,將信號(hào)量-1,然后繼續(xù)運(yùn)行, 可以實(shí)現(xiàn)多個(gè)任務(wù)包括ISR協(xié)同控制一個(gè)任務(wù),當(dāng)哥哥先關(guān)任務(wù)先后發(fā)出自己的信號(hào)后(是事件標(biāo)準(zhǔn)組的對(duì)應(yīng)標(biāo)志有效),預(yù)定的邏輯運(yùn)算結(jié)果有效,觸發(fā)被控制的任務(wù)(使其進(jìn)入就緒狀態(tài))。 既提供同步的時(shí)刻,又向被控制方提供內(nèi)容。 消息郵箱里只能存放一條信息,在用消息郵箱進(jìn)行同步控制需要滿足條件:任何時(shí)候消息的生產(chǎn)速度都比消息的消費(fèi)速度慢。即,被控制任務(wù)總是在等待消息,這和二值信號(hào)量類似。 消息郵箱可以放任何類型消息。 消息郵箱可以當(dāng)二值信號(hào)量來用(void *)0表沒發(fā)生 (void*1)表示發(fā)生。 有四個(gè)函數(shù) OSMbosCreat(void *msg) msg為指向初始消息的指針。 當(dāng)作為行為同步時(shí) msg應(yīng)設(shè)為(void *)0,表示郵箱為空。 OSMbosPost(OS_EVENT *pevent,void *msg) pevent消息郵箱指針。msg為指向消息的指針。郵箱只存msg。 若有若干任務(wù)正在等待該郵箱中的消息,該函數(shù)會(huì)使等待消息的優(yōu)先級(jí)最高的任務(wù)進(jìn)入就緒態(tài)。此時(shí)消息已被直接消費(fèi),所以msg不再放入郵箱中。 OSMbosPostOpt(OS_EVENT *pevent,void *msg,INT8U opt) opt為消息分發(fā)方式。通常是廣播方式。若有若干任務(wù)正字等待該郵箱中的消息,則會(huì)使所有任務(wù)從等待態(tài)進(jìn)入就緒態(tài),此時(shí)msg不再放入郵箱中。 OSMbosPend(OS_EVENT *pevent,INT16U timeout,INT8U* err) 函數(shù)返回值為指向消息的指針,通過這個(gè)指針就可以讀取郵箱傳遞的消息內(nèi)容。 消息隊(duì)列可以存放對(duì)個(gè)消息,能夠解決消息的臨時(shí)堆積問題。滿足條件。消息的平均生產(chǎn)時(shí)間比消息的平均消費(fèi)時(shí)間長;否則再長的消息隊(duì)列也會(huì)溢出。 用一個(gè)指針數(shù)組來構(gòu)建消息隊(duì)列。 OSQ(void**start INT16U size) start是消息隊(duì)列的初始位置。指針數(shù)組的起始地址。 size是消息隊(duì)列的長度 小結(jié):通信手段選擇 不需傳輸內(nèi)容:信號(hào)類 二值信號(hào)量 計(jì)數(shù)信號(hào)量 事件標(biāo)志組 需要傳遞內(nèi)容:消息類 消息郵箱,消息隊(duì)列 任何時(shí)候生產(chǎn)速度比消費(fèi)速度慢 簡單通信手段 二值信號(hào)量 事件標(biāo)志組 消息郵箱 非周期性同步信息 有緩沖功能的通信手段 計(jì)數(shù)信號(hào)量 消息隊(duì)列 是多個(gè)信號(hào)的邏輯運(yùn)算結(jié)果 事件標(biāo)志組 合理安排同步點(diǎn)和任務(wù)優(yōu)先級(jí)時(shí)獲得預(yù)期效果的關(guān)鍵。 A:ISR和任務(wù)之間同步 
注意:與ISR相關(guān)聯(lián)的任務(wù)的優(yōu)先級(jí)要足夠高。 B:兩個(gè)任務(wù)之間的單向同步 
一般用左圖 掛起點(diǎn)為尾部 延時(shí)函數(shù)的時(shí)間要大于低優(yōu)先級(jí)任務(wù)處理事件的時(shí)間。 可以使用消息郵箱的分發(fā)功能,使一個(gè)事件同時(shí)觸發(fā)兩個(gè)任務(wù)。 C:兩個(gè)任務(wù)直接的雙向同步
通信雙方相互制約。生產(chǎn)者必須得到消費(fèi)者的回復(fù)才能進(jìn)行下一個(gè)消息的生產(chǎn)。能確認(rèn)通信每次都成功,沒有遺漏。 - 兩個(gè)以上任務(wù)同步一個(gè)任務(wù)
采用事件標(biāo)志組。采用邏輯與或者邏輯或。
|