日韩欧美自拍在线观看-欧美精品在线看片一区二区-高清性视频一区二区播放-欧美日韩女优制服另类-国产精品久久久久久av蜜臀-成人在线黄色av网站-肥臀熟妇一区二区三区-亚洲视频在线播放老色-在线成人激情自拍视频

ISA數(shù)據(jù)通訊卡WDM驅(qū)動程序的實現(xiàn)

出處:電子技術(shù)應(yīng)用 發(fā)布于:2011-09-05 13:49:25

  WDM(Windows Driver Mode1)是Microsoft公司全新的Windows驅(qū)動程序模式,支持即插即用(PNP)、電源管理和WMI技術(shù),它的運行平臺是Windows 98/2000/XP/2003操作系統(tǒng)。這種具有跨平臺性的設(shè)備驅(qū)動模型可以大大簡化驅(qū)動程序的開發(fā)工作,為用戶的PNP設(shè)備驅(qū)動完成了大量的底層工作。這也使得WDM對各種老設(shè)備,特別是那些不具有即插即用特性硬件的支持明顯的不足。在科研和工控中,常用的數(shù)據(jù)采集卡通常都是基于PC總線的不能為PNP提供硬件支持的ISA設(shè)備。為這類硬件編寫非WDM驅(qū)動程序只能局部支持PNP特性,而且需要做大量額外的工作如:必須檢測硬件,為硬件創(chuàng)建設(shè)備對象(用于代表硬件),配置并初始化硬件使其正常工作,這些工作非常復(fù)雜。利用WDM可以大大簡化這些工作。

  1 WDM的結(jié)構(gòu)

  WDM實際上是一個編寫驅(qū)動程序的規(guī)范。其驅(qū)動程序結(jié)構(gòu)的特點和WINDOWS程序設(shè)計的消息驅(qū)動機制很相像,采用IRP驅(qū)動機制。WINDOWS 98和WINDOWS 2000處理IRP的方式一樣,本質(zhì)卻完全不同。

  Windows2000的內(nèi)存管理采用了虛擬內(nèi)存的概念,系統(tǒng)表現(xiàn)為具有一個比物理內(nèi)存大得多的虛擬內(nèi)存空間。每個進(jìn)程都被賦予它自己的虛擬地址空間,這個地址空間劃分成固定大小的頁(x86、32位處理器的頁大小為4KB),一個頁可以駐留在物理內(nèi)存(非分頁內(nèi)存),或者被交換到硬盤上(分頁內(nèi)存)。當(dāng)進(jìn)程中的一個線程正在運行時,該線程可以訪問只屬于它的進(jìn)程的內(nèi)存,屬于所有其他進(jìn)程的內(nèi)存則隱藏著,并且不能被正在運行的線程訪問。每個進(jìn)程有獨立的內(nèi)存空間,不會被其他程序訪問,保護(hù)了數(shù)據(jù)的完整性。這樣,有一部分內(nèi)存實際上不是在物理內(nèi)存中,而是在硬盤上。當(dāng)訪問并不存在于實際物理內(nèi)存的地址時,內(nèi)存管理器引發(fā)DISPATCH_ LEVEL級別的頁故障中斷,調(diào)用硬盤驅(qū)動程序把故障頁讀入內(nèi)存。所以,在DISPATCH LEVEL級別上運行代碼時,訪問非分頁內(nèi)存是一個基本原則,否則進(jìn)程將被阻塞,因為這個頁故障中斷被屏蔽了。這時,在當(dāng)前的Windows系統(tǒng)中,就會發(fā)生藍(lán)屏。虛擬內(nèi)存方便了應(yīng)用程序l的開發(fā),卻給ISA設(shè)備在分配資源時帶來一些復(fù)雜的問題。因為x86處理器的內(nèi)存頁大小為4KB,所以在為ISA設(shè)備進(jìn)行內(nèi)存映射時每段就不要超過4KB。否則當(dāng)訪問超出4KB地內(nèi)存時就會出現(xiàn)上面所說的藍(lán)屏。

  WDM驅(qū)動程序面對的主要內(nèi)容是一系列內(nèi)核驅(qū)動對象。這些對象包括驅(qū)動對象、設(shè)備對象,還有一系列的資源抽象對象如中斷對象、適配器對象(處理DMA操作)、內(nèi)核模式派發(fā)器對象、控制器對象、推遲過程對象、定時器對象、設(shè)備隊列對象、回調(diào)對象等。其中驅(qū)動對象由I/O管理器負(fù)責(zé)創(chuàng)建和管理。WDM驅(qū)動程序利用IRP和這些對象完成硬件設(shè)備的抽象化,并對應(yīng)用程序提供統(tǒng)一操作接口。這就是所謂的WDM規(guī)范。

  WDM驅(qū)動程序的結(jié)構(gòu)很簡單。它的主體是一個入口函數(shù)DriverEntry。DriverEntry的個參數(shù)是指針,指向一個剛被初始化的驅(qū)動程序?qū)ο螅搶ο蟠眚?qū)動程序。WDM驅(qū)動程序的DriverEntry例程完成這個對象的初始化并返回。WDM驅(qū)動程序的DriverEntry例程的主要工作是把各種函數(shù)指針填入驅(qū)動程序?qū)ο蟆_@些指針對操作系統(tǒng)指明了驅(qū)動程序容器中各種子例程的位置。它包括下面這些指針成員:

  ·DriverUnload指向驅(qū)動程序的清除例程。I/O管理器會在卸載驅(qū)動程序前調(diào)用該例程。通常WDM驅(qū)動程序的DriverEntry例程一般不分配任何資源,所以DriverUnload例程也沒有什么清除工作要做。

  ·DriverStartIo,如果驅(qū)動程序使用標(biāo)準(zhǔn)的串行IRP,則必須使用這個函數(shù),使它指向驅(qū)動程序的StarIo例程。

  ·MajorFunction是一個指針數(shù)組,它主要處理各種用戶的I/O請求IRP。默認(rèn)情總況下,用戶的所有I/O請求都會由I/O管理器返回失敗。驅(qū)動程序為要處理的IRP指定相應(yīng)的派遣函數(shù)。

  2 為ISA設(shè)備分配資源

  雖然WDM驅(qū)動程序可以簡化很多工作,但是給ISA設(shè)備編寫WDM驅(qū)動程序也有困難。這個困難是ISA設(shè)備所需資源的分配問題。根據(jù)PNP的規(guī)范,支持PNP的設(shè)備如PCI總線設(shè)備有相應(yīng)的寄存器標(biāo)識自己和自己可以接受的資源,如中斷、端口范圍、內(nèi)存范圍等,并且有相應(yīng)的邏輯支持配置資源。這使得操作系統(tǒng)啟動過程中可以動態(tài)地規(guī)劃調(diào)整各個設(shè)備的資源而不需要用戶的干預(yù)。為了兼容非PNP設(shè)備,INF文件支持幾個命令為設(shè)備分配資源。這些信息初提供給NPN管理器,并且被PNP管理器用來與系統(tǒng)其它部分協(xié)商以完成非PNP設(shè)備的自動資源分配。LOGCONFIG為設(shè)備制定一個可選的資源設(shè)定。還有相應(yīng)的IRQCONFIG、IOCONFIG、DMACONFIG、MEMCONFIG子命令,它們?yōu)樵O(shè)備指定具體的可選資源。語法如下:

  [<log-config-section-name>]

  ConfigPririty=<priority-value>

  [DMAConfig=<dma-list>]

  [IOConfig=<io-range-list]

  [IRQConfig=<irq-list>]

  [MemConfig=<mem-range-list>]

  其中CONFIGPRIOITY命令指定這個LOGCONFIG項的優(yōu)先級。其余子命令表示設(shè)備選用的硬件資源。下面是一個例子:

  [CX2590.Install]

  ……;其它命令

  LogConfig=CX2590_DMA;指定配置項的名稱

  [CX2590_DMA];配置項的名稱

  ConfigPriority=NORMAL;配置的優(yōu)先級

  IOConfig=4@300-3ff%3ff(3ff::);指定IO范圍

  IRQConfig=4,5,9,10,11 ;指定可選的中斷

  DMAConfig=0,1,2,3 ;指定可選的DMA

  在INF文件中加入LOGCONFIG命令可以解決ISA總線設(shè)備資源的自動分配問題,就可以為ISA總線設(shè)備編寫WDM驅(qū)動程序。

  3 一個ISA設(shè)備WDM驅(qū)動程序的實現(xiàn)

  使用Numega公司的開發(fā)工具DriverStudio 2.01可以大大地簡化驅(qū)動程序的開發(fā)過程。DriverStudio開發(fā)通用內(nèi)核模式的開發(fā)包是DriverWorks。DriverWorks是一個面向?qū)ο蟮墓ぞ甙K庋b了比較底層的繁復(fù)操作,提供給開發(fā)者一個簡潔的界面。同時,DriverWorks和Visual C++有很多的接口:DriverWorks專門為Visual C++提供了一個專門開發(fā)WDM驅(qū)動程序的WIZARD。在WIZARD指導(dǎo)下,開發(fā)者可以很容易地生成一個驅(qū)動程序的框架。開發(fā)者要作的工作就是根據(jù)特定硬件編寫相應(yīng)的代碼。

  筆者開發(fā)的高速旋轉(zhuǎn)機械監(jiān)控與故障診斷系統(tǒng)采用的是北京大恒公司的具有FIFO(隊列形式實現(xiàn)的緩存)的8路數(shù)據(jù)采集卡AC 1810。它的特點是由硬件自動完成采用操作:當(dāng)FIFO半滿的時候,系統(tǒng)產(chǎn)生中斷通知用戶取走數(shù)據(jù);同時,硬件繼續(xù)自動采樣FIFO的另一關(guān)。驅(qū)動程序的主要工作包括設(shè)備I/O讀操作和中斷服務(wù)操作。下面是WIZARD生成的驅(qū)動對換和設(shè)備對象的定義(只取主要部分):

  // 驅(qū)動對象

  class AC_1810 : public Kdriver

  {

  SAFE_DESTRUCTORS

  public:

  virtual NTSTATUS

  DriverEntry(PUNICOE-STRING

  RegistryPath);

  //驅(qū)動程序的入口函數(shù)

  virtual NTSTATUS

  AddDevice(PDEVICE_OBJECT Pdo);

  //完成設(shè)備對象和驅(qū)動對象的連接

  ……

  };

  //設(shè)備對象

  class AC_1810Device : public KpnpDevice

  {

  // Constructors

  public;

  AC-1810Device(PDEVICE_OBJECT Pdo,

  ULONG Unit);//構(gòu)造函數(shù)完成資源配置

  ……

  public:

  AC_1810Device(PDEVICE_OBJECT Pdo,

  ULONG Unit);//構(gòu)造函數(shù)完成資源配置

  ……

  public:

  BOOLEAN Isr_Irq(void);// IRQ中斷服務(wù)例程

  Virtual NTSTATUS Create(KIrp I);

  //標(biāo)準(zhǔn)IRP處理函數(shù)

  virtual NTSTATUS Close(KIrp I);

  // COMMENT_ONLY

  virtual NTSTATUS Read(KIrp I);

  // COMMENT_ONLY

  virtual VOID StarIo(KIrp I);

  // 開始I/O傳輸

  VOID CancelQueuedIrp(KIrp I);

  // 判斷傳輸IPR是否被取消

  VOID Invalidate(void);

  // 釋放資源例程

  virtual NTSTATUS DefaultPnp(KIrp I);

  // 處理默認(rèn)的PNP操作

  virtual NTSTATUS DefaultPower(KIrp I);

  // 管理電源

  void SerialRead(KIrp I);

  //完成實際的I/O操作

  NTSTATUS IOCTL_SETUP_Handler(KIrp I);

  //采樣參數(shù)設(shè)定

  NTSTATUS IOCTL_REW_Handler(KIrp I);

  // 開始/停止采樣

  ……

  protected:

  KioRange m_IoPotrRange0

  // 管理I/O資源

  Kinterrupt m_Irq;

  // 管理中斷資源

  ……

  };

  在實際操作過程中,采用中斷讀數(shù)的方法。在驅(qū)動程序中設(shè)置了兩個緩沖區(qū),一個前臺緩沖區(qū),一個后臺緩沖區(qū)(用作后備緩沖區(qū)),系統(tǒng)總是先使用前臺緩沖區(qū)。這樣可以保證采樣數(shù)據(jù)序列的時間順序。

  具體實現(xiàn)如下:

  // ISR例程,完成數(shù)據(jù)從FIFO中讀出

  BOOLEAN AC_1810Device::Isr_Irq(void)

  {

  //是否觸發(fā)不斷?未觸發(fā)則返回,判斷兩個緩沖區(qū)情況,都滿則返回

  ……

  // 前臺緩沖區(qū)未滿,使用前臺緩沖區(qū)

  if(m_pBuffer->numused < MAX_READ_BUF){

  for(int i=0;i<BLOCK_SIZE;i++){

  m_pBuffer_>buff[m_pBuffer->numused+i]=READ_FIFO;

  }

  m_pBuffer->numused +=BLOCK_SIZE;

  }

  else

  //完成其它情況的判斷

  ……

  return TRUE;// 中斷成功返回

  }

  當(dāng)應(yīng)用程序使用標(biāo)準(zhǔn)Win32 API對設(shè)備進(jìn)行讀操作的時候,I/O管理器通知驅(qū)動程序并觸發(fā)對Read函數(shù)的調(diào)用。對于通常的串行設(shè)備,在Read函數(shù)的排隊IRP請求,此時系統(tǒng)就可以觸發(fā)StartIO例程,并且保證這個過程是串行處理的。

  // 讀例程,處理IRP_MJ_READ

  NTSTATUS AC_1810 Device::Read(KIrp I)

  {

  // 檢查輸入的合法性

  if (I.ReadSize ()<BLOCK_SIZE){

  // 不合法返回錯誤代碼

  I.Information()=0;

  Return I.PnpComplete(this,STATUS_INVALID_PARAMETER);

  }

  // 讀0字節(jié),永遠(yuǎn)成功

  if (I.ReadSize() = =0){

  I.Information () = 0;

  return

  I.PnpComplete(this,STATUS_SUCCESS);

  }

  // 排隊這個IRP觸發(fā)StarIO,完成數(shù)據(jù)傳輸

  return QueueIrp(I,LinkTo(CancelQueuedIrp));

  }

  // StartIo例程,完成I/O操作

  VOID AC_1810 Device::StartIo(KIrp I)

  {

  // 檢測這個IRP是否被取消

  if(!I.TestAndSetCancelRoutine(LinkTo(CancelQueuedIrp),NULL,CurrentIrp()) )

  {

  return;//取消則返回

  }

  switch (I.MajorFunction()) {

  case IRP_MJ_READ:

  //這個函數(shù)按邏輯完成讀操作

  SerialRead(I);

  Breadk

  ……

  // 開始處理下一個IRP

  PnpNextIrp(I);

  break;

  }

  }

  ISA卡的WDM驅(qū)動程序的主體部分就完成了。它具有PNP功能,可以方便地安裝卸載。在中斷到來的時候,系統(tǒng)使用兩個緩沖區(qū)完成數(shù)據(jù)的傳輸,可以避免數(shù)據(jù)丟失。

  以上驅(qū)動程序是使用Numega公司的DriverSutdio 2.01版,結(jié)合Visual C++ 6.0,Microsoft Windows 2000 sp1 DDk開發(fā)調(diào)試通過,并且成功地應(yīng)用到實驗室開發(fā)的高速旋轉(zhuǎn)機械實時狀態(tài)監(jiān)控與故障診斷系統(tǒng)中,該系統(tǒng)界面友好高度可靠。同時由于加入了PNP的支持,使得該系統(tǒng)的硬件安裝卸載非常簡便。這種技術(shù)可取代傳統(tǒng)的以DOS為的工業(yè)用監(jiān)控與故障診斷系統(tǒng),具有廣闊的應(yīng)用前景。



  
關(guān)鍵詞:驅(qū)動

版權(quán)與免責(zé)聲明

凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權(quán)均屬于維庫電子市場網(wǎng),轉(zhuǎn)載請必須注明維庫電子市場網(wǎng),http://hbjingang.com,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。

本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點或證實其內(nèi)容的真實性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉(zhuǎn)載時,必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。

如涉及作品內(nèi)容、版權(quán)等問題,請在作品發(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。

廣告
OEM清單文件: OEM清單文件
*公司名:
*聯(lián)系人:
*手機號碼:
QQ:
有效期:

掃碼下載APP,
一鍵連接廣大的電子世界。

在線人工客服

買家服務(wù):
賣家服務(wù):
技術(shù)客服:

0571-85317607

網(wǎng)站技術(shù)支持

13606545031

客服在線時間周一至周五
9:00-17:30

關(guān)注官方微信號,
第一時間獲取資訊。

建議反饋

聯(lián)系人:

聯(lián)系方式:

按住滑塊,拖拽到最右邊
>>
感謝您向阿庫提出的寶貴意見,您的參與是維庫提升服務(wù)的動力!意見一經(jīng)采納,將有感恩紅包奉上哦!