中文字幕 另类精品,亚洲欧美一区二区蜜桃,日本在线精品视频免费,孩交精品乱子片免费

<sup id="3hn2b"></sup>

    1. <sub id="3hn2b"><ol id="3hn2b"></ol></sub><legend id="3hn2b"></legend>

      1. <xmp id="3hn2b"></xmp>

      2. 新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > VB環(huán)境下實(shí)現(xiàn)PCI設(shè)備底層訪(fǎng)問(wèn)的兩種方法

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

        作者: 時(shí)間:2006-05-07 來(lái)源:網(wǎng)絡(luò) 收藏

        摘要:介紹了在VB開(kāi)發(fā)環(huán)境下,對(duì)PCI設(shè)備進(jìn)行底層訪(fǎng)問(wèn)的兩種方法:一種是通過(guò)用用戶(hù)自己編寫(xiě)的動(dòng)態(tài)連接庫(kù)(DLL)實(shí)現(xiàn),二是利用WINDRIVER提供的VB運(yùn)行庫(kù)編寫(xiě)直接訪(fǎng)問(wèn)硬件接口函數(shù),并對(duì)兩種方法行了比較。

        本文引用地址:http://www.antipu.com.cn/article/241606.htm

        關(guān)鍵詞:WINDRIVER PCI 動(dòng)態(tài)連接庫(kù) 應(yīng)用程序接口

        VB集成化編程語(yǔ)言一種功能強(qiáng)大而容易上手的開(kāi)發(fā)工具,在用戶(hù)界面、數(shù)據(jù)庫(kù)、多媒體、網(wǎng)絡(luò)編程等方面,VB可謂得心應(yīng)手。然而VB有限的硬件編程能力以又使得許多硬件開(kāi)發(fā)者對(duì)此深感無(wú)奈。尤其在工業(yè)控制,測(cè)控技術(shù)等領(lǐng)域,自行設(shè)計(jì)開(kāi)發(fā)的I/O卡,數(shù)據(jù)采集卡等在WIN32下的驅(qū)動(dòng)常常需要借助DDK,VtooIsD等工具進(jìn)行艱苦而又長(zhǎng)期的內(nèi)核模式開(kāi)發(fā)。本文介紹了在VB開(kāi)發(fā)環(huán)境下訪(fǎng)問(wèn)PCI設(shè)備的方法。對(duì)于其他設(shè)備,方法與此大同小異。

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

        1 PCI總線(xiàn)的配置空間

        PCI規(guī)范定義了三種地址空間,除了存儲(chǔ)器和I/O地址空間外,為支持PCI設(shè)備系統(tǒng)資源的自動(dòng)配置,還定義了配置地址空羊。

        PCI總線(xiàn)的配置空間由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è)備廠(chǎng)家自己定義。

        配置空間的預(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)商自己分配。

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

        PCI總線(xiàn)的配置空間規(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)程序。

        對(duì)于PCI設(shè)備來(lái)說(shuō),系統(tǒng)完成引導(dǎo)之后,除了將資源的分配寫(xiě)入系統(tǒng)的配置管理器外,還寫(xiě)入了相應(yīng)的PCI配置寄存器。程序可以通過(guò)直接讀取設(shè)備的配置寄存器來(lái)得到設(shè)備的I/O,存儲(chǔ)器等資源配置情況。

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

        驅(qū)動(dòng)程序訪(fǎng)問(wèn)PCI設(shè)備的過(guò)程一般包括掃描PCI總線(xiàn),相找指定的PCI設(shè)備,確定I/O等資源分配情況,進(jìn)行I/O、存儲(chǔ)器、中斷以及DMA等操作。VB本身并不能實(shí)現(xiàn)上述對(duì)PCI設(shè)備的訪(fǎng)問(wèn)過(guò)程,下面介紹在VB下通過(guò)其他途徑實(shí)現(xiàn)對(duì)PCI設(shè)備的訪(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è)備時(shí)需要借助其它軟件。目前WINDRIVER是KEFTech公司主推產(chǎn)品,是許多PCI廠(chǎng)家所推薦的首選驅(qū)動(dòng)器程序開(kāi)發(fā)工具。

        WINDRIVER為VB 4.0以上版本提供了一個(gè)類(lèi)模塊(WINDRIVER.CLS),利用這個(gè)類(lèi)模塊,用戶(hù)可以手工編寫(xiě)自己需的接口函數(shù)來(lái)訪(fǎng)問(wèn)相應(yīng)的設(shè)備。下面以具體例子來(lái)說(shuō)明WINDRIVER.CLS的使用方法。

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

        利用WINDRIVER.CLS提供的應(yīng)用程序接口函數(shù)(APIs),編寫(xiě)一個(gè)掃描PCI總線(xiàn),獲得指定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ù),用戶(hù)通過(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訪(fǎng)問(wèn)

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

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

        本例中的DLL通過(guò)掃描PCI總線(xiàn),得到總線(xiàn)上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((data0x000f0000)==0x00000000);

        //等待輸入郵箱1滿(mǎn)

        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)用。

        本文提供了兩種在VB的開(kāi)發(fā)環(huán)境下訪(fǎng)問(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)用,取得了良好的效果。

        linux操作系統(tǒng)文章專(zhuān)題:linux操作系統(tǒng)詳解(linux不再難懂)


        評(píng)論


        相關(guān)推薦

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

        關(guān)閉