<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 利用WinDriver開(kāi)發(fā)PCI設備驅動(dòng)程序

利用WinDriver開(kāi)發(fā)PCI設備驅動(dòng)程序

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

摘要:是一套包。它改變了傳統的方法與思路,極在地簡(jiǎn)化了的編制;同時(shí),又沒(méi)有犧牲驅動(dòng)程序的性能,是一套高效、快捷的驅動(dòng)程序軟件包。特別適合專(zhuān)業(yè)硬件人員的使用。

本文引用地址:http://dyxdggzs.com/article/149565.htm

是Jungo公司出版的一個(gè)驅動(dòng)程序開(kāi)發(fā)組件,它可以大大加速驅動(dòng)程序的開(kāi)發(fā)。作者在實(shí)際的項目中采用了來(lái)開(kāi)發(fā)驅動(dòng)程序,取得了相當好的運行效果。從目前國內的資料上來(lái)看,大多數設計人員還是在用DDK、Wtools開(kāi)發(fā)設備驅動(dòng)程序,因而作者覺(jué)得有必要向大家介紹與推薦這個(gè)軟件。

WinDriver是一套設備驅動(dòng)程序開(kāi)發(fā)組件,它的目的就是方便Windows程序員快速開(kāi)發(fā)出PCI/ISA設備的Windows驅動(dòng)程序(目前最新的版本V4.32還支持PCMCIA、USB設備的驅動(dòng)程序的開(kāi)發(fā),并且除了支持Windows9X/NT系統外,還有支持Unix、Windows CE的版本推出)。WinDriver開(kāi)發(fā)設備驅動(dòng)程序,不需要熟悉操作系統的內核,整個(gè)驅動(dòng)程序中的所有函數都是工作在用戶(hù)態(tài)下的,通過(guò)與WinDriver的.Vxd或者.Sys文件交互來(lái)達到驅動(dòng)硬件的目的。由于是一個(gè)用戶(hù)態(tài)程序,效率的高低也就成了人們選擇WinDriver時(shí)關(guān)心的一個(gè)問(wèn)題。大量實(shí)踐數據表明,WinDriver并沒(méi)有通過(guò)犧牲系統性能來(lái)?yè)Q取驅動(dòng)程序的快速開(kāi)發(fā),的確是一個(gè)“像開(kāi)發(fā)用戶(hù)態(tài)程序那樣簡(jiǎn)單,像核心態(tài)程序那樣高效”[1]的開(kāi)發(fā)工具。

1 WinDriver主要特征

  ·提供了從用戶(hù)層訪(fǎng)問(wèn)硬件的簡(jiǎn)單方法;

  ·能夠方便地將性能要求特別苛刻的部分通過(guò)Windriver提供的API插入到核心態(tài)模式運行,提高執行效率;

  ·對主流PCI接口芯片(AMCC、PLX、V3系列)提供了很好的支持;

  ·可以常見(jiàn)的軟件開(kāi)發(fā)平臺(Visual C++、Borland C++、VB4、Java、Delphi);

  ·支持I/O、DMA、中斷處理,支持PCI、ISA、EISA設備的開(kāi)發(fā);

  ·無(wú)需DDK以及核心態(tài)程序開(kāi)發(fā)的經(jīng)驗。

2 開(kāi)發(fā)步驟

  a.根據WinDriver的文檔,建議開(kāi)發(fā)步驟如下:

  ·修改代碼,加入定制功能;

  ·在用戶(hù)態(tài)執行與調試代碼;

  ·將性能苛刻部分插入到核心態(tài);

b.我們在實(shí)際編寫(xiě)驅動(dòng)程序的過(guò)程中發(fā)現,完全用WinDriver提供API來(lái)寫(xiě)驅動(dòng)程序比在Wizard生成的框架代碼上修改更為靈活。一般來(lái)說(shuō),PCI驅動(dòng)程序分成3個(gè)部分:初始化部分,對硬件資源的訪(fǎng)問(wèn)函數庫、具體調用部分。其中,后面兩個(gè)部分對于不同的硬件都是基本一致的。比如說(shuō),我們先后開(kāi)發(fā)的基于A(yíng)MCC5933與PLX9052的PCI接口卡,對于他們的硬件資源訪(fǎng)問(wèn),用的都是WinDriver下面相同的API;兩者開(kāi)發(fā)的不同只在于初始化時(shí)對于硬件資源的鎖定。所以只要開(kāi)發(fā)出了針對一種接口芯片的系統的驅動(dòng)代碼后,以后一般只要修改接口芯片的ID值及一些寄存器的偏移值,就能夠移植了,比每次生成不同的框架代碼再改動(dòng)也許要更簡(jiǎn)便。

3 實(shí)例分析

整個(gè)驅動(dòng)程序的結構大致如下:

  ·打開(kāi)WinDriver設備;

  ·查找我們要訪(fǎng)問(wèn)的PCI設備;

  ·枚舉該設備的資源(內存、I/O、中斷);

  ·鎖定該設備的資源只能為我們所用,不能被其他程序訪(fǎng)問(wèn);

  ·訪(fǎng)問(wèn)板上的資源;

  ·解鎖資源;

  ·關(guān)閉WinDriver設備。

以下為一段使用WinDriver開(kāi)發(fā)的AMCC5933DMA的驅動(dòng)代碼,這個(gè)程序來(lái)演示W(wǎng)inDriver的程序結構。這個(gè)程序只要稍加修改,就可以用來(lái)作為其他PCI卡的驅動(dòng)程序的一部分,例如PLX9050、9054。為了節省篇幅,省略了變量說(shuō)明部分。程序中出現的變量大都由其名稱(chēng)可以反映含義,具體可以參見(jiàn)WinDriver的設計文檔中的說(shuō)明。

  hWD=WD_Open(); //打開(kāi)WinDriver設備,每次使用前必須調用;

  pciScan.searched.dwVendorId=0x10e8; //AMCC公司供貨號

  pciScan.searched.dwDeviceId=0x4750; //AMCC5933的設備號

  WD_PciScanCards (hWD,pciSxcan); //枚舉PCI槽上的設備

  pciSlot =pciScan.cardSilt[0]; //假設只有我們一個(gè)設備得到設備槽的號碼

  pciCardInfo.pciSlot=pciSlot;

  WD_PciGetCardInfo(hWD,pciCardInfo); //得到該設備槽上的設備信息

  Card=pciCardInfo.Card; //Card為一個(gè)反映PCI卡上資源的結構

  cardReg.Card=Card;

  WD_CardRegister(hWD,cardReg); //向核心態(tài)登記,鎖定卡上資源

  Item=Card.Item[2]; //將卡上的號為2的資源賦給Item

  if(Item.item==ITEM_MEMORY)

  {

  regAddr=Item.I.Mem.dwUserDirectAddr; //得到PCI卡上的內存映射到用戶(hù)態(tài)的地址

  }

  Dma1.dwBytes=4*dwDWord;

  Dma1.pUserAddr=pBuffer1;

  Dma1.dwOptiONs=0;

  WD_DMALock(hWD,Dma1); //鎖定用于DMA的內存資源

至此與PCI卡上的內存進(jìn)行DMA傳輸的準備已經(jīng)完成,下面只要寫(xiě)相應的控制字就可以啟動(dòng)DMA操作了。

4 常見(jiàn)問(wèn)題的解答

(1)評估版本的功能限制及其解決

評估版本除了30天的限制外,與正式版本相比還有3個(gè)限制。其中影響最大的是所有的關(guān)閉函數(DMA鎖定內存的解鎖,資源的關(guān)閉…)都加了延時(shí)。這樣我們在做數據采集卡的驅動(dòng)程序時(shí)就要注意,最好只分配一次資源。比如說(shuō)做DMA操作,不要反復地鎖定內存,這樣會(huì )在解鎖時(shí)損失效率。一個(gè)折衷的方法是鎖定DMA內存后,一旦這塊內存寫(xiě)滿(mǎn)后,就將其中數據拷到用戶(hù)態(tài)程序分配的大內存中去。

(2)用WinDriver開(kāi)的程序效率

在使用WinDriver或者VxdTools這類(lèi)工具時(shí),大家最關(guān)心的一個(gè)問(wèn)題可能就是效率問(wèn)題。從實(shí)踐與分析來(lái)看,WinDriver生成的驅動(dòng)代碼的效率相當地高。比如PCI卡的高速數據采集涉及到DMA的應用,WinDriver提供相應的API來(lái)將卡上的內存映射到用戶(hù)態(tài)程序所能直接訪(fǎng)問(wèn)的地址空間中,然后直接對這個(gè)映射后得到的地址進(jìn)行DMA操作。也就是說(shuō),與用DDK來(lái)直接編寫(xiě)驅動(dòng)程序的區別就在于地址映射的操作上,在這部分工作上面,用WinDriver的API肯定沒(méi)有直接用DDK寫(xiě)的專(zhuān)門(mén)面向特定硬件優(yōu)化的代碼來(lái)得高效。但是這部分代碼實(shí)際上屬于初始化工作,這部分的效率高低事實(shí)上并不會(huì )影響總體上的效率。

實(shí)際中,用WinDriver編寫(xiě)的PCI驅動(dòng)程序在賽揚466、64M內存的機器上,在8位模式下可以穩定地采集4~8Mbytes/s的數據。而且隨著(zhù)硬件設計的改變,肯定還有提高余地。

經(jīng)過(guò)實(shí)際應用,發(fā)現WinDriver這個(gè)軟件使用快速,無(wú)論是開(kāi)發(fā)效率還是實(shí)際達到的性能指標都相當令人滿(mǎn)意。特別對于硬件開(kāi)發(fā)人員來(lái)說(shuō),可以不必了解繁瑣的操作系統的內核知識,就可以快速地開(kāi)發(fā)出驅動(dòng)程序,對于調試硬件是一個(gè)很好的幫助工具。

c++相關(guān)文章:c++教程




評論


相關(guān)推薦

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

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>