VxWorks支援各種任務間通訊機制,提供了多樣的任務間通訊方式,主要有如下幾種:
Ÿ 共用記憶體,主要是資料的共用;
Ÿ 訊號量,用於基本的互斥和任務同步;
Ÿ 訊息佇列和管道,單CPU的訊息傳送;
Ÿ Socket和遠端程序呼叫,用於網路間任務訊息傳送;
Ÿ 二進位訊號,用於異常處理。
在多處理器之間的任務也可採用共用記憶體對象來實現任務間通訊,只是在系統配置上有所不同.
1.1.1.共用儲存區
任務間通訊的最簡單的方法是採用共用儲存區,也即相關的各個任務分享屬於它們的地址空間的同一記憶體地區。因為所有任務都存在於單一的線性地址空間,任務間共用資料。全域變數、線性隊列、環形隊列、鏈表、指標都可被運行在不同內容相關的代碼所指向。
1.1.2.互斥
當某一地址空間用於資料交換時,為了避免衝突,對於記憶體的鎖定是非常重要的。兩個或多個任務讀寫某些共用資料時,最後的結果取決於任務啟動並執行精確時序,有可能得到錯誤值,這樣必須以某種手段確保當一個任務在使用一個共用變數或檔案時,其他任務不能做同樣的操作。主要有關中斷、搶佔禁止和用訊號量鎖定資源等方法。(vxworks任務調度機製為中斷搶佔,優先順序搶佔(需要觸發條件,觸發條件就是中斷)和任務使用taskdelay直接放棄CPU)一般來說,關中斷是最有效解決互斥的方法。但這對於即時應用來說,它阻止系統對外來事件的響應,無法滿足即時性的要求。同樣,中斷延遲也是不能接受。
1.1.3.訊號量
VxWorks訊號量提供最快速的任務間通訊機制,它主要用於解決任務間的互斥和同步。針對不同類型的問題,有以下三種訊號量:
Ÿ 二進位訊號量使用最快捷、最廣泛,主要用於同步或互斥;
Ÿ 互斥訊號量 主要用於優先順序繼承、安全刪除和回溯;
Ÿ 計數器
VxWorks還提供POSIX訊號量和多處理器上訊號量的應用。
1.1.1.訊息佇列
現實的即時應用由一系列互相獨立又協同工作的工作群組成。訊號量為任務間同步和聯鎖提供了高效方法。單一處理器中任務間訊息的傳送採用訊息訊息佇列。訊息機制使用一個被各有關進程共用的訊息佇列,任務之間經由這個訊息佇列發送和接收訊息。 任務間全雙工系統資訊傳送
1.1.2.管道
管道用VxWorks的I/O系統提供一種靈活的訊息傳送機制,它是受磁碟機pipeDrv(VxWorks所提供)管理的虛擬I/O裝置。任務能調用標準的I/O函數開啟、讀出、寫入管道。當任務試圖從一個空的管道中讀取資料,或向一個滿的管道中寫入資料時,任務被阻塞。和訊息佇列類似,ISR能向管道中寫入資訊,但不能從中讀取。象I/O裝置一樣,管道有一個訊息佇列所沒有的優勢----調用select(),任務等待一系列I/O裝置上的資料。
1.1.3.系統實現
Wind訊號量對於各種類型的訊號量的控制提供了同一正常化的介面,僅建立函數要特別指明訊號量類型。
semBCreate() 建立(產生並啟用)一個二進位訊號量
semMCreate() 建立(產生並啟用)一個互斥訊號量
semCCreate() 建立(產生並啟用)制一個計數訊號量
semDelete() 中止並自由訊號量
semTake() 獲得訊號量
semGive() 給出訊號量
semFlush() 解鎖所有正等待某一訊號量的任務
Wind 訊息佇列管理:
msgQCreate() 建立(產生並啟用)訊息佇列
msgQDelete() 中止並自由訊號量
msgQSend() 向訊息佇列發送訊息
msgQReceive() 從訊息佇列接收訊息