VB環(huán)境下實(shí)現PCI設備底層訪(fǎng)問(wèn)的兩種方法

發(fā)布時(shí)間:2010-11-15 12:38    發(fā)布者:eetech
介紹了在VB開(kāi)發(fā)環(huán)境下,對PCI設備進(jìn)行底層訪(fǎng)問(wèn)的兩種方法:一種是通過(guò)用用戶(hù)自己編寫(xiě)的動(dòng)態(tài)連接庫(DLL)實(shí)現,二是利用WINDRIVER提供的VB運行庫編寫(xiě)直接訪(fǎng)問(wèn)硬件接口函數,并對兩種方法行了比較。                                      
                  
VB集成化編程語(yǔ)言一種功能強大而容易上手的開(kāi)發(fā)工具,在用戶(hù)界面、數據庫、多媒體、網(wǎng)絡(luò )編程等方面,VB可謂得心應手。然而VB有限的硬件編程能力以又使得許多硬件開(kāi)發(fā)者對此深感無(wú)奈。尤其在工業(yè)控制,測控技術(shù)等領(lǐng)域,自行設計開(kāi)發(fā)的I/O卡,數據采集卡等在WIN32下的驅動(dòng)常常需要借助DDK,VtooIsD等工具進(jìn)行艱苦而又長(cháng)期的內核模式開(kāi)發(fā)。本文介紹了在VB開(kāi)發(fā)環(huán)境下訪(fǎng)問(wèn)PCI設備的方法。對于其他設備,方法與此大同小異。
        
在VB開(kāi)發(fā)環(huán)境下,用戶(hù)要訪(fǎng)問(wèn)諸如數據采集卡之類(lèi)硬件上的PCI設備,一般來(lái)說(shuō)有兩種途徑:一是直接訪(fǎng)問(wèn),即用VB直接編寫(xiě)訪(fǎng)問(wèn)PCI設備的接口函數(這種方法要有相關(guān)軟件的支持);二是間接訪(fǎng)問(wèn),即VB調用其它編程語(yǔ)言(如匯編,C/C++等)寫(xiě)的底層驅動(dòng)模塊(一般封裝成動(dòng)態(tài)連接庫DLL的形式)實(shí)現。
        
1 PCI總線(xiàn)的配置空間

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

所有的PCI設備必須支持首區的供應商ID、設備ID、指令和狀態(tài)區。對于其他寄存器的使用可根據設備的楞能來(lái)選擇。對于不同的PCI設備,其供應商ID由PCI  
        
SIG分配以確保唯一性,而設備ID則由供應商自己分配。
        
2 PCI設備的配置過(guò)程

        
PCI總線(xiàn)的配置空間規范保證了所有PCI設備對“即插即用”的支持。
        
系統在上電后,“即插即用”BIOS通過(guò)隔離算法讀取每一個(gè)“即插即用”設備的資源申請數據,并分配相應的系統資源,同時(shí)檢查資源的沖突情況,然后引導、加載操作系統,并將控制權交給操作系統;如果加載的是“即插即用”操作系統(WINDOWS  
        
95及以后版本),那么操作系統將接管系統的資源管理權,它首先從BIOS讀取“即插即用”設備的資源配置信息,并仲載資源沖突情況,然后配置BIOS尚未配置的“即插即用”設備,將設備的配置信息寫(xiě)入配置管理器,最后激活無(wú)資源沖突的“即插即用”設備,裝載相應的設備驅動(dòng)程序。
        
對于PCI設備來(lái)說(shuō),系統完成引導之后,除了將資源的分配寫(xiě)入系統的配置管理器外,還寫(xiě)入了相應的PCI配置寄存器。程序可以通過(guò)直接讀取設備的配置寄存器來(lái)得到設備的I/O,存儲器等資源配置情況。
        
3 VB下PCI設備的訪(fǎng)問(wèn)
        
驅動(dòng)程序訪(fǎng)問(wèn)PCI設備的過(guò)程一般包括掃描PCI總線(xiàn),相找指定的PCI設備,確定I/O等資源分配情況,進(jìn)行I/O、存儲器、中斷以及DMA等操作。VB本身并不能實(shí)現上述對PCI設備的訪(fǎng)問(wèn)過(guò)程,下面介紹在VB下通過(guò)其他途徑實(shí)現對PCI設備的訪(fǎng)問(wèn)。
        
3.1 VB直接訪(fǎng)問(wèn)
        
WINDRIVER為VB只提供了非常有限的I/O訪(fǎng)問(wèn)能務(wù)(如串口通信),在VB下直接訪(fǎng)問(wèn)PCI設備時(shí)需要借助其它軟件。目前WINDRIVER是KEFTech公司主推產(chǎn)品,是許多PCI廠(chǎng)家所推薦的首選驅動(dòng)器程序開(kāi)發(fā)工具。
        
WINDRIVER為VB 4.0以上版本提供了一個(gè)類(lèi)模塊(WINDRIVER.CLS),利用這個(gè)類(lèi)模塊,用戶(hù)可以手工編寫(xiě)自己需的接口函數來(lái)訪(fǎng)問(wèn)相應的設備。下面以具體例子來(lái)說(shuō)明WINDRIVER.CLS的使用方法。
        
3.1.1 掃描PCI總線(xiàn)得到指設備的數目
        
利用WINDRIVER.CLS提供的應用程序接口函數(APIs),編寫(xiě)一個(gè)掃描PCI總線(xiàn),獲得指定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 "設備打開(kāi)出錯"
        Exit Function
        End If
        PciScan.searchId.dwVendorId =
        DwVendorID
        pciScan .searchId.dwDeviceID =
        dwDeviceID
        WD_PciScanCards hWD, pciScan
        WD_Close (hWD)
        GetCardsNum = pciScan.dwCards
        End Function
        
該函數可以通過(guò)輸入參數:PCI設備的供應商ID和設備ID得到所需的PCI設備數目。如查找AMCC公司的PCI適配芯片S5933,則輸入參數為:&H10E8和&H4750。
        
下面例子用于讀寫(xiě)S5933的PCI配置寄存器。在工程的全局模塊中需要先定義下列數據結構,同時(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配置寄存器
        
完成以上數據結構的定義后,用下面的函數可寫(xiě)S5933的PCI配置寄存器內容。

        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 `讀函數
        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ò)程
        參數說(shuō)明:
        hAMCC 設備打開(kāi)后系統分配的句柄
        dwReg 讀寫(xiě)的PCI配置寄存器
        dwVal 讀出的寄存器數據
        dwData 寫(xiě)入寄存器的數據
        
以上例子僅僅是拋磚引玉。WINDRAR.CLS類(lèi)模塊提供了功能極為強大的底層驅動(dòng)的API函數,用戶(hù)通過(guò)編寫(xiě)相應的驅動(dòng)模塊可以方便地實(shí)現對各類(lèi)硬件的I/O、存儲器映射、中斷以及DMA等操作,同時(shí)可以實(shí)現WIN32下物理內存空間的申請、讀寫(xiě)等處理。另外對于實(shí)時(shí)性要求較高的設備,WINDRIVER提供的“內插”(Plug-In)特性可以讓程序的相關(guān)模塊運行于Ring 0內核模式(Kernel mode),以提高性能。
        
開(kāi)發(fā)完成的底層驅動(dòng)模塊既可直接為VB的應用程序調用,也可以在VB下封裝成DLLs供其它的WIN32開(kāi)發(fā)工具調用。
        
3.2 自定義DLL訪(fǎng)問(wèn)
        
DLL使VB的功能得到極大的增強,使得VB的應用范圍不斷擴大,使用更加靈活。VB通過(guò)調用自定義DLL可以實(shí)現對硬件的底層訪(fǎng)問(wèn)。下面用例了說(shuō)明VB對DLL的調用及DLL的編寫(xiě)過(guò)程。
        
3.2.1 DLL的功能和編寫(xiě)
        
本例中的DLL通過(guò)掃描PCI總線(xiàn),得到總線(xiàn)上S5933接口芯片的數目,打開(kāi)指定設備,向S5933的輸入郵箱子中寫(xiě)入命令字,然后從輸出郵箱1中讀取返回數據,最后關(guān)閉設備。

        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 Send-
        Command(int CardNum, DWORD dwCmd)
        {
        AFX_MANAGE_STATE (AfxGetStaticModuleState());
        DWORD data;
        If (AMCC_Open (&Hamcc, 0x10e8,0x4750,  
        Card-
        Num, 0)) //打開(kāi)指定設備
        {
        AMCC_WriteRegDWord(hAMCC, OMB1_ADDR);
        dwCmd); //寫(xiě)入命令字
        do{
        data=AMCC_ReadRegDWord(hAMCC,MBFF_ADDR);
        }while((data&0x000f0000)==0x00000000);
        //等待輸入郵箱1滿(mǎn)
        data=AMCC_ReadRegDWord(hAMCC,IMB 1_ADDR);
        //讀取返回數據
        if(Hamcc) AMCC_Close(Hamcc)
        //關(guān)閉設備
        return data;
        else
        {AfxMessageBox(“打開(kāi)設備失!”);
        return 0;}
        
程序中用到的函數包含在WINDRIVER的API函數庫中,在VC++下編譯時(shí)加上頭文件:
        #include "amcclib.h"
        #include "amcclib.c"
        
同時(shí)在DEF文件中列出DLL的導出函數名,生成的DLL即可為VB即可為VB所調用。讀者也可用其它工具編寫(xiě)驅動(dòng)模塊,最后封裝成DLL即可。
        
2.2.2 VB調用DLL
        
VB調用動(dòng)態(tài)連接庫(DLL)時(shí),首先聲明DLL,然后即可像調用VB的語(yǔ)句或函數一樣使用DLL中的例程。下面介紹VB調用上例生成的DLL(假設文件名為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的路徑;參數傳遞的方式;參數的類(lèi)型。
        
另外,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芯片的專(zhuān)用C/C++的  
        
API函數庫,其中包含了I/O讀寫(xiě),內存映射,中斷處理以及DMA等底層驅動(dòng)的函數,可以非常方便地用VC++,BC++以及C++Builder等工具編譯成DLLs供VB調用。
        
本文提供了兩種在VB的開(kāi)發(fā)環(huán)境下訪(fǎng)問(wèn)PCI設備的方法。第一種方法需要有WINDRIVER的VB運用庫支持,可以在VB環(huán)境下直接編寫(xiě)所需的接口函數,但對WINDRAR。CLS類(lèi)模翰中定義的內核數據結構要有較深的了解;第二種方法具有一定的靈活性、普遍性,編寫(xiě)的DLL的工具較多,DLL除了可用于VB外,還可用于其他的WIN32開(kāi)發(fā)工具,有較強的適應性。
        
以上方法在北京航空航天大學(xué)測控技術(shù)研究所研制的PHD2000高速并行數據采集系統中得到實(shí)際應用,取得了良好的效果。
本文地址:http://selenalain.com/thread-39350-1-1.html     【打印本頁(yè)】

本站部分文章為轉載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀(guān)點(diǎn)和對其真實(shí)性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問(wèn)題,我們將根據著(zhù)作權人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页