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