新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > VxWorks環(huán)境下基于Zinc的通信

VxWorks環(huán)境下基于Zinc的通信

作者: 時(shí)間:2012-03-27 來源:網(wǎng)絡(luò) 收藏

1 引言

  是美國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)) ,需要在環(huán)境下設(shè)計(jì)圖形用戶界面(GUI) 。提供了兩種開發(fā)圖形用戶界面的組件:WindML (Wind多媒體庫)和。WindML為圖形、圖象和聲音應(yīng)用程序的開發(fā)提供了基本技術(shù),并且提供了為定制設(shè)備開發(fā)標(biāo)準(zhǔn)化驅(qū)動(dòng)程序的框架。 是以WindML為基礎(chǔ)的, 是為應(yīng)用創(chuàng)建圖形用戶界面提供框架的可擴(kuò)展的面向?qū)ο蟮念悗?。Zinc為實(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è)信號量和共享內(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)存??梢允褂肸afApplication:: 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)行通信。


上一頁 1 2 3 下一頁

關(guān)鍵詞: VxWorks Zinc 通信

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉