在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

PCI設備兩種底層訪問方法的實現及比較分析

牽手一起夢 ? 來源:電子技術應用 ? 作者:姜萬波,徐興 ? 2020-10-04 17:25 ? 次閱讀

介紹了在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設備兩種底層訪問方法的實現及比較分析

所有的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高速并行數據采集系統中得到實際應用,取得了良好的效果。

責任編輯:gt

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 存儲器
    +關注

    關注

    38

    文章

    7615

    瀏覽量

    165982
  • PCI
    PCI
    +關注

    關注

    5

    文章

    675

    瀏覽量

    131238
  • 總線
    +關注

    關注

    10

    文章

    2936

    瀏覽量

    89176
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    AVR的兩種位操作及比較

    必須通過軟件來實現。下面對我所知道的兩種方法進行一個簡單的比較。 1、位域方式。先定義一個位域, typedef struct _bit_struct{ unsigned char bit0
    發表于 09-06 10:24

    怎么比較兩種FPGA設計

    比較兩種設計時使用什么更實用?來自地圖報告的占用切片或來自綜合報告的實際比率以上來自于谷歌翻譯以下為原文What is more practical to use in comparing two
    發表于 10-22 11:17

    基于PCI總線的CPLD實現

    獨立的配置空間,可實現即插即用。這些優點使得PCI總線在數據采集、嵌入式系統和測控等領域得到廣泛應用。實現PCI總線協議目前主要有專用接口芯片和CPLD
    發表于 05-29 05:00

    突發功率測量的兩種方法

    對于無線信號功率測試來說,TDMA信號、Bluetooth藍牙信號或者雷達脈沖信號都是基于時域中周期性重復的突發結構來實現的。與連續平穩信號的功率測量不同,這種突發信號的功率測量受到頻譜分析儀捕獲時間的影響,相對來說比較復雜,突
    發表于 06-10 07:31

    怎么實現PC機的軟件對PCI設備訪問

    、穩定性和可移植性,對應用程序訪問硬件資源加以限制,這就要求設計設備驅動程序以實現PC機的軟件對PCI設備
    發表于 09-17 08:12

    PCI 設備 RTX 驅動開發方法

    to an RTX Device 一節或者參考附件 2. PCI驅動程序的特點 在設計驅動程序之前,首先要對欲控制的硬件設備進行細致地分析,更需要詳細了解硬件設備的特性。硬件
    發表于 09-06 12:43

    兩種典型控制方法在逆變器控制器中的比較

    兩種典型控制方法在逆變器控制器中的比較 摘要:對比分析了逆變器控制中的電容電流反饋和電感電流反饋兩種控制方式。推導了控制器的控制模型,
    發表于 07-04 10:40 ?1837次閱讀
    <b class='flag-5'>兩種</b>典型控制<b class='flag-5'>方法</b>在逆變器控制器中的<b class='flag-5'>比較</b>

    基于LabVIEW的Modbus協議兩種校驗碼的實現方法

    基于LabVIEW的Modbus協議兩種校驗碼的實現方法 介紹基于LabVIEW的Modbus協議兩種校驗碼的實現
    發表于 10-13 00:08 ?4623次閱讀
    基于LabVIEW的Modbus協議<b class='flag-5'>兩種</b>校驗碼的<b class='flag-5'>實現</b><b class='flag-5'>方法</b>

    兩種空間矢量脈寬調制生成方法分析比較

    兩種空間矢量脈寬調制生成方法分析比較
    發表于 03-30 18:24 ?11次下載

    移動HMI遠程訪問兩種實現方式介紹

    在許多工業自動化應用中移動人機界面(HMI)訪問都是必需的。目前有兩種常用的方法——無需VPN的標準路由器和由云托管的VPN路由器,來實現與路由器和虛擬專用網(VPN)的這種連接。
    發表于 06-10 09:47 ?1873次閱讀

    如何實現C語言訪問MCU寄存器?掌握這兩種方式就夠了!

    單片機的特殊功能寄存器SFR,是SRAM地址已經確定的SRAM單元,在C語言環境下對其訪問歸納起來有兩種方法。1、采用標準C的強制類型轉換和指針來實現采用標準C的強制轉換和指針的概念來實現
    發表于 11-21 19:21 ?14次下載
    如何<b class='flag-5'>實現</b>C語言<b class='flag-5'>訪問</b>MCU寄存器?掌握這<b class='flag-5'>兩種</b>方式就夠了!

    在MATLAB/simulink中建模時的兩種不同實現方式

    導讀:本期文章主要介紹在MATLAB/simulink中建模時的兩種不同實現方式,一是直接用現成的文件庫中的模塊進行搭建,一是用Sfunction代碼
    的頭像 發表于 09-15 10:07 ?2185次閱讀

    MATLAB/simulink中兩種實現建模方式的優勢

    導讀:本期文章主要介紹在MATLAB/simulink中建模時的兩種不同實現方式,一是直接用現成的文件庫中的模塊進行搭建,一是用Sfunction代碼
    的頭像 發表于 09-15 10:10 ?5570次閱讀

    訪問PCI/PCIe設備的流程

    訪問 PCI/PCIe 設備的流程 PCI/PCIe 設備的配置信息 PCI/PCIe
    的頭像 發表于 07-30 09:44 ?1891次閱讀

    比較分析兩種不同的可提高柵極驅動電流的方法

    電子發燒友網站提供《比較分析兩種不同的可提高柵極驅動電流的方法.pdf》資料免費下載
    發表于 09-23 11:13 ?0次下載
    <b class='flag-5'>比較</b><b class='flag-5'>分析</b><b class='flag-5'>兩種</b>不同的可提高柵極驅動電流的<b class='flag-5'>方法</b>
    主站蜘蛛池模板: 欧美日韩性高爱潮视频 | 电影天堂bt | 一级待一黄aaa大片在线还看 | 欧美三级黄色 | hs网站免费| 国产一区二区三区免费大片天美 | 久久狠狠第一麻豆婷婷天天 | bt种子磁力天堂torrent | 国产精品久久久久久久成人午夜 | 四虎在线观看一区二区 | 黄色日本视频网站 | 四虎影视在线影院在线观看 | 久久不射影院 | 在线99热 | 国产福利vr专区精品 | 男女在线视频 | 人人爱人人澡 | 免费任我爽橹视频在线观看 | 伊人网综合在线 | 天天爽天天爽 | bt天堂资源 | 天天爆操 | 午夜免费视频网站 | 亚洲人成网站色7799在线观看 | 午夜影院欧美 | 欧美黄色录像视频 | 伊人久久大香线蕉资源 | 四虎国产精品永久地址51 | 天堂网www在线观看 天堂网www在线资源中文 | 可以直接看的黄址 | 天天色爱| 一级片免费看 | 激情啪啪网站 | 亚洲美女激情视频 | 天堂最新版中文网 | 国产人人看 | 老司机亚洲精品影院在线观看 | 亚洲成a人片77777潘金莲 | 网站在线观看视频 | 一本二卡三卡四卡乱码二百 | 日本午夜色 |