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