新聞中心

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

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

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

  從圖1中,在事件的主要來(lái)源是輸入設(shè)備和應(yīng)用程序(比如GSM程序) ,由于不支持事件驅(qū)動(dòng)的系統(tǒng),事件管理器周期性地查詢或接收來(lái)自輸入設(shè)備的數(shù)據(jù)并以定義的事件結(jié)構(gòu)包裝成事件。一旦事件管理器獲得事件, 主控進(jìn)程重新獲得對(duì)應(yīng)用程序的控制,該進(jìn)程從時(shí)間管理器中得到事件并傳送給窗口管理器。窗口管理器決定事件的最終目的地和合適的路由并將其發(fā)送。最終窗口對(duì)象的Event方法收到每個(gè)事件并對(duì)其進(jìn)行處理。在EGIS中,通過(guò)重載Event函數(shù)實(shí)現(xiàn)對(duì)自定義事件的處理。

5 EGIS 系統(tǒng)中GUI任務(wù)與非GUI任務(wù)之間的實(shí)現(xiàn)  

  嵌入式地理信息系統(tǒng)包括了兩個(gè)部分,跑車分系統(tǒng)和中心顯示分系統(tǒng)。跑車上包括一臺(tái)PC機(jī)、一臺(tái)GPS接收機(jī)和一臺(tái)短信收發(fā)設(shè)備。中心包括一臺(tái) 目標(biāo)機(jī)、一臺(tái)PC機(jī)(用于開(kāi)發(fā)和調(diào)試)和一臺(tái)短信收發(fā)設(shè)備。其中,VxWorks目標(biāo)機(jī)上運(yùn)行的是EGIS各功能模塊。

  為了提高系統(tǒng)性能和簡(jiǎn)化代碼,將目標(biāo)機(jī)上的EGIS軟件劃分為兩個(gè)任務(wù): GUI任務(wù)和GSM任務(wù)。GUI任務(wù)的主要功能是:負(fù)責(zé)界面和菜單的實(shí)現(xiàn),并且需要根據(jù)GSM實(shí)時(shí)接收到的經(jīng)緯度數(shù)據(jù)在地圖上畫(huà)出跑車的運(yùn)行軌跡。 GSM通訊任務(wù)的主要功能是:實(shí)時(shí)接收以短消息方式傳輸?shù)腉PS經(jīng)緯度數(shù)據(jù),存放在環(huán)形緩沖區(qū)中,并通知GUI任務(wù)。

   EGIS系統(tǒng)需要滿足兩方面的實(shí)時(shí)性:第一, GSM通信任務(wù)接收經(jīng)緯度數(shù)據(jù)的實(shí)時(shí)性;第二, GUI任務(wù)響應(yīng)菜單操作的實(shí)時(shí)性和特定情況下畫(huà)出跑車軌跡的實(shí)時(shí)性。為此,在該系統(tǒng)中采取兩種通信方式: Zinc入口點(diǎn)和共享內(nèi)存。GUI任務(wù)與非GUI任務(wù)之間通信的實(shí)現(xiàn)主要包括如下幾個(gè)方面:

a)用戶事件的定義

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

b)用戶事件的發(fā)送

  用戶事件的發(fā)送通過(guò)下面的調(diào)用完成:
  zafApplication-> EventManager() -> Put(TRACKING)

  其中, zafApplication是Zinc全局變量,也是GUI任務(wù)的任務(wù)變量。某些程序可能同時(shí)被多個(gè)任務(wù)調(diào)用,這些程序可能要求全局變量或靜態(tài)變量對(duì)于每個(gè)調(diào)用該程序的任務(wù)具有一個(gè)不同的值。為了適應(yīng)這種情況, VxWorks提供了一種所謂任務(wù)變量的機(jī)制。一個(gè)4字節(jié)的變量可以以任務(wù)變量的方式被添加到一個(gè)任務(wù)的上下文中,這樣每當(dāng)任務(wù)切換的時(shí)候同時(shí)切換該變量的值。由于在GUI任務(wù)和GSM通信任務(wù)中的zafApplication具有不同的值,因此,可以在創(chuàng)建GSM通信任務(wù)的時(shí)候通過(guò)參數(shù)傳遞使GSM通信任務(wù)獲得GUI任務(wù)的任務(wù)變量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添加為任務(wù)變量*/
  }   /*通過(guò)參數(shù)傳遞GUI任務(wù)的任務(wù)變量zafApplication*/
  在GSM通信任務(wù)中:
  int Trace(CGIS_Window * pWindow,ZafApplication *application)
  {
  ……
  taskVarAdd(0,(int*)zafApplication);  
  /*將zafApplication添加為任務(wù)變量*/
  zafApplication = application; /*GSM通信任務(wù)變量zafApplication賦值*/
  zafApplication->EventManager() -> Put(TRACKING) /*發(fā)送用戶事件*/
  ……
  }

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

d)任務(wù)之間的數(shù)據(jù)共享

  共享數(shù)據(jù)是通過(guò)下面的全局變量數(shù)據(jù)實(shí)現(xiàn)的。GSM任務(wù)收到數(shù)據(jù)之后,首先將經(jīng)緯度數(shù)據(jù)存入數(shù)組Lat_Long中,然后將變量PntNumber加1,而GUI任務(wù)首先讀取PntNumber,然后處理Lat_Long中的數(shù)據(jù)。因此不會(huì)產(chǎn)生共享沖突。
  float Lat_Long [ 2000 ];   /*存放通過(guò)GSM終端所收到的經(jīng)緯度數(shù)據(jù)*/
  int PntNumber; /*存放通過(guò)GSM終端所收到的經(jīng)緯度數(shù)據(jù)的個(gè)數(shù)*/

6 結(jié)論

  本文介紹了VxWorks支持的任務(wù)之間進(jìn)行通信的各種方式,給出了在特定應(yīng)用場(chǎng)合選擇任務(wù)之間通信方式的原則,介紹了Zinc的事件模型,并詳細(xì)地給出了嵌入式地理信息系統(tǒng)中非GUI任務(wù)與GUI任務(wù)進(jìn)行通信的實(shí)現(xiàn)方式。實(shí)驗(yàn)證明,該通信方式能夠滿足嵌入式地理信息系統(tǒng)各方面的實(shí)時(shí)性要求。


上一頁(yè) 1 2 3 下一頁(yè)

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

評(píng)論


相關(guān)推薦

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

關(guān)閉