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