新聞中心

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

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

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


d)派生設(shè)備

  選用共享內(nèi)存或消息隊(duì)列作為方法時(shí),需要與該方法進(jìn)行交互,這可以通過派生設(shè)備實(shí)現(xiàn)。使用派生設(shè)備的目的是為了檢查是否有來自另一個(gè)任務(wù)的。每當(dāng)ZafEventManager::Get() 函數(shù)被調(diào)用,事件管理器輪詢該設(shè)備,看看是否有新消息。這個(gè)派生設(shè)備僅僅需要檢查共享內(nèi)存或消息隊(duì)列。如果有新信息可用,派生設(shè)備可以直接調(diào)用對象的 Event() 函數(shù)在隊(duì)列上面放置一個(gè)新事件,也可以自己處理這個(gè)消息。

  派生設(shè)備還可用于實(shí)現(xiàn)從GUI任務(wù)到非GUI任務(wù)的通信。

  ZafEventManager::UnBlock()函數(shù)對這種通信方法是非常有用的。在正常的情況下,如果沒有需要處理的事件, 會阻塞自己。如果采用一個(gè)派生設(shè)備監(jiān)聽一個(gè)消息隊(duì)列,向該隊(duì)列發(fā)送一個(gè)消息后解除事件管理器的阻塞可以更及時(shí)地輪詢該派生設(shè)備。派生設(shè)備自身不會阻塞,也不會導(dǎo)致暫停。

3 選擇通信方式的原則

  上述關(guān)于GUI任務(wù)的通信方法各有其優(yōu)缺點(diǎn)。在選擇通信方法的時(shí)候,應(yīng)該以具體的應(yīng)用場合為依據(jù),一般應(yīng)遵循如下的原則:

a) 應(yīng)該盡可能選用簡單的通信方式。

  在大多數(shù)情況下, Zinc入口點(diǎn)足夠用。Zinc入口點(diǎn)是最簡單的關(guān)于GUI任務(wù)的通信方式,因?yàn)樗鼈儾恍枰猌inc 任務(wù)內(nèi)部的任何專門代碼??捎玫淖詈唵稳肟邳c(diǎn)是ZafEventManager::Put()函數(shù)。然而,它有下列缺點(diǎn):第一,它只允許從非GUI任務(wù)到 GUI任務(wù)的通信;第二,它是異步的;第三,因?yàn)橐乐筞afEventManager::Get() 和ZafEventManager::Put()函數(shù)同時(shí)訪問Zinc事件隊(duì)列以對其進(jìn)行保護(hù), ZafEventManager::Put() 可能會阻塞。

  如果異步通信是可接受的,但是不能接受阻塞,可以采用下列兩種方法:第一,使用 ZafEventManager::Put ( )函數(shù),并且另外有一個(gè)可被阻塞的任務(wù)向Zinc隊(duì)列中放置事件。這個(gè)任務(wù)可以監(jiān)聽一個(gè)OS消息隊(duì)列,而原先產(chǎn)生消息的任務(wù)正是使用OS消息隊(duì)列來發(fā)送消息; 第二,創(chuàng)建一個(gè)設(shè)備以監(jiān)聽OS消息隊(duì)列,產(chǎn)生消息的任務(wù)發(fā)送一個(gè)消息給OS消息隊(duì)列,然后由派生設(shè)備接收并解釋。派生設(shè)備可以放置一個(gè)事件在Zinc隊(duì)列中,或者自己處理這個(gè)事件。只是這兩種方法都給應(yīng)用程序增加了一點(diǎn)復(fù)雜性。

b) 如果需要進(jìn)行同步通信,必須使用函數(shù)對ZafApplication::BeginSynchronize() 和ZafApplication::EndSynchronize() 。

  調(diào)用ZafApplication::BeginSynchronize()之后,可以保證對Zinc對象的任何訪問是安全的。該方法很簡單,且不需要在GUI任務(wù)中添加專門的代碼。使用ZafApplication::BeginSynchronize() 的缺點(diǎn)是該函數(shù)會阻塞,使用該方法時(shí)必須采取預(yù)防措施。

c) 采用共享內(nèi)存進(jìn)行通信時(shí)必須創(chuàng)建保護(hù)和同步機(jī)制

  共享內(nèi)存是從GUI任務(wù)到非GUI任務(wù)的兩種通信方法之一,其優(yōu)點(diǎn)是對數(shù)據(jù)的訪問簡單而直接。共享內(nèi)存沒有對數(shù)據(jù)訪問進(jìn)行保護(hù)的內(nèi)在支持,所以必須創(chuàng)建一個(gè)對訪問進(jìn)行保護(hù)及同步的機(jī)制,并且訪問共享內(nèi)存的所有任務(wù)都應(yīng)該使用該機(jī)制。采取這種方案的缺點(diǎn)是容易發(fā)生阻塞。

d) 在不能接受阻塞的應(yīng)用場合,最好使用OS消息隊(duì)列。

  OS消息隊(duì)列是從GUI任務(wù)到非GUI任務(wù)和從非GUI任務(wù)到GUI任務(wù)進(jìn)行通信的另一種方法。使用OS消息隊(duì)列進(jìn)行通信的時(shí)候,需要在GUI任務(wù)和非 GUI任務(wù)中編寫訪問消息隊(duì)列的代碼。在正確進(jìn)行設(shè)置的情況下,消息隊(duì)列不會引起阻塞的問題。創(chuàng)建消息隊(duì)列時(shí),必須保證消息隊(duì)列有足夠的消息容量或者建立處理消息隊(duì)列溢出的機(jī)制。

4 Zinc的事件模型

  Zinc中的GUI任務(wù)與非GUI任務(wù)的多種通信方式都與Zinc的事件模型有關(guān),因此在設(shè)計(jì)和實(shí)現(xiàn)GUI任務(wù)與非GUI任務(wù)之間的通信時(shí),需要對Zinc的事件模型有深入的理解。Zinc具有一個(gè)事件驅(qū)動(dòng)的體系結(jié)構(gòu)。輸入設(shè)備與應(yīng)用程序之間的交互是通過事件完成的。由于本身不是事件驅(qū)動(dòng)的實(shí)時(shí)操作系統(tǒng),在運(yùn)行平臺中, Zinc主要從輸入設(shè)備和應(yīng)用任務(wù)獲取事件。

  然后Zinc以標(biāo)準(zhǔn)的方式將這些事件打包,并且將它們路由給適當(dāng)?shù)膶ο笠赃M(jìn)行進(jìn)一步的處理。在EGIS中, GSM通訊任務(wù)使用了自定義的事件與GUI任務(wù)進(jìn)行異步通信?;赯inc的EGIS事件模型如圖1所示。


 
圖1 基于Zinc的EGIS事件路由示意圖



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

評論


相關(guān)推薦

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

關(guān)閉