日韩欧美自拍在线观看-欧美精品在线看片一区二区-高清性视频一区二区播放-欧美日韩女优制服另类-国产精品久久久久久av蜜臀-成人在线黄色av网站-肥臀熟妇一区二区三区-亚洲视频在线播放老色-在线成人激情自拍视频

兩種思路實(shí)現(xiàn)VB環(huán)境下的PCI設(shè)備底層訪問(wèn)

出處:電子技術(shù)應(yīng)用 發(fā)布于:2011-09-04 14:07:10

    Visual Basic從1991年誕生以來(lái),現(xiàn)在已經(jīng)20年了。BASIC是微軟的起家產(chǎn)品,微軟當(dāng)然不忘了這位功臣。隨著每微軟技術(shù)的浪潮,Visual Basic都會(huì)隨之獲得新生。可以預(yù)見(jiàn),將來(lái)無(wú)論微軟又發(fā)明了什么技術(shù)或平臺(tái),Visual Basic一定會(huì)首先以新的姿態(tài)登上去的。如果你想緊跟微軟,永遠(yuǎn)在的技術(shù)上快速地開(kāi)發(fā),你就應(yīng)該選擇Visual Basic。

    VB是Visual Basic的簡(jiǎn)稱(chēng),是由美國(guó)微軟公司于1991年開(kāi)發(fā)的一種可視化的、面向?qū)ο蠛筒捎檬录?qū)動(dòng)方式的結(jié)構(gòu)化程序設(shè)計(jì)語(yǔ)言,可用于開(kāi)發(fā) Windows 環(huán)境下的各類(lèi)應(yīng)用程序。它簡(jiǎn)單易學(xué)、效率高,且功能強(qiáng)大可以與 Windows 開(kāi)發(fā)工具SDK相媲美。在Visual Basic環(huán)境下,利用事件驅(qū)動(dòng)的編程機(jī)制、新穎易用的可視化設(shè)計(jì)工具,使用Windows內(nèi)部的廣泛應(yīng)用程序接口(API)函數(shù),動(dòng)態(tài)鏈接庫(kù)(DLL)、對(duì)象的鏈接與嵌入(OLE)、開(kāi)放式數(shù)據(jù)連接(ODBC)等技術(shù),可以高效、快速地開(kāi)發(fā)Windows環(huán)境下功能強(qiáng)大、圖形界面豐富的應(yīng)用軟件系統(tǒng)。

    Visual 意為可視的、可見(jiàn)的,指的是開(kāi)發(fā)像Windows操作系統(tǒng)的圖形用戶界面(Graphic User Interface,GUI)的方法,它與其他編程軟件不同的是不需要編寫(xiě)大量代碼去描述界面元素的外觀和位置,只要把預(yù)先建立好的對(duì)象拖放到屏幕上相應(yīng)的位置即可。應(yīng)該說(shuō),這是質(zhì)的飛躍,是編程技術(shù)的革命。Basic 實(shí)際上是一個(gè)短語(yǔ)的縮寫(xiě),這個(gè)短語(yǔ)就是 Beginners' All-Purpose Symbolic Instruction Code ,其中文意思為“初學(xué)者通用符號(hào)指令代碼”。   

    在VB開(kāi)發(fā)環(huán)境下,用戶要訪問(wèn)諸如數(shù)據(jù)采集卡之類(lèi)硬件上的PCI設(shè)備,一般來(lái)說(shuō)有兩種途徑:一是直接訪問(wèn),即用VB直接編寫(xiě)訪問(wèn)PCI設(shè)備的接口函數(shù)(這種方法要有相關(guān)軟件的支持);二是間接訪問(wèn),即VB調(diào)用其它編程語(yǔ)言(如匯編,C/C++等)寫(xiě)的底層驅(qū)動(dòng)模塊(一般封裝成動(dòng)態(tài)連接庫(kù)DLL的形式)實(shí)現(xiàn)。    

    本文介紹了在VB開(kāi)發(fā)環(huán)境下訪問(wèn)PCI設(shè)備的方法。對(duì)于其他設(shè)備,方法與此大同小異。

  1PCI總線的配置空間

  PCI規(guī)范定義了三種地址空間,除了存儲(chǔ)器和I/O地址空間外,為支持PCI設(shè)備系統(tǒng)資源的自動(dòng)配置,還定義了配置地址空羊。PCI總線的配置空間由256個(gè)字節(jié)組成,分為預(yù)定首區(qū)和設(shè)備關(guān)聯(lián)區(qū)。預(yù)定首區(qū)包括開(kāi)始64個(gè)字節(jié),對(duì)所有的PCI設(shè)備來(lái)說(shuō),都必須支持該區(qū)的設(shè)置;設(shè)備關(guān)聯(lián)區(qū)的寄存器有不同的的PCI設(shè)備廠家自己定義。配置空間的預(yù)定的首區(qū)分兩個(gè)部分,前16個(gè)字節(jié)的定義對(duì)各類(lèi)PCI設(shè)備而言都是相同的,后48個(gè)字節(jié)空間根據(jù)設(shè)備支持的功能有不同的分配。首區(qū)類(lèi)型定義了該空間的分配情況(目前只有一種類(lèi)型00H)。表1是首區(qū)的組織結(jié)構(gòu)。

   

  所有的PCI設(shè)備必須支持首區(qū)的供應(yīng)商ID、設(shè)備ID、指令和狀態(tài)區(qū)。對(duì)于其他寄存器的使用可根據(jù)設(shè)備的楞能來(lái)選擇。對(duì)于不同的PCI設(shè)備,其供應(yīng)商ID由PCI SIG分配以確保性,而設(shè)備ID則由供應(yīng)商自己分配。

   2PCI設(shè)備的配置過(guò)程

  PCI總線的配置空間規(guī)范保證了所有PCI設(shè)備對(duì)“即插即用”的支持。系統(tǒng)在上電后,“即插即用”BIOS通過(guò)隔離算法讀取每一個(gè)“即插即用”設(shè)備的資源申請(qǐng)數(shù)據(jù),并分配相應(yīng)的系統(tǒng)資源,同時(shí)檢查資源的沖突情況,然后引導(dǎo)、加載操作系統(tǒng),并將控制權(quán)交給操作系統(tǒng);如果加載的是“即插即用”操作系統(tǒng)(WINDOWS 95及以后版本),那么操作系統(tǒng)將接管系統(tǒng)的資源管理權(quán),它首先從BIOS讀取“即插即用”設(shè)備的資源配置信息,并仲載資源沖突情況,然后配置BIOS尚未配置的“即插即用”設(shè)備,將設(shè)備的配置信息寫(xiě)入配置管理器,激活無(wú)資源沖突的“即插即用”設(shè)備,裝載相應(yīng)的設(shè)備驅(qū)動(dòng)程序。

  3 VB下PCI設(shè)備的訪問(wèn)

    VB采用了面向?qū)ο笤O(shè)計(jì)思想,它基本思路是把復(fù)雜的設(shè)計(jì)問(wèn)題分解為多個(gè)能夠完成獨(dú)立功能且相對(duì)簡(jiǎn)單的對(duì)象集合。所謂“對(duì)象”就是個(gè)可操作實(shí)體如窗體、窗體中命令按鈕、標(biāo)簽、文本框等,面向?qū)ο缶幊叹褪侵赋绦騿T可根據(jù)界面設(shè)計(jì)要求直接在界面上設(shè)計(jì)出窗口、菜單、按鈕等類(lèi)型對(duì)象并為每個(gè)對(duì)象設(shè)置屬性。驅(qū)動(dòng)程序訪問(wèn)PCI設(shè)備的過(guò)程一般包括掃描PCI總線,相找指定的PCI設(shè)備,確定I/O等資源分配情況,進(jìn)行I/O、存儲(chǔ)器、中斷以及DMA等操作。VB本身并不能實(shí)現(xiàn)上述對(duì)PCI設(shè)備的訪問(wèn)過(guò)程,下面介紹在VB下通過(guò)其他途徑實(shí)現(xiàn)對(duì)PCI設(shè)備的訪問(wèn)。

  3.1 VB直接訪問(wèn)

    VB為編程提供了個(gè)集成開(kāi)發(fā)環(huán)境在這個(gè)環(huán)境中編程者可設(shè)計(jì)界面、編寫(xiě)代碼、調(diào)試直至把應(yīng)用編譯成可在Windows中運(yùn)行可執(zhí)行文件并為它生成安裝VB集成開(kāi)發(fā)環(huán)境為編程者提供了很大方便。WINDRIVER為VB只提供了非常有限的I/O訪問(wèn)能務(wù)(如串口通信),在VB下直接訪問(wèn)PCI設(shè)備時(shí)需要借助其它軟件。目前WINDRIVER是KEFTech公司主推產(chǎn)品,是許多PCI廠家所推薦的驅(qū)動(dòng)器程序開(kāi)發(fā)工具。WINDRIVER為VB 4.0以上版本提供了一個(gè)類(lèi)模塊(WINDRIVER.CLS),利用這個(gè)類(lèi)模塊,用戶可以手工編寫(xiě)自己需的接口函數(shù)來(lái)訪問(wèn)相應(yīng)的設(shè)備。

    下面以具體例子來(lái)說(shuō)明WINDRIVER.CLS的使用方法。

  3.1.1 掃描PCI總線得到指設(shè)備的數(shù)目

  利用WINDRIVER.CLS提供的應(yīng)用程序接口函數(shù)(APIs),編寫(xiě)一個(gè)掃描PCI總線,獲得指定PCI設(shè)備數(shù)目的函數(shù)下:

  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 "設(shè)備打開(kāi)出錯(cuò)"

  Exit Function

  End If

  PciScan.searchId.dwVendorId =

  DwVendorID

  pciScan .searchId.dwDeviceID =

  dwDeviceID

  WD_PciScanCards hWD, pciScan

  WD_Close (hWD)

  GetCardsNum = pciScan.dwCards

  End Function

  該函數(shù)可以通過(guò)輸入?yún)?shù):PCI設(shè)備的供應(yīng)商ID和設(shè)備ID得到所需的PCI設(shè)備數(shù)目。如查找AMCC公司的PCI適配芯片S5933,則輸入?yún)?shù)為:&H10E8和&H4750。

  下面例子用于讀寫(xiě)S5933的PCI配置寄存器。在工程的全局模塊中需要先定義下列數(shù)據(jù)結(jié)構(gòu),同時(shí)設(shè)備必須處于打開(kāi)狀態(tài)。

  Type AMCC_INNTERRUPT

  Int As WD_INTERRUPT

  HThread As Long

  Trans(O To 1)As WD_Transfer

  End Type

  Type AMCC_ADDR_DESC

  dwLocalBase As Long

  dwMask As Long

  dwBytes As Long

  dsAddr As Long

  dwAddrDirect As Long

  flsMemory 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 讀寫(xiě)PCI配置寄存器

  完成以上數(shù)據(jù)結(jié)構(gòu)的定義后,用下面的函數(shù)可寫(xiě)S5933的PCI配置寄存器內(nèi)容。

  Function AMCC_ReadPCIReg (hAmcc As

  AMCC_SETRUCT, dwReg As Long)

  Dim pciCnf As WD_PCI_CONFIG_DUMP

  Dim dwVal As PVOID

  pciCnf.pciSlot = hAmcc.pciSlot

  pciCnf.pBuffer = dwVal

  pciCnf.dwOffer = dwReg

  pciCnf.dwBytes = 4

  pciCnf.flsRead = True

  WD_PciConfigDump hAmcc.hWD, pciCnf

  AMCC_ReadPCIReg = dwVal

  End Function `讀函數(shù)

  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 = dwVal

  pciCnf.dwOffer = dwReg

  pciCnf.dwBytes = 4

  pciCnf.flsRead = False

  WD_PciConfigDump hAmcc.hWD, pciCnf

  End Sub `寫(xiě)過(guò)程

  參數(shù)說(shuō)明:

  hAMCC 設(shè)備打開(kāi)后系統(tǒng)分配的句柄

  dwReg 讀寫(xiě)的PCI配置寄存器

  dwVal 讀出的寄存器數(shù)據(jù)

  dwData 寫(xiě)入寄存器的數(shù)據(jù)

  以上例子僅僅是拋磚引玉。WINDRAR.CLS類(lèi)模塊提供了功能極為強(qiáng)大的底層驅(qū)動(dòng)的API函數(shù),用戶通過(guò)編寫(xiě)相應(yīng)的驅(qū)動(dòng)模塊可以方便地實(shí)現(xiàn)對(duì)各類(lèi)硬件的I/O、存儲(chǔ)器映射、中斷以及DMA等操作,同時(shí)可以實(shí)現(xiàn)WIN32下物理內(nèi)存空間的申請(qǐng)、讀寫(xiě)等處理。另外對(duì)于實(shí)時(shí)性要求較高的設(shè)備,WINDRIVER提供的“內(nèi)插”(Plug-In)特性可以讓程序的相關(guān)模塊運(yùn)行于Ring 0內(nèi)核模式(Kernel mode),以提高性能。開(kāi)發(fā)完成的底層驅(qū)動(dòng)模塊既可直接為VB的應(yīng)用程序調(diào)用,也可以在VB下封裝成DLLs供其它的WIN32開(kāi)發(fā)工具調(diào)用。

  3.2 自定義DLL訪問(wèn)

  DLL使VB的功能得到極大的增強(qiáng),使得VB的應(yīng)用范圍不斷擴(kuò)大,使用更加靈活。VB通過(guò)調(diào)用自定義DLL可以實(shí)現(xiàn)對(duì)硬件的底層訪問(wèn)。下面用例了說(shuō)明VB對(duì)DLL的調(diào)用及DLL的編寫(xiě)過(guò)程。

  3.2.1 DLL的功能和編寫(xiě)

  本例中的DLL通過(guò)掃描PCI總線,得到總線上S5933接口芯片的數(shù)目,打開(kāi)指定設(shè)備,向S5933的輸入郵箱子中寫(xiě)入命令字,然后從輸出郵箱1中讀取返回?cái)?shù)據(jù),關(guān)閉設(shè)備。

  extern "C" _declspec (dllexport) int _stdcall GetCardsNum()

  {

  AFX_MANAGE_STATE (AfxGetStaticModuleState());

  int cards;

  cards=AMCC_CountCards (0x10e8,0x4750);

  return cards;

  } //此函數(shù)得到S5933的數(shù)目;

  extern "C" declspec (dllexport) DWORD_stdcall Send-

  Command(int CardNum, DWORD dwCmd)

  {

  AFX_MANAGE_STATE (AfxGetStaticModuleState());

  DWORD data;

  If (AMCC_Open (&Hamcc, 0x10e8,0x4750, Card-

  Num, 0)) //打開(kāi)指定設(shè)備

  {

  AMCC_WriteRegDWord(hAMCC, OMB1_ADDR);

  dwCmd); //寫(xiě)入命令字

  do{

  data=AMCC_ReadRegDWord(hAMCC,MBFF_ADDR);

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

  //等待輸入郵箱1滿

  data=AMCC_ReadRegDWord(hAMCC,IMB 1_ADDR);

  //讀取返回?cái)?shù)據(jù)

  if(Hamcc) AMCC_Close(Hamcc)

  //關(guān)閉設(shè)備

  return data;

  else

  {AfxMessageBox(“打開(kāi)設(shè)備失敗!”);

  return 0;}

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

  #include "amcclib.h"

  #include "amcclib.c"

  同時(shí)在DEF文件中列出DLL的導(dǎo)出函數(shù)名,生成的DLL即可為VB即可為VB所調(diào)用。讀者也可用其它工具編寫(xiě)驅(qū)動(dòng)模塊,封裝成DLL即可。

  2.2.2 VB調(diào)用DLL

  VB調(diào)用動(dòng)態(tài)連接庫(kù)(DLL)時(shí),首先聲明DLL,然后即可像調(diào)用VB的語(yǔ)句或函數(shù)一樣使用DLL中的例程。下面介紹VB調(diào)用上例生成的DLL(假設(shè)文件名為T(mén)est.dll)。

  聲明

  Public Declare Function GetCardsNum Lib "Test.dll"()

  As Integer

  Public Declare Function SendCommand Lib "Test.dll"

  (ByVal dwCmd as Long) As Long

  在聲明時(shí)需要注意:DLL的路徑;參數(shù)傳遞的方式;參數(shù)的類(lèi)型。

  另外,VB遵從_stdcall的參數(shù)傳遞約定,而VC++默認(rèn)_cdecl的傳遞約定,因此在DLL中的導(dǎo)出聲明需采用_stdcall的裝飾符。

  調(diào)用

  一旦聲明后,在VB的應(yīng)用程序中就可調(diào)用DLL中的例程。如:

  Private Sub Form_Load()

  Dim CardsNum As Integer

  CardsNum = GetCardsNum()

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

  End Sub

  WINDRIVER包括了諸如AMCC、Altera、PLX、Galileo、V3、PLDA等公司PCI芯片的專(zhuān)用C/C++的 API函數(shù)庫(kù),其中包含了I/O讀寫(xiě),內(nèi)存映射,中斷處理以及DMA等底層驅(qū)動(dòng)的函數(shù),可以非常方便地用VC++,BC++以及C++Builder等工具編譯成DLLs供VB調(diào)用。

    在Windows環(huán)境下是以事件驅(qū)動(dòng)方式運(yùn)行每個(gè)對(duì)象的都能響應(yīng)多個(gè)區(qū)別事件,每個(gè)事件都能驅(qū)動(dòng)段代碼事件過(guò)程,該代碼決定了對(duì)象功能。通常稱(chēng)這種機(jī)制為事件驅(qū)動(dòng)的編程機(jī)制。可由用戶操作觸發(fā)也可以由系統(tǒng)或應(yīng)用觸發(fā)例如單擊個(gè)命令按鈕就觸發(fā)了按鈕Click(單擊)事件該事件中代碼就會(huì)被執(zhí)行,若用戶未進(jìn)行任何操作(未觸發(fā)事件)則就處于等待狀態(tài)整個(gè)應(yīng)用就是由彼此獨(dú)立事件過(guò)程構(gòu)成。

    功能再?gòu)?qiáng)大,Visual Basic 仍然有一個(gè)缺點(diǎn):在沒(méi)有MSVBVM**.DLL的計(jì)算機(jī)上必須安裝所需的DLL文件(同樣Visual C++在沒(méi)有MSVCRT*.DLL情況下亦無(wú)法運(yùn)行)。不過(guò)在Windows 2000之后,這個(gè)DLL就被預(yù)置到操作系統(tǒng)中了,一般來(lái)說(shuō),程序如果只使用了VB內(nèi)部的控件和對(duì)象,基本上不會(huì)有太大的問(wèn)題。

  本文提供了兩種在VB的開(kāi)發(fā)環(huán)境下訪問(wèn)PCI設(shè)備的方法。種方法需要有WINDRIVER的VB運(yùn)用庫(kù)支持,可以在VB環(huán)境下直接編寫(xiě)所需的接口函數(shù),但對(duì)WINDRAR。CLS類(lèi)模翰中定義的內(nèi)核數(shù)據(jù)結(jié)構(gòu)要有較深的了解;第二種方法具有一定的靈活性、普遍性,編寫(xiě)的DLL的工具較多,DLL除了可用于VB外,還可用于其他的WIN32開(kāi)發(fā)工具,有較強(qiáng)的適應(yīng)性。

  以上方法在北京航空航天大學(xué)測(cè)控技術(shù)研究所研制的PHD2000高速并行數(shù)據(jù)采集系統(tǒng)中得到實(shí)際應(yīng)用,取得了良好的效果。


  

版權(quán)與免責(zé)聲明

凡本網(wǎng)注明“出處:維庫(kù)電子市場(chǎng)網(wǎng)”的所有作品,版權(quán)均屬于維庫(kù)電子市場(chǎng)網(wǎng),轉(zhuǎn)載請(qǐng)必須注明維庫(kù)電子市場(chǎng)網(wǎng),http://hbjingang.com,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。

本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類(lèi)作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個(gè)人從本網(wǎng)轉(zhuǎn)載時(shí),必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。

如涉及作品內(nèi)容、版權(quán)等問(wèn)題,請(qǐng)?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。

廣告
OEM清單文件: OEM清單文件
*公司名:
*聯(lián)系人:
*手機(jī)號(hào)碼:
QQ:
有效期:

掃碼下載APP,
一鍵連接廣大的電子世界。

在線人工客服

買(mǎi)家服務(wù):
賣(mài)家服務(wù):
技術(shù)客服:

0571-85317607

網(wǎng)站技術(shù)支持

13606545031

客服在線時(shí)間周一至周五
9:00-17:30

關(guān)注官方微信號(hào),
第一時(shí)間獲取資訊。

建議反饋

聯(lián)系人:

聯(lián)系方式:

按住滑塊,拖拽到最右邊
>>
感謝您向阿庫(kù)提出的寶貴意見(jiàn),您的參與是維庫(kù)提升服務(wù)的動(dòng)力!意見(jiàn)一經(jīng)采納,將有感恩紅包奉上哦!