<var id="fnfpo"><source id="fnfpo"></source></var>
<rp id="fnfpo"></rp>

<em id="fnfpo"><object id="fnfpo"><input id="fnfpo"></input></object></em>
<em id="fnfpo"><acronym id="fnfpo"></acronym></em>
  • <th id="fnfpo"><track id="fnfpo"></track></th>
  • <progress id="fnfpo"><track id="fnfpo"></track></progress>
  • <tbody id="fnfpo"><pre id="fnfpo"></pre></tbody>

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

    發布時間:2010-11-15 12:38    發布者:eetech
    關鍵詞: PCI , 底層訪問 , 環境 , 設備
    介紹了在VB開發環境下,對PCI設備進行底層訪問的兩種方法:一種是通過用用戶自己編寫的動態連接庫(DLL)實現,二是利用WINDRIVER提供的VB運行庫編寫直接訪問硬件接口函數,并對兩種方法行了比較。                                      
                      
    VB集成化編程語言一種功能強大而容易上手的開發工具,在用戶界面、數據庫、多媒體、網絡編程等方面,VB可謂得心應手。然而VB有限的硬件編程能力以又使得許多硬件開發者對此深感無奈。尤其在工業控制,測控技術等領域,自行設計開發的I/O卡,數據采集卡等在WIN32下的驅動常常需要借助DDK,VtooIsD等工具進行艱苦而又長期的內核模式開發。本文介紹了在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直接訪問
            
    WINDRIVER為VB只提供了非常有限的I/O訪問能務(如串口通信),在VB下直接訪問PCI設備時需要借助其它軟件。目前WINDRIVER是KEFTech公司主推產品,是許多PCI廠家所推薦的首選驅動器程序開發工具。
            
    WINDRIVER為VB 4.0以上版本提供了一個類模塊(WINDRIVER.CLS),利用這個類模塊,用戶可以手工編寫自己需的接口函數來訪問相應的設備。下面以具體例子來說明WINDRIVER.CLS的使用方法。
            
    3.1.1 掃描PCI總線得到指設備的數目
            
    利用WINDRIVER.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_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 讀寫PCI配置寄存器
            
    完成以上數據結構的定義后,用下面的函數可寫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 `寫過程
            參數說明:
            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中讀取返回數據,最后關閉設備。

            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)) //打開指定設備
            {
            AMCC_WriteRegDWord(hAMCC, OMB1_ADDR);
            dwCmd); //寫入命令字
            do{
            data=AMCC_ReadRegDWord(hAMCC,MBFF_ADDR);
            }while((data&0x000f0000)==0x00000000);
            //等待輸入郵箱1滿
            data=AMCC_ReadRegDWord(hAMCC,IMB 1_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即可為VB所調用。讀者也可用其它工具編寫驅動模塊,最后封裝成DLL即可。
            
    2.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高速并行數據采集系統中得到實際應用,取得了良好的效果。
    本文地址:http://www.portaltwn.com/thread-39350-1-1.html     【打印本頁】

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

    廠商推薦

    • Microchip視頻專區
    • 利用模擬開發工具生態系統進行安全電路設計
    • Cortex-M4外設 —— TC&TCC結合事件系統&DMA優化任務培訓教程
    • 你仿真過嗎?使用免費的MPLAB Mindi模擬仿真器降低設計風險
    • 我們是Microchip
    • 貿澤電子(Mouser)專區

    相關視頻

    關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
    電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
    快速回復 返回頂部 返回列表
    精品一区二区三区自拍图片区_国产成人亚洲精品_亚洲Va欧美va国产综合888_久久亚洲国产精品五月天婷