久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > VxWorks環境下基于Zinc的通信

VxWorks環境下基于Zinc的通信

作者: 時間:2012-03-27 來源:網絡 收藏

  從圖1中,在事件的主要來源是輸入設備和應用程序(比如GSM程序) ,由于不支持事件驅動的系統,事件管理器周期性地查詢或接收來自輸入設備的數據并以定義的事件結構包裝成事件。一旦事件管理器獲得事件, 主控進程重新獲得對應用程序的控制,該進程從時間管理器中得到事件并傳送給窗口管理器。窗口管理器決定事件的最終目的地和合適的路由并將其發送。最終窗口對象的Event方法收到每個事件并對其進行處理。在EGIS中,通過重載Event函數實現對自定義事件的處理。

5 EGIS 系統中GUI任務與非GUI任務之間的實現  

  嵌入式地理信息系統包括了兩個部分,跑車分系統和中心顯示分系統。跑車上包括一臺PC機、一臺GPS接收機和一臺短信收發設備。中心包括一臺 目標機、一臺PC機(用于開發和調試)和一臺短信收發設備。其中,VxWorks目標機上運行的是EGIS各功能模塊。

  為了提高系統性能和簡化代碼,將目標機上的EGIS軟件劃分為兩個任務: GUI任務和GSM任務。GUI任務的主要功能是:負責界面和菜單的實現,并且需要根據GSM實時接收到的經緯度數據在地圖上畫出跑車的運行軌跡。 GSM通訊任務的主要功能是:實時接收以短消息方式傳輸的GPS經緯度數據,存放在環形緩沖區中,并通知GUI任務。

   EGIS系統需要滿足兩方面的實時性:第一, GSM通信任務接收經緯度數據的實時性;第二, GUI任務響應菜單操作的實時性和特定情況下畫出跑車軌跡的實時性。為此,在該系統中采取兩種通信方式: Zinc入口點和共享內存。GUI任務與非GUI任務之間通信的實現主要包括如下幾個方面:

a)用戶事件的定義

  Zinc中的事件共分為七類,其中包括用戶事件。用戶事件的取值范圍為10,000到32,767。在EGIS中定義的用戶事件為:
const ZafEventType TRACKING = 10028;
  其中, ZafEventType是Zinc事件類型。

b)用戶事件的發送

  用戶事件的發送通過下面的調用完成:
  zafApplication-> EventManager() -> Put(TRACKING)

  其中, zafApplication是Zinc全局變量,也是GUI任務的任務變量。某些程序可能同時被多個任務調用,這些程序可能要求全局變量或靜態變量對于每個調用該程序的任務具有一個不同的值。為了適應這種情況, VxWorks提供了一種所謂任務變量的機制。一個4字節的變量可以以任務變量的方式被添加到一個任務的上下文中,這樣每當任務切換的時候同時切換該變量的值。由于在GUI任務和GSM通信任務中的zafApplication具有不同的值,因此,可以在創建GSM通信任務的時候通過參數傳遞使GSM通信任務獲得GUI任務的任務變量zafApplication:
  if (GSMTaskID = taskSpawn("SERIAL_PORT",90, VX_FP_TASK,
  ZAF_VXW_STACK_SIZE, (FUNCPTR)Trace,
  (int)zafApplication,0,0,0,0,0,0,0,0,0) != ERROR)
  {
  taskVarAdd(GSMTaskID,(int*)
  zafApplication);
  /*將zafApplication添加為任務變量*/
  }   /*通過參數傳遞GUI任務的任務變量zafApplication*/
  在GSM通信任務中:
  int Trace(CGIS_Window * pWindow,ZafApplication *application)
  {
  ……
  taskVarAdd(0,(int*)zafApplication);  
  /*將zafApplication添加為任務變量*/
  zafApplication = application; /*GSM通信任務變量zafApplication賦值*/
  zafApplication->EventManager() -> Put(TRACKING) /*發送用戶事件*/
  ……
  }

c)用戶事件的處理
  ZafEventType CGIS_Window::Event(const ZafEventStruct event)
  {
  ZafEventType code;
  if ( event_type == TRACKING) /*判斷是否用戶定義事件TRACKING*/
  {
  ……
  m_pMainController->ZoomToPosition ( Lat_Long[0],Lat_Long[1]); /*事件處理函數*/
  code = TrackCode;
  return (code);
  }
  else
  {
  ……/*處理其他事件*/
  }

d)任務之間的數據共享

  共享數據是通過下面的全局變量數據實現的。GSM任務收到數據之后,首先將經緯度數據存入數組Lat_Long中,然后將變量PntNumber加1,而GUI任務首先讀取PntNumber,然后處理Lat_Long中的數據。因此不會產生共享沖突。
  float Lat_Long [ 2000 ];   /*存放通過GSM終端所收到的經緯度數據*/
  int PntNumber; /*存放通過GSM終端所收到的經緯度數據的個數*/

6 結論

  本文介紹了VxWorks支持的任務之間進行通信的各種方式,給出了在特定應用場合選擇任務之間通信方式的原則,介紹了Zinc的事件模型,并詳細地給出了嵌入式地理信息系統中非GUI任務與GUI任務進行通信的實現方式。實驗證明,該通信方式能夠滿足嵌入式地理信息系統各方面的實時性要求。


上一頁 1 2 3 下一頁

關鍵詞: VxWorks Zinc 通信

評論


相關推薦

技術專區

關閉