
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、vb環境下實現pci設備底層訪問的兩種方法介紹了在vb開發環境下,對pci設備舉行底層拜訪的兩種辦法:一種是通過用用戶自己編寫的動態銜接庫(dll)實現,二是利用windriver提供的vb運行庫編寫挺直拜訪硬件接口函數,并對兩種辦法行了比較。vb集成化編程語言一種功能強大而簡單上手的開發工具,在用戶界面、數據庫、多媒體、網絡編程等方面,vb可謂得心應手。然而vb有限的硬件編程能力以又使得許多硬件開發者對此深感無奈。尤其在工業控制,測控技術等領域,自行設計開發的io卡,數據采集卡等在win32下的驅動經常需要借助ddk,vtooisd等工具舉行艱苦而又長久的內核模式開發。本文介紹了在vb開發環
2、境下拜訪pci設備的辦法。對于其他設備,辦法與此大同小異。在vb開發環境下,用戶要拜訪諸如數據采集卡之類硬件上的pci設備,普通來說有兩種途徑:一是挺直拜訪,即用vb挺直編寫拜訪pci設備的接口函數(這種辦法要有相關軟件的支持);二是間接拜訪,即vb調用其它編程語言(如匯編,cc等)寫的底層驅動模塊(普通封裝成動態銜接庫dll的形式)實現。1 pci的配置空間pci規范定義了三種地址空間,除了存儲器和io地址空間外,為支持pci設備系統資源的自動配置,還定義了配置地址空羊。pci總線的配置空間由256個字節組成,分為預定首區和設備關聯區。預定首區包括開頭64個字節,對全部的pci設備來說,都必
3、需支持該區的設置;設備關聯區的寄存器有不同的的pci設備廠家自己定義。配置空間的預定的首區別兩個部分,前16個字節的定義對各類pci設備而言都是相同的,后48個字節空間按照設備支持的功能有不同的分配。首區類型定義了該空間的分配狀況(目前惟獨一種類型00h)。表1是首區的組織結構。全部的pci設備必需支持首區的供給商id、設備id、命令和狀態區。對于其他寄存器的用法可按照設備的楞能來挑選。對于不同的pci設備,其供給商id由pcisig分配以確保唯一性,而設備id則由供給商自己分配。2 pci設備的配置過程pci總線的配置空間規范保證了全部pci設備對“即插即用”的支持。系統在上電后,“即插即用
4、”bios通過隔離算法讀取每一個“即插即用”設備的資源申請數據,并分配相應的系統資源,同時檢查資源的矛盾狀況,然后引導、加載操作系統,并將控制權交給操作系統;假如加載的是“即插即用”操作系統(windows95及以后版本),那么操作系統將接管系統的資源管理權,它首先從bios讀取“即插即用”設備的資源配置信息,并仲載資源矛盾狀況,然后配置bios尚未配置的“即插即用”設備,將設備的配置信息寫入配置管理器,最后激活無資源矛盾的“即插即用”設備,裝載相應的設備驅動程序。對于pci設備來說,系統完成引導之后,除了將資源的分配寫入系統的配置管理器外,還寫入了相應的pci配置寄存器。程序可以通過挺直讀取
5、設備的配置寄存器來得到設備的io,存儲器等資源配置狀況。3 vb下pci設備的拜訪驅動程序拜訪pci設備的過程普通包括掃描pci總線,相找指定的pci設備,確定io等資源分配狀況,舉行io、存儲器、中斷以及dma等操作。vb本身并不能實現上述對pci設備的拜訪過程,下面介紹在vb下通過其他途徑實現對pci設備的拜訪。31 vb挺直拜訪windriver為vb只提供了十分有限的io拜訪能務(如串口通信),在vb下挺直拜訪pci設備時需要借助其它軟件。目前windriver是keftech公司主推產品,是許多pci廠家所推舉的首選驅動器程序開發工具。windriver為vb 4.0以上版本提供了一
6、個類模塊(windriver.cls),利用這個類模塊,用戶可以手工編寫自己需的接口函數來拜訪相應的設備。下面以詳細例子來解釋windriver.cls的用法辦法。3.1.1 掃描pci總線得到指設備的數目利用windriver.cls提供的應用程序接口函數(apis),編寫一個掃描pci總線,獲得指定pci設備數目的函數下:function getcardsnum (dwvendorid as)long, dwdeviceid as long) as integerdim pciscan as wd_pci_scan_cardsdim hwd as longhwd = wd_open()if
7、 hwd =invalid_handle_value thenmsgbox 設備打開出錯exit functionend ifpciscan.searchid.dwvendorid =dwvendoridpciscan .searchid.dwdeviceid =dwdeviceidwd_pciscancards hwd, pciscanwd_close (hwd)getcardsnum = pciscan.dwcardsend function該函數可以通過輸入參數:pci設備的供給商id和設備id得到所需的pci設備數目。如查找amcc公司的pci適配芯片s5933,則輸入參數為:&h10
8、e8和&h4750。下面例子用于讀寫s5933的pci配置寄存器。在工程的全局模塊中需要先定義下列數據結構,同時設備必需處于打開狀態。type amccinnterruptint as wd_interrupththread as longtrans(o to 1)as wd_transferend typetype amcc_addr_descdwlocalbase as longdwmask as longdwbytes as longdsaddr as longdwaddrdirect as longflsmemory as booleanend typetype amcc_struct
9、hwd as longcardlock as wd_cardpcislot as wd_pci_slotcardreg as wd_card_registeraddrdesc(0 to ad_pci_bars1)asamcc_addr_descfuseint as booleanint as amcc_interruptend type3.1.2 讀寫pci配置寄存器完成以上數據結構的定義后,用下面的函數可寫s5933的pci配置寄存器內容。function amcc_readpcireg (hamcc asamcc_setruct, dwreg as long)dim pcicnf as w
10、d_pci_config_dumpdim dwval as pvoidpcicnf.pcislot = hamcc.pcislotpcicnf.pbuffer = dwvalpcicnf.dwoffer = dwregpcicnf.dwbytes = 4pcicnf.flsread = truewd_pciconfigdump hamcc.hwd, pcicnfamcc_readpcireg = dwvalend function 讀函數sub amcc_writepcireg (hamcc asamcc_struct, dwreg as long, dwdata as pvoid)dim p
11、cicnf as wd_pci_config_dumppcicnf.pcislot = hamcc.pcislotpcicnf.pbuffer = dwvalpcicnf.dwoffer = dwregpcicnf.dwbytes = 4pcicnf.flsread = falsewd_pciconfigdump hamcc.hwd, pcicnfend sub 寫過程參數解釋:hamcc 設備打開后系統分配的句柄dwreg 讀寫的pci配置寄存器dwval 讀出的寄存器數據dwdata 寫入寄存器的數據以上例子僅僅是拋磚引玉。windrar.cls類模塊提供了功能極為強大的底層驅動的api函
12、數,用戶通過編寫相應的驅動模塊可以便利地實現對各類硬件的io、存儲器映射、中斷以及dma等操作,同時可以實現win32下物理內存空間的申請、讀寫等處理。另外對于實時性要求較高的設備,windriver提供的“內插”(plug-in)特性可以讓程序的相關模塊運行于ring 0內核模式(kernel mode),以提高性能。開發完成的底層驅動模塊既可挺直為vb的應用程序調用,也可以在vb下封裝成dlls供其它的win32開發工具調用。32 自定義dll拜訪dll使vb的功能得到極大的增加,使得vb的應用范圍不斷擴大,用法越發靈便。vb通過調用自定義dll可以實現對硬件的底層拜訪。下面用例了解釋vb
13、對dll的調用及dll的編寫過程。321 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
14、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); /寫入指令字dodata=amcc_readregdword(hamcc,mbff_addr);while(data&0x000f0000)=
15、0x00000000);/等待輸入郵箱1滿data=amcc_readregdword(hamcc,imb 1_addr);/讀取返回數據if(hamcc) amcc_close(hamcc)/關閉設備return data;elseafxmessagebox(“打開設備失敗!”);return 0;程序中用到的函數包含在windriver的api函數庫中,在vc下編譯時加上頭文件:include amcclib.hinclude amcclib.c同時在def文件中列出dll的導出函數名,生成的dll即可為vb即可為vb所調用。讀者也可用其它工具編寫驅動模塊,最后封裝成dll即可。2.2.2
16、 vb調用dllvb調用動態銜接庫(dll)時,首先聲明dll,然后即可像調用vb的語句或函數一樣用法dll中的例程。下面介紹vb調用上例生成的dll(假設文件名為test.dll)。聲明public declare function getcardsnum libtest.dll()as integerpublic declare function sendcommand libtest.dll(byval dwcmd as long) as long在聲明時需要注重:dll的路徑;參數傳遞的方式;參數的類型。另外,vb遵從_stdcall的參數傳遞商定,而vc默認_cdecl的傳遞商定,因此在dll中的導出聲明需采納_stdcall的裝點符。調用一旦聲明后,在vb的應用程序中就可調用dll中的例程。如:private sub form_load()dim cardsnum as integercardsnum = getcardsnum()msgbox“系統中有”+ str(cardsnum)+“塊s5933插卡!”end subwindriver包括了諸如amcc、plx、galileo、v3、plda等公司pci芯片的專用cc的api函數庫,其中包含了io讀寫,內存映射,中斷處理以及dma等底層驅動的函數,可以十分便利地用vc,bc以及c
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 初中英語自然拼讀法在英語戲劇表演比賽中的實踐與探索論文
- 中國醫藥行業市場分析報告
- 節假曰車輛管理制度
- 苯板房安全管理制度
- 茶藝師銷售管理制度
- 《小公雞和小鴨子》課件
- 財務預算管理與財務知識分析
- 高爾夫移動卡項目商業計劃書
- 管理學案例分析閑可釣魚與無暇吃魚
- 見證取樣手冊(四川省質安站)
- 新課程理念下語文課堂教學體系重建
- 工程完工后的回訪與保修服務承諾
- 從技術革新到應用拓展:高效便捷三維人體重建的多維探索
- 2025年湖南省中考數學模擬試卷(二)
- 2025山煤國際井下崗位高校畢業生招聘300人(山西)筆試參考題庫附帶答案詳解
- 廣東省大灣區2025屆普通高中畢業年級聯合模擬考試(二)化學(含答案)
- 電大《組織行為學》期末題庫及答案
- 轉讓魚塘釣場協議書
- 叉車司機理論知識考試復習題庫(必會500題)
- 常州保安證考試題及答案
- 《化工和危險化學品生產經營單位重大生產安全事故隱患判定標準》解讀與培訓
評論
0/150
提交評論