<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 在Windows環(huán)境下調用動(dòng)態(tài)庫實(shí)現VXI嵌入式計算機間的數據傳遞

在Windows環(huán)境下調用動(dòng)態(tài)庫實(shí)現VXI嵌入式計算機間的數據傳遞

作者:■ 成都電子科技大學(xué)自動(dòng)化工程學(xué)院 趙嚴 陳光 顧亞平 時(shí)間:2005-05-06 來(lái)源:eaw 收藏

摘    要:本文介紹了調用來(lái)實(shí)現的設計,提出軟件設計的整體框架和實(shí)現方案。的設計包括三個(gè)部分:初始化通信環(huán)境、傳送數據和事件回調函數的設計。通過(guò)這種方法,實(shí)現了在Windows環(huán)境下通過(guò)調用完成同一個(gè)機箱內安裝在不同槽位的嵌入式計算機之間的數據傳遞。
關(guān)鍵詞: ;;動(dòng)態(tài)鏈接庫

引言
系統中,控制器可以選用各種流行的控制機和操作系統。嵌入式控制機無(wú)疑是一種很好的選擇。但在一些由VXI組成的大型、復雜系統中,往往一臺計算機無(wú)法完成所有的任務(wù),因此需要多臺機器之間配合完成,各自負責處理部分任務(wù),因此如何傳遞彼此間的實(shí)時(shí)性數據顯得十分重要。本文介紹在一個(gè)VXI機箱插入兩個(gè)嵌入式計算機,其中一臺作為零槽控制器,另一臺作為一個(gè)模塊,兩者之間可以快速、有效地相互交換各自處理的實(shí)時(shí)性數據。選用的環(huán)境是Windows 2000操作系統,Agilent E8401A VXI主機箱一個(gè),NI VXIpc-872B嵌入式計算機兩臺。采用的方法是共享存儲器通信和事件回調機制。

共享存儲器通信
VXI總線(xiàn)的通信方式很多,其中共享存儲器通信是對VXI總線(xiàn)字串行通信的補充。這些協(xié)議將使用少量的輔助操作而傳遞大量的信息,而這些輔助操作正是字串行協(xié)議所需要的。
VISA提供了兩種不同的方式用于直接對寄存器編程:高級存儲器函數或低級存儲器函數。高級存儲器函數允許通過(guò)簡(jiǎn)單的函數調用訪(fǎng)問(wèn)接口上的存儲器,這不需要把存儲器映射到窗口。使用高級存儲器函數可完成存儲器映射和直接存儲器訪(fǎng)問(wèn)。由于此函數包含了存儲器空間的映射和直接寄存器訪(fǎng)問(wèn),這就增加了程序的執行時(shí)間。和高級存儲器函數一樣,低級存儲器函數允許直接訪(fǎng)問(wèn)接口上的內存,但是,調用低級存儲器函數時(shí),必須用低級存儲器函數對地址和被訪(fǎng)問(wèn)的寄存器進(jìn)行映射。在使用低級存儲器函數時(shí),為了提高程序的執行速度,低級存儲器函數不返回錯誤代碼。

使用事件和句柄
事件是需要引起應用程序注意的特殊事件。事件類(lèi)型包括服務(wù)請求、中斷和硬件觸發(fā)。只有當適當的事件允許時(shí),事件才能被傳送。當事件發(fā)生時(shí),有兩種方式應引起注意:
1. 用viInstallhandler安裝事件,用viEnableEvent使能一個(gè)或多個(gè)事件。如果事件以句柄的形式使能,當指定的事件發(fā)生時(shí),指定的事件句柄就被調用。這種方式被叫作回調方式。
2. 使用viEnableEvent使能一個(gè)或幾個(gè)事件并且調用viWaitOn Event函數。viWaitOn Event函數將掛起執行程序,直到指定的事件發(fā)生或到達指定的超時(shí)值。這種方式被叫做排隊方式。
這兩種方式是彼此獨立的,在同一時(shí)間可以使用一種或兩種同時(shí)使用?;卣{方式通常用來(lái)處理需要立即反應的事件,排隊方式用來(lái)處理非緊急事件。為了滿(mǎn)足實(shí)時(shí)性的要求,本文采用回調的方式。

動(dòng)態(tài)鏈接庫的設計與實(shí)現
為了提高動(dòng)態(tài)鏈接庫的效率,選用動(dòng)態(tài)鏈接庫中的函數的原則如下:
1. 不同的函數按功能分類(lèi),如初始化通信環(huán)境、傳送數據、釋放系統資源、實(shí)用函數(事件回調函數)等。
2. 保持函數之間一定的獨立性。
3. 如果一個(gè)功能由數個(gè)函數執行,應該簡(jiǎn)化命令序列。
4. 使函數總數目最少。
整個(gè)動(dòng)態(tài)鏈接庫中函數按照功能可分為初始化和數傳兩類(lèi)。初始化類(lèi)包括初始化通信函數和釋放系統資源函數;數傳類(lèi)包括傳送數據函數和實(shí)用函數。
在初始化通信函數中,首先應在兩個(gè)模塊的進(jìn)程中各自打開(kāi)自己的一個(gè)會(huì )話(huà)。在對接口存儲器進(jìn)行映射之前先要進(jìn)行存儲器分配,然后從指定的地址偏移量處進(jìn)行端口映射,本文采用的是A24地址映射方式。當調用數據傳遞函數傳遞完數據后還應該通知對方接收數據,本文采用的是VXI總線(xiàn)觸發(fā)的方式來(lái)通知數據傳遞,因此在初始化函數中還應該使能一個(gè)事件,指定觸發(fā)方式。
數據傳遞函數負責處理數據的傳遞。這里需要注意的是使用存儲器映射函數只能傳遞8位、16位和32位無(wú)符號整數,所以必須通過(guò)軟件編寫(xiě)進(jìn)行數據格式的轉換。
實(shí)用函數主要是指在初始化通信函數中使能的事件所對應的回調函數。此函數的作用是監聽(tīng)并接收數據。如果監聽(tīng)到的是指定的觸發(fā),就通過(guò)存儲器映射函數將數據讀出來(lái),經(jīng)過(guò)一定的數據格式轉換還原出原始數據,之后向主線(xiàn)程發(fā)送消息,通知數據已經(jīng)接收到。主線(xiàn)程使用線(xiàn)程間通信的方法將數據接收并進(jìn)行相應的處理。從而整個(gè)數據的傳遞過(guò)程結束。
下面是動(dòng)態(tài)鏈接庫主要函數實(shí)現的方法:
void InitCommunication (DWORD thrdid)  file://初始化通信環(huán)境
{
          .
          .
          .
viInstallHandler (vi,VI_EVENT_TRIG,myHdlr, (ViAddr)10); file://聲明一個(gè)回調函數
viEnableEvent (vi,VI_EVENT_TRIG,VI_HNDLR, VI_NULL);    file://使能一個(gè)事件
viMemAlloc(vi,0x200,&offset);                        
file://分配一塊內存
viMapAddress(vi,VI_A24_ SPACE,0, 0X200,VI_FALSE,VI_ NULL,&addr);  file://映射地址
          .
          .
          .
}
void Senddata(unsigned short data2)          file://數據傳遞函數
{
    viPoke16(vi,addr,data2);
viAssertTrigger (vi,VI_TRIG_PROT_SYNC);
}
ViStatus _VI_FUNCH myHdlr(ViSession vi,ViEventType eventType,ViEvent ctx,ViAddr userHdlr)           file://事件回調函數
{
  viGetAttribute(ctx,VI_ATTR_ RECV_TRIG_ID,&trigId);
file://得到觸發(fā)id
  switch(trigId)
  {
     case VI_TRIG_TTL0:                           file://判斷是否TTL0的觸發(fā)
          viPeek16(vi,addr,&a);
     break;
          .
          .
          .
   }
通過(guò)在程序中調用上面的Senddata函數可以實(shí)現一個(gè)unsigned short型數據的傳遞。當需要傳遞多個(gè)數據時(shí),建議使用結構體定義要傳遞的數據。

結語(yǔ)
本文通過(guò)對VXI共享存儲器通信和處理事件機制的介紹,闡述了如何在Windows環(huán)境下通過(guò)動(dòng)態(tài)鏈接庫實(shí)現兩塊嵌入式計算機之間的數據傳遞,其中有關(guān)的細節在HP或NI提供的VISA幫助中有詳盡的說(shuō)明,不再贅述?;谶@種方法編寫(xiě)出來(lái)的程序處理VXI零槽控制器和非零槽模塊之間的通信問(wèn)題是比較合適的?!?/P>

參考文獻
1 陳光,顧亞平,彭美娥.內嵌式VXI總線(xiàn)控制計算機.VXI世界,1996
2 張世基,楊安祿,陳長(cháng)齡. 自動(dòng)測試系統. 電子科技大學(xué)出版社,1994
3 楊安祿,陳長(cháng)齡. 電子儀器接口技術(shù).電子科技大學(xué)出版社,1994年



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>