<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

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


          d)派生設(shè)備

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

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

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

          3 選擇通信方式的原則

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

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

            在大多數(shù)情況下, Zinc入口點足夠用。Zinc入口點是最簡單的關(guān)于GUI任務(wù)的通信方式,因為它們不需要Zinc 任務(wù)內(nèi)部的任何專門代碼。可用的最簡單入口點是ZafEventManager::Put()函數(shù)。然而,它有下列缺點:第一,它只允許從非GUI任務(wù)到 GUI任務(wù)的通信;第二,它是異步的;第三,因為要防止ZafEventManager::Get() 和ZafEventManager::Put()函數(shù)同時訪問Zinc事件隊列以對其進行保護, ZafEventManager::Put() 可能會阻塞。

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

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

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

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

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

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

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

          4 Zinc的事件模型

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

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


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



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

          評論


          相關(guān)推薦

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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();