《電子技術應用》
您所在的位置:首頁 > 其他 > 業界動態 > VB環境下實現PCI設備底層訪問的兩種方法

VB環境下實現PCI設備底層訪問的兩種方法

2009-04-10
作者:姜萬波 徐 興

  摘? 要: 介紹了在VB開發環境下,對PCI設備進行底層訪問的兩種方法:一是通過調用用戶自己編寫的動態連接庫(DLL)實現,二是利用WINDRIVER提供的VB運行庫編寫直接訪問硬件的接口函數,并對兩種方法進行了比較。

  關鍵詞: WINDRIVER? PCI 動態連接庫 應用程序接口

?

  VB集成化編程語言是一種功能強大而又容易上手的開發工具。在用戶界面、數據庫、多媒體、網絡編程等方面,VB可謂得心應手。然而VB有限的硬件編程能力又使得許多硬件開發者對此深感無奈。尤其在工業控制,測控技術等領域,自行設計開發的I/O卡,數據采集卡等在WIN32下的驅動常常需要借助DDK, VtoolsD等工具進行艱苦而又長期的內核模式開發。本文介紹了在VB開發環境下訪問PCI設備的方法。對于其他設備,方法與此大同小異。

  在VB開發環境下,用戶要訪問諸如數據采集卡之類硬件上的PCI設備,一般來說有兩種途徑:一是直接訪問,即用VB直接編寫訪問PCI設備的接口函數(這種方法需要有相關軟件的支持);二是間接訪問,即VB調用其它編程語言(如匯編,C/C++等)寫的底層驅動模塊(一般封裝成動態連接庫DLL的形式)實現。

1 PCI總線的配置空間

  PCI規范定義了三種地址空間,除了存儲器和I/O地址空間外,為支持PCI設備系統資源的自動配置,還定義了配置地址空間。

  PCI總線的配置空間由256個字節組成,分為預定首區和設備關聯區。預定首區包括開始64個字節,對所有的PCI設備來說,都必須支持該區的設置;設備關聯區的寄存器有不同的PCI設備廠家自己定義。

  配置空間的預定首區分兩個部分,前16個字節的定義對各類PCI設備而言都是相同的,后48個字節空間根據設備支持的功能有不同的分配。首區類型定義了該空間的分配情況(目前只有一種類型00H)。表1是首區的組織結構。

?

  所有的PCI設備必須支持首區中的供應商ID、設備ID、指令和狀態區。對于其他寄存器的使用可根據設備的功能來選擇。對于不同的PCI設備,其供應商ID由PCI SIG分配以確保唯一性,而設備ID則由供應商自己分配。

2 PCI設備的配置過程

  PCI總線的配置空間規范保證了所有PCI設備對“即插即用”的支持。

  系統在上電后,“即插即用”BIOS通過隔離算法讀取每一個“即插即用”設備的資源申請數據,并分配相應的系統資源,同時檢查資源的沖突情況,然后引導、加載操作系統,并將控制權交給操作系統;如果加載的是“即插即用”操作系統(WINDOWS 95及以后版本),那么操作系統將接管系統的資源管理權,它首先從BIOS讀取“即插即用”設備的資源配置信息,并仲裁資源沖突情況,然后配置BIOS尚未配置的“即插即用”設備,將設備的配置信息寫入配置管理器,最后激活無資源沖突的“即插即用”設備,裝載相應的設備驅動程序。???

  對于PCI設備來說,系統完成引導之后,除了將資源的分配寫入系統的配置管理器外,還寫入了相應的PCI配置寄存器。程序可以通過直接讀取設備的配置寄存器來得到設備的I/O,存儲器等資源配置情況。

3 VB下PCI設備的訪問

  驅動程序訪問PCI設備的過程一般包括掃描PCI總線,查找指定的PCI設備,確定I/O等資源分配情況,進行I/O、存儲器、中斷以及DMA等操作。VB本身并不能實現上述對PCI設備的訪問過程,下面介紹在VB下通過其他途徑實現對PCI設備的訪問。

3.1 VB直接訪問

  由于VB只提供了非常有限的I/O訪問能力(如串口通信),在VB下直接訪問PCI設備時需要借助其它軟件。目前WINDRIVER提供這方面的支持。WINDRIVER是KRFTech公司主推產品,是許多PCI廠家所推薦的首選驅動程序開發工具。??

WINDRIVER為VB 4.0以上版本提供了一個類模塊(WINDRAR.CLS),利用這個類模塊,用戶可以手工編寫自己所需的接口函數來訪問相應的設備。下面以具體例子來說明WINDRAR.CLS的使用方法。

3.1.1 掃描PCI總線得到指定設備的數目

  利用WINDRAR.CLS提供的應用程序接口函數(APIs),編寫一個掃描PCI總線,獲得指定PCI設備數目的函數如下:

  Function GetCardsNum(dwVendorID As

  Long, dwDeviceID As Long) As Integer

  Dim pciScan As WD_PCI_SCAN_CARDS

  Dim hWD As Long

  hWD = WD_Open()

  If hWD = INVALID_HANDLE_VALUE Then?

?????? MsgBox ″設備打開出錯!″

?????? Exit Function

  End If

  pciScan.searchId.dwVendorID =

?????? dwVendorID

?????? pciScan.searchId.dwDeviceID =

?????? dwDeviceID

  WD_PciScanCards hWD, pciScan

  WD_Close (hWD)

  GetCardsNum = pciScan.dwCards

  End Function???????????????

  該函數可以通過輸入參數:PCI設備的供應商ID和設備ID得到所需的PCI設備數目。如查找AMCC公司的PCI適配芯片S5933,則輸入參數為:&H10E8和&H4750。

  下面例子用于讀寫S5933的PCI配置寄存器。在工程的全局模塊中需要先定義下列數據結構,同時設備必須處于打開狀態。

  Type??AMCC_INTERRUPT

??????   Int As WD_INTERRUPT????

??????  hThread As Long

??????  Trans(0 To 1) As WD_Transfer

  End Type

  Type AMCC_ADDR_DESC

?     dwLocalBase As Long

?     dwMask As Long

?     dwBytes As Long

?     dwAddr As Long

?     dwAddrDirect As Long

?     fIsMemory As Boolean

  End Type

  Type AMCC_STRUCT

?     hWD As Long

?     cardLock As WD_CARD

?     pciSlot As WD_PCI_SLOT

?     cardReg As WD_CARD_REGISTER

?     addrDesc(0 To AD_PCI_BARS - 1) As

??????????AMCC_ADDR_DESC

?     fUseInt As Boolean

?     Int As AMCC_INTERRUPT

  End Type

3.1.2 讀寫PCI配置寄存器

  完成以上數據結構的定義后,用下面的函數可讀寫S5933的PCI配置寄存器內容。

  Function AMCC_ReadPCIReg( hAmcc As

  AMCC_STRUCT, dwReg As Long)

  Dim pciCnf As WD_PCI_CONFIG_DUMP?

  Dim dwVal As PVOID?

  pciCnf.pciSlot = hAmcc.pciSlot?

  pciCnf.pBuffer = dwVal?

  pciCnf.dwOffset = dwReg?

  pciCnf.dwBytes = 4?

  pciCnf.fIsRead = True?

  WD_PciConfigDump hAmcc.hWD, pciCnf?

  AMCC_ReadPCIReg = dwVal?

  End Function? ?? ‘讀函數?

  Sub AMCC_WritePCIReg(hAmcc As ?

  AMCC_STRUCT, dwReg As Long, dwData As PVOID)

????????????? Dim pciCnf As WD_PCI_CONFIG_DUMP?

????????????? pciCnf.pciSlot = hAmcc.pciSlot?

?????? ?????? pciCnf.pBuffer = dwData?

????????????? pciCnf.dwOffset = dwReg?

????????????? pciCnf.dwBytes = 4?

????????????? pciCnf.fIsRead = False?

????????????? WD_PciConfigDump hAmcc.hWD, pciCnf?

  End Sub???????? ‘寫過程

  · 參數說明:

  hAMCC????? 設備打開后系統分配的句柄

  dwReg????? 讀寫的PCI配置寄存器

????dwVal????? 讀出的寄存器數據??????

  dwData?? 寫入寄存器的數據

  以上例子僅僅是拋磚引玉。WINDRAR.CLS類模塊提供了功能極為強大的底層驅動的API函數,用戶通過編寫相應的驅動模塊可以方便地實現對各類硬件的I/O、存儲器映射、中斷以及DMA等操作,同時可以實現WIN32下物理內存空間的申請、讀寫等處理。另外對于實時性要求較高的設備,WINDRIVER提供的“內插”(Plug-In)特性可以讓程序的相關模塊運行于Ring 0內核模式(Kernel mode),以提高性能。

  開發完成的底層驅動模塊既可直接為VB的應用程序調用,也可以在VB下封裝成DLLs供其它的WIN32開發工具調用。

3.2 自定義DLL訪問

  DLL使VB的功能得到極大的增強,使得VB的應用范圍不斷擴大,使用更加靈活。VB通過調用自定義DLL可以實現對硬件的底層訪問。下面用例子說明VB對DLL的調用及DLL的編寫過程。

3.2.1 DLL的功能和編寫

  本例中的DLL通過掃描PCI總線,得到總線上S5933接口芯片的數目,打開指定設備,向S5933的輸入郵箱1中寫入命令字,然后從輸出郵箱1中讀取返回數據,最后關閉設備。

  extern “C” _declspec(dllexport) int _stdcall GetCardsNum()

  {

AFX_MANAGE_STATE(AfxGetStaticModuleState());

?????? int cards;

?????? cards=AMCC_CountCards(0x10e8,0x4750);

?????? return cards;

}?????????????????? // 此函數得到S5933的數目;

extern “C” _declspec(dllexport) DWORD_stdcall SendCommand(int CardNum,DWORD dwCmd)

{

AFX_MANAGE_STATE(AfxGetStaticModuleState());

DWORD data;?????????????

If(AMCC_Open(&hAMCC,0x10e8,0x4750,?? CardNum,0))??? // 打開指定設備

{?

AMCC_WriteRegDWord(hAMCC,OMB1_ADDR,

dwCmd);??????? // 寫入命令字

?????? do{

?????? data=AMCC_ReadRegDWord(hAMCC,MBEF_ADDR);

}while((data&0x000f0000)==0x00000000);????

?????????????????????????????????? // 等待輸入郵箱1滿

data=AMCC_ReadRegDWord(hAMCC,IMB1_ADDR);???

?????????????????????????????????? // 讀取返回數據

?????? if(hAMCC)???? AMCC_Close(hAMCC);

??????????????????????????? // 關閉設備

?????? return data;

else

{ AfxMessageBox(“打開設備失敗?選”);

?????? ? return 0;}

程序中用到的函數包含在WINDRIVER的API函數庫中,在VC++下編譯時加上頭文件:

#include “amcclib.h”

#include “amcclib.c”

  同時在DEF文件中列出DLL的導出函數名,生成的DLL即可為VB所調用。讀者也可用其它工具編寫驅動模塊,最后封裝成DLL即可。

3.2.2 VB調用DLL

  VB調用動態連接庫(DLL)時,首先聲明DLL,然后即可像調用VB的語句或函數一樣使用DLL中的例程。下面介紹VB調用上例生成的DLL(假設文件名為Test.dll)。

· 聲明

  Public Declare Function GetCardsNum Lib “Test.dll” () As Integer

  Public Declare Function SendCommand Lib “Test.dll” (ByVal dwCmd as Long) As Long

  在聲明時需要注意:DLL的路徑;參數傳遞的方式;參數的類型。

  另外,VB遵從 _stdcall的參數傳遞約定,而VC++默認_cdecl的傳遞約定,因此在DLL中的導出聲明需采用_stdcall的修飾符。

  · 調用

  一旦聲明后,在VB的應用程序中就可調用DLL中的例程。如:

  Private Sub Form_Load()

  Dim CardsNum As Integer?

  CardsNum = GetCardsNum()?

?????? MsgBox “系統中有”+ Str(CardsNum)+“塊S5933插卡!”?

  End Sub?

  WINDRIVER包括了諸如AMCC、Altera、PLX、Galileo、V3、PLDA等公司PCI芯片的專用C/C++的API函數庫,其中包含了I/O讀寫,內存映射,中斷處理以及DMA等底層驅動的函數,可以非常方便地用VC++,BC++以及C++ Builder等工具編譯成DLLs供VB調用。?

  本文提供了兩種在VB的開發環境下訪問PCI設備的方法。第一種方法需要有WINDRIVER的VB運行庫支持,可以在VB環境下直接編寫所需的接口函數,但對WINDRAR.CLS類模塊中定義的內核數據結構要有較深的了解;第二種方法具有一定的靈活性、普遍性,編寫DLL的工具較多,DLL除了可用于VB外,還可用于其他的WIN32開發工具,有較強的適應性。

  以上方法在北京航空航天大學測控技術研究所研制的PHD2000高速并行數據采集系統中得到實際應用,取得了良好的效果。

參考文獻

1 WinDriver V4 Developer's Guide.KRFTech 1997~1999

2 S5933 PCI Matchmaker Controller Data Book. Applied?Micro Circuits Corporation,1996

3 余永進譯.“即插即用”技術大全.北京:電子工業出版社
本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          久久久久久9999| 曰本成人黄色| 国产美女精品视频免费观看| 韩国一区二区在线观看| 国产精品一区二区在线观看不卡| 亚洲国产精品尤物yw在线观看| 亚洲女性裸体视频| 国产欧美日韩三区| 亚洲欧美另类国产| 久久婷婷综合激情| 久久精品免视看| 国产精品一区=区| 激情久久五月天| 免费观看在线综合| 欧美二区在线观看| 亚洲第一在线视频| 亚洲小说欧美另类社区| 国产一区二区久久| 久久综合色综合88| 欧美国产日韩一区| 亚洲第一区中文99精品| 免费观看成人鲁鲁鲁鲁鲁视频| 欧美性猛交xxxx乱大交蜜桃| 国产精品视频免费一区| 欧美精品v日韩精品v韩国精品v| 欧美诱惑福利视频| 麻豆久久久9性大片| 国产精品乱子久久久久| 欧美精品一区二区三区久久久竹菊| 亚洲激情第一区| 亚洲第一页中文字幕| 亚洲一区二区综合| 日韩视频在线一区二区| 久久先锋资源| 日韩一级在线| 欧美三级乱码| 久久视频在线看| 欧美日韩国产欧| 在线播放日韩欧美| 亚洲毛片视频| 亚洲精品久久久久久久久久久久久| 亚洲成在线观看| 久久精品视频在线| 国产一区二区精品在线观看| 欧美影院精品一区| 欧美寡妇偷汉性猛交| 亚洲亚洲精品三区日韩精品在线视频| 欧美精品二区| 国产精品无码永久免费888| 国产婷婷色一区二区三区在线| 国产精品区免费视频| 欧美一区二区三区免费视频| 亚洲精品免费在线播放| 午夜精品久久久久久| 欧美在线网址| 国产精品视频网址| 国产精品入口麻豆原神| 亚洲成人在线网| 国产精品国产精品国产专区不蜜| 久久国产精品高清| 亚洲高清在线精品| 欧美精品在线播放| 欧美日产国产成人免费图片| 在线综合视频| 免费成人av在线| 久久噜噜亚洲综合| 一本色道久久88精品综合| 欧美一级大片在线免费观看| 亚洲动漫精品| 久久久蜜桃一区二区人| 欧美国产日韩一区二区| 欧美日韩ab片| 欧美一区激情视频在线观看| 国产一区二区三区黄| 欧美午夜免费| 国产一区二区三区四区hd| 国产精品亚洲综合色区韩国| 亚洲精品美女91| 欧美一级在线亚洲天堂| 亚洲自拍高清| 欧美在线一二三| 韩国女主播一区二区三区| 国产精品日韩欧美大师| 欧美午夜视频一区二区| 欧美在线free| 欧美视频在线观看视频极品| 久久精品视频99| 亚洲男同1069视频| 国产欧美日韩另类一区| 国产欧美日韩综合一区在线观看| 亚洲一区在线观看视频| 亚洲一区二区在线视频| 依依成人综合视频| 男人天堂欧美日韩| 最新成人av在线| 欧美理论在线播放| 日韩亚洲精品在线| 性欧美大战久久久久久久免费观看| 欧美高清在线精品一区| 国产农村妇女毛片精品久久麻豆| 国产精品午夜国产小视频| 国产三级欧美三级| 国产一区二区三区不卡在线观看| 欧美人与禽猛交乱配| 国产日韩亚洲欧美综合| 欧美激情精品久久久六区热门| 欧美日本不卡高清| 国内精品免费午夜毛片| 久久久久久久久伊人| 精品盗摄一区二区三区| 国产精品夜夜夜| 久久国产欧美日韩精品| 久久精品免费播放| 久久久91精品| 欧美成人午夜免费视在线看片| 欧美一区二区三区在线观看视频| 亚洲一区二区三区成人在线视频精品| 亚洲免费激情| 中文高清一区| 欧美激情中文字幕乱码免费| 在线精品在线| 在线日韩欧美| 欧美高清视频在线| 久久久久久久一区二区三区| 国产精品网红福利| 亚洲图片自拍偷拍| 最新国产成人av网站网址麻豆| 亚洲乱亚洲高清| 午夜免费日韩视频| 欧美一级片久久久久久久| 麻豆成人av| 国产精品一区二区在线观看| 久久综合给合| 久久美女艺术照精彩视频福利播放| 亚洲六月丁香色婷婷综合久久| aa日韩免费精品视频一| 日韩亚洲国产精品| 国产精品视频在线观看| 国产精品视屏| 精品999成人| 国产精品久久久久99| 一区二区福利| 国产精品va在线| 国语自产精品视频在线看一大j8| 一区精品在线播放| 韩国欧美国产1区| 亚洲高清资源综合久久精品| 一本到12不卡视频在线dvd| 欧美在线播放一区| 男男成人高潮片免费网站| 国产一区二区三区高清播放| 欧美黄色aaaa| 国产精品任我爽爆在线播放| 狠狠色综合日日| 久久综合久久久| 欧美日韩一区二区三区四区五区| 欧美性大战久久久久久久蜜臀| 韩国成人理伦片免费播放| 中文在线一区| 欧美制服丝袜第一页| 亚洲网站在线播放| 亚洲国产另类久久久精品极度| 久久午夜激情| 久久爱www久久做| 久久精品国产欧美亚洲人人爽| 亚洲大片一区二区三区| 欧美影片第一页| 亚洲欧美日韩成人高清在线一区| 国产精品剧情在线亚洲| 男女av一区三区二区色多| 欧美日韩国产丝袜另类| 欧美另类一区| ●精品国产综合乱码久久久久| 亚洲欧洲精品一区二区三区波多野1战4| 99re视频这里只有精品| 亚洲精品中文在线| 亚洲欧美国产高清va在线播| 国内成人精品2018免费看| 欧美不卡福利| 亚洲欧美国产毛片在线| 亚洲电影天堂av| 欧美一区二区在线| 亚洲免费电影在线观看| 欧美精品一区二区精品网| 国产午夜精品久久久久久久| 欧美一区二区高清| 亚洲第一二三四五区| 美女免费视频一区| 亚洲综合精品四区| 亚洲制服欧美中文字幕中文字幕| 91久久在线视频| 欧美日韩一区二| 欧美在线亚洲| 欧美成人精品在线| 欧美精品日韩www.p站| 女人香蕉久久**毛片精品| 麻豆国产精品va在线观看不卡| 精品动漫3d一区二区三区免费版| 欧美日韩一区二区视频在线观看| 欧美日韩亚洲一区二| 久久久999精品| 亚洲国产一区二区三区a毛片| 亚洲午夜久久久久久尤物| 亚洲一区二区三区涩| 欧美一级在线播放| 一本色道久久88精品综合| 国产精品久久久久久一区二区三区| 亚洲经典自拍| 欧美成人a∨高清免费观看| 久久久久久久999| 影院欧美亚洲| 国产精品一区二区在线观看网站| 国产最新精品精品你懂的| 国产精品久久久久久影视| 久久se精品一区精品二区| 国产精品盗摄一区二区三区| 国产欧美精品国产国产专区| 国产精品久久久999| 欧美激情一区二区三区四区| 国产主播一区二区三区| 久久不射2019中文字幕| 韩国福利一区| 欧美日韩免费| 欧美承认网站| 亚洲欧美日产图| 欧美日韩国产区| 欧美成人午夜激情视频| 亚洲电影中文字幕| 国产欧美综合在线| 亚洲香蕉在线观看| 洋洋av久久久久久久一区| 亚洲一区美女视频在线观看免费| 亚洲欧美综合国产精品一区| 欧美激情aⅴ一区二区三区| 欧美激情一区在线观看| 这里只有精品丝袜| 一区二区三区.www| 亚洲一区在线播放| 欧美亚洲三级| 欧美成人免费在线观看| 欧美视频不卡中文| 久久久99久久精品女同性| 亚洲一区中文| 一区二区高清视频在线观看| 久久成人久久爱| 久久精品国产一区二区三区免费看| 欧美一区亚洲一区| 国产精品久久久久久影视| 美女国内精品自产拍在线播放| 亚洲乱码久久| 欧美一二三视频| 影音先锋久久资源网| 亚洲精品久久久久久一区二区| 国产麻豆精品视频| 亚洲全黄一级网站| 久久人人97超碰人人澡爱香蕉| 国产亚洲福利社区一区| 国产亚洲精品激情久久| 99精品欧美一区| 一本到12不卡视频在线dvd| 久久精品视频网| 欧美成人r级一区二区三区| 国产欧美日韩综合精品二区| 亚洲深夜福利视频| 欧美韩国日本综合| 欧美成人免费播放| 亚洲第一精品影视| 国产情人综合久久777777| 一区精品在线播放| 欧美日韩国产成人在线观看| 精品51国产黑色丝袜高跟鞋| 国产精品推荐精品| 国产伦精品一区二区三区高清版| 一区二区三区成人精品| 亚洲综合色丁香婷婷六月图片| 亚洲一级黄色av| 亚洲国产小视频在线观看| 久久高清福利视频| 久久久免费精品视频| 亚洲国产91精品在线观看| 久久深夜福利免费观看| 亚洲免费在线视频一区 二区| 国产精品日产欧美久久久久| 欧美成人午夜视频| 久久久久成人精品免费播放动漫| 久久久久**毛片大全| 国产欧美精品日韩| 欧美一区三区三区高中清蜜桃| 欧美大片免费| 伊人久久男人天堂| 国产精品国产三级国产aⅴ入口| 久久精品国产亚洲5555| av成人天堂| 99精品免费网| 日韩一级裸体免费视频| 国产精品国产三级国产aⅴ浪潮| 欧美韩日精品| 国产精品高潮视频| 国产精品www网站| 国产精品亚洲片夜色在线| 亚洲美女av在线播放| 久久精品国产精品亚洲综合| 国产亚洲永久域名| 欧美v国产在线一区二区三区| 羞羞答答国产精品www一本| 欧美日韩高清在线观看| 最新亚洲一区| 亚洲欧洲99久久| 亚洲欧美日韩一区二区三区在线| 久久国内精品自在自线400部| 在线观看成人网| 国产欧美激情| 欧美久久久久久蜜桃| 欧美激情一区三区| 欧美不卡激情三级在线观看| 欧美日韩精品一区二区在线播放| 欧美午夜在线观看| 国产精品免费看| 亚洲欧美日韩直播| 亚洲国产精品久久久久久女王| 欧美伊人久久久久久午夜久久久久| 亚洲一区二区在| 猛男gaygay欧美视频| 在线成人中文字幕| 日韩午夜黄色| 免费美女久久99| 国产精品人人爽人人做我的可爱| 久久不见久久见免费视频1|