嵌入式實時系統的任務設計主要為任務函數的設計、任務優先級的安排、任務的數據結構設計,任務之間的同步與通信設計。
一.任務函數的設計
任務函數按任務結構可分為單次執行任務、周期執行任務和事件觸發任務,各任務的主要差異點如下:
單次執行任務:執行完任務后進入休眠狀態(一般是從任務調度中刪除自己)
周期執行任務:執行完任務后進入等待狀態,等待時間為周期時間(當執行周期小于一個時鐘節拍或者不是時鐘節拍的整數倍時,可設計為定時器中斷觸發任務)
事件觸發任務:等待事件觸發后再執行任務
?
二.任務優先級的安排
任務優先級一般按以下順序由高到低安排:
中斷關聯性
緊迫性
關鍵性
周期性
快捷性
傳遞性
?
實際優先級設計應留有余地,以至于將來做功能擴充時不必對原有優先級做大幅度調整。考慮到優先級繼承情況,不應將任務的優先級安排得太緊密。
?
三.任務的數據結構設計
任務的數據結構分為與操作系統有關的數據結構和與操作系統無關的數據結構,與操作系統有關的數據結構可在操作系統配置中進行裁剪,與操作系統無關的數據結構要注意作用域(局部變量還是全局變量)
?
四.任務之間的同步與通信
在操作系統的管理下,任務間不允許相互調用,需通過同步與通信機制來進行協調,可參考多任務實時系統的同步與通信。具體可分為行為同步、資源同步和數據通信。
?
對于任務調用的公共函數,有二個處理方法:
①互斥調用:執行時間短設置開關中斷,執行時間長則配置信號量
②可重入設計:不使用全局資源
?
1. 行為同步
①中斷與任務間的單向同步:通過信號量或消息郵箱同步
?
②兩個任務間的單向同步:通過信號量同步,當控制方優先級高于被控制方優先級時,控制方在發出信息后調用延時函數掛起自身,讓低優先級的被控制任務得以盡快運行
?
③兩個任務間的雙向同步:設立交匯點,任務A在交匯點向B發送消息,并等待B回復;B到達交匯點后等待A發送消息,在收到消息后回復A。其執行過程如下:
若任務A優先級高于任務B,任務A先運行,到達交匯點后發送消息給任務B,等待B回復;在A等待的時候,B進入運行狀態,B到達交匯點后,收到A發送的消息,B給A回復消息;高優先級任務A被激活,離開交匯點,A被掛起后,B離開交匯點。
若任務A優先級低于任務B,任務B先運行,到達交匯點后等待A發送的消息;在B等待的時候,A進入運行狀態,A到達交匯點后,發送消息給任務B并等待B回復;B收到A的消息后給A回復,高優先級任務B先離開交匯點,B被掛起后,A收到回復離開交匯點。
?
④兩個以上任務同步一個任務:使用事件標志組
?
⑤多個任務相互同步:用一個初始值為0的全局變量作為簽到計數器,每個任務先從簽到計數器的當前值判斷是否是最后一個到達任務,如果是就清零簽到計數器并向其他任務發出同步信號,如果不是就通過將簽到計數器加1來進行簽到,然后等待同步信號(掛起)
?
2. 資源同步
①? 關中斷
②? 關調度
③? 互斥信號量
④? 計數信號量
?
3. 數據通信
①? 全局變量:沒有行為同步,數據量小的情況下
②? 內存數據塊:沒有行為同步,數據量大的情況下
③? 消息郵箱:有行為同步,通信雙方執行頻度相同下適用;在發送消息方為中斷處理程序時,消息保存有全局變量、靜態局部變量和將消息內容冒充指針發送的方法,后二種方法較優
④? 消息隊列:適用于以下情況:消息雙方至少一方沒有穩定的執行周期;通信雙方執行周期不同