VxWorks環境下基于Zinc的通信
1 引言
VxWorks是美國Wind River Systems公司開發的一種嵌入式實時操作系統,它以高性能可剪裁的微內核以及友好的用戶開發環境在嵌入式實時操作系統領域占有重要的地位。
在很多實時應用場合(如嵌入式地理信息系統) ,需要在VxWorks環境下設計圖形用戶界面(GUI) 。VxWorks提供了兩種開發圖形用戶界面的組件:WindML (Wind多媒體庫)和Zinc。WindML為圖形、圖象和聲音應用程序的開發提供了基本技術,并且提供了為定制設備開發標準化驅動程序的框架。 Zinc是以WindML為基礎的, Zinc是為應用創建圖形用戶界面提供框架的可擴展的面向對象的類庫。Zinc為實現復雜的圖形用戶界面提供了更多的支持。
為了提高性能和簡化源代碼,大多數情況下在一個實時環境中的應用程序是以多任務的方式實現的, Zinc自身通常也是多任務的。一般不在外部任務里直接處理GUI ,而是在一個專用的GUI任務里執行所有的GUI處理。在多任務環境下,非GUI任務將需要在不同的時期和GUI任務通信, GUI也可能需要與外部任務通信。GUI任務與非GUI任務之間的通信方式將對整個實時系統的實時性、可靠性和穩定性產生重大的影響。因此, 深入研究VxWorks環境下Zinc所支持的GUI任務與非GUI任務之間的通信方式并確定在特定應用場合選擇通信方式的原則是非常重要的。
2 GUI( Zinc)任務和外部任務之間的通信方法
GUI任務和非GUI任務之間的通信大致可以分為兩種:同步通信和異步通信。Zinc主要提供了如下幾種通信機制供程序員選擇使用:
Zinc入口點
共享內存
OS消息隊列
派生設備
a)Zinc入口點
可以利用Zinc入口點實現GUI任務與非GUI任務之間的通信,主要有如下兩種方法:
與Zinc通信的基本入口點是ZafEventManager::Put()程序。利用該函數可以在Zinc事件隊列中放置一個事件。這是一個異步方法,因此只能適用于可接受異步通信的場合。
ZafApplication::BeginSynchronize() 和ZafApplication::EndSynchronize() 。這兩個函數自身并不是通信程序,但能確保直接通信方式訪問Zinc是安全的。直接通信通常由一個對象的Event()函數來實現,也可能采用其它的方式,比如數據對象更新。間接通信可以使用ZafEventManager::Unblock()函數來實現。使用一個派生設備或其它方法進行通信的時候, 使用該函數可以使正在等待事件的Zinc任務解除阻塞。
b)共享內存
在VxWorks中很容易實現共享內存。為了安全地共享內存,最好讓一個信號量和共享內存關聯。這樣可以避免任務之間出現資源沖突。
使用共享內存的時候,通常不需要使用Zinc 提供的保證線程安全的入口點。但是當一個窗口對象的某個成員指向共享內存的時候是一個例外情況。例如,如果一個ZafButton的bitmapData 成員正指向共享內存,除非已經確保Zinc任務目前沒有使用該共享內存,才能安全地更新該共享內存。可以使用ZafApplication:: BeginSynchronize() 和ZafApplication::EndSynchronize() 函數來保證在某一時刻該任務是唯一使用該共享內存的任務。
c)OS消息隊列
在VxWorks環境下使用Zinc的時候,有兩種不同類型的消息隊列可供選用:事件管理器消息隊列和VxWorks操作系統提供的消息隊列。
可以通過ZafEventManager::Put()和ZafEventManager::Get()函數訪問事件管理器消息隊列。事件管理器隊列只提供從非GUI任務到Zinc任務的通信,利用事件管理器隊列進行從GUI任務到非GUI任務的通信是不實用的。
VxWorks消息隊列可以實現從GUI任務到非GUI任務的通信,也可以實現從非GUI任務到GUI任務的通信,但是不允許同時在兩個方向上進行通信。
評論