當(dāng)前位置:首頁 > 智能硬件 > 智能硬件
[導(dǎo)讀]Windows以其友好的圖形用戶界面,使得它不僅成為辦公管理首選的操作系統(tǒng),也日益受到工程技術(shù)人員的關(guān)注,逐漸取代DOS而成為主流的工程應(yīng)用控制平臺。但是,Windows系統(tǒng)為了保證平臺的安全與完整性,對系統(tǒng)底層操作采

Windows以其友好的圖形用戶界面,使得它不僅成為辦公管理首選的操作系統(tǒng),也日益受到工程技術(shù)人員的關(guān)注,逐漸取代DOS而成為主流的工程應(yīng)用控制平臺。但是,Windows系統(tǒng)為了保證平臺的安全與完整性,對系統(tǒng)底層操作采取了屏蔽的策略,利用VxD將用戶與硬件隔離開來。 在Windows9x(95、97、98)下,用戶如果需要實現(xiàn)對硬件的中斷、DMA或存儲空間物理地址等資源進行訪問,必須通過設(shè)備驅(qū)動程序來進行硬件操作;而在WindowsNT下,即使是簡單的I/O操作,也需要編寫驅(qū)動程序方能與硬件打交道。

  Windows操作系統(tǒng)的主流目前是Windows9x和WindowsNT,而已經(jīng)推出的Windows2000是以WindowsNT為主要框架的。由于Windows9x和WindowsNT兩者在系統(tǒng)核心上有質(zhì)的不同,所以即使對于同樣一個硬件,在兩者下的驅(qū)動程序也有很大的區(qū)別。因此,一般而言,需要針對不同的操作系統(tǒng)編寫不同的驅(qū)動程序。

  兼容X86指令的微機CPU運行時有4個優(yōu)先級,Ring0~Ring3。操作系統(tǒng)與驅(qū)動程序運行在Ring0級,可以對所有硬件資源進行控制;用戶程序運行在Ring3級,對資源控制受到一些限制。而對于Ring0級的驅(qū)動程序而言,它的編寫和調(diào)試通常需要對操作平臺的運行機制有較深的了解,從而要求程序開發(fā)者掌握Windows9x、NT及Windows2000的內(nèi)核管理機制,對于開發(fā)人員來講這有相當(dāng)大的難度。 在這里,筆者使用了美國Jungo公司出品的WinDriver工具包,利用其繞過了對操作系統(tǒng)內(nèi)核的學(xué)習(xí)掌握這個難點,并且在不更改程序代碼的前提下,完成了在多個操作系統(tǒng)下對硬件中斷的一致處理,很方便地解決了硬件與程序在不同系統(tǒng)下的移植問題。

1 Windows下硬件中斷的管理機制

  在多任務(wù)的環(huán)境里,硬件設(shè)備中斷管理程序是非常重要的系統(tǒng)級程序。它不僅要把硬件發(fā)生的中斷時間傳給相應(yīng)的驅(qū)動程序,還要允許某些設(shè)備驅(qū)動程序處理它們特殊的中斷服務(wù)。在Windows平臺下,VPICD(虛擬可編程中斷控制器)就是這樣的硬件設(shè)備管理程序,它負(fù)責(zé)管理所有的硬件中斷時間。VPICD通過一個缺省機制觸發(fā)駐留在VM(虛擬機)內(nèi)的中斷處理函數(shù)。它完全允許VxD根據(jù)其需要而重載中斷處理函數(shù)。PC機的硬件中斷需要確定硬件中斷的IRQS(中斷申請?zhí)?,對一個特定的IRQ中斷源,VPICD或提供缺省的中斷處理函數(shù),或允許其它VxD重載中斷處理函數(shù)。

  VPICD提供的缺省中斷處理是:首先置中斷禁止,再觸發(fā)相應(yīng)VM中的中斷處理函數(shù)。因為VPICD實現(xiàn)了對PPIC(物理可編程中斷控制器,如8259中斷控制器)的虛擬化,所以當(dāng)VM中的中斷處理函數(shù)發(fā)送EOI(中斷處理結(jié)束指令)時,VPICD即對PPIC發(fā)EOI指令。最后,VPICD控制處理函數(shù)的返回操作,恢復(fù)中斷,并置VM狀態(tài)為VM進入中斷前的狀態(tài)。當(dāng)VPICD對某些中斷的缺省處理不夠充分或則不太合適時,就需要親手編寫一個VxD,在其中實現(xiàn)中斷的虛擬化。VxD將決定如何處理硬件中斷以及如何調(diào)用VM中的中斷處理函數(shù)。

  下面將要詳述的WinDriver對中斷處理作了很好的封裝,將對VPICD和VM的控制和處理以及某些特殊的驅(qū)動要求封裝在經(jīng)過嚴(yán)格調(diào)試的WinDriver.vxd和WinDriver.sys中,并對調(diào)用驅(qū)動程序的API(應(yīng)用編程接口)函數(shù)進行了系統(tǒng)集成,讓使用者直接面對用高級語言集成好的類庫和函數(shù)接口,從而大大降低了程序開發(fā)的難度,縮短了開發(fā)周期。

2 WinDriver工具包簡介

  WinDriver是美國Jungo公司出品的用于編寫驅(qū)動程序的一種工具包,主要針對ISA/PCI插卡,4.2版本以后還提供了USB的開發(fā)工具。最新版本4.40版所編寫的程序兼容性十分強大,包括了Windows9x、Windows NT、Windows2000、Windows CE、Linux、Solaris(Intel)、VxWorks (Intel) 、OS/2等諸多操作平臺。WinDriver主要包括一個WinDriverWizard、一個WinDriver發(fā)行包、多個公用程序以及大量的例程。

  (1)WinDriverWizard

  這是一個友好的Windows向?qū)Ы缑妗_\行WinDriverWizard,它可以讓你立即接觸到硬件而不用寫一句有關(guān)的代碼。這種便利來自于它的自動檢測功能。對于ISA插卡,用戶可以直接利用它來讀寫卡上的內(nèi)存、I/O地址、寄存器以及偵聽中斷。對于PCI插卡,除了上面的基本功能外,還可以方便地讀寫PCI的配置信息。

  在此之后,通過選擇“GenerateCode”選項,WinDriverWizard會為你的插卡產(chǎn)生基本的程序代碼。4.2版本以后還提供了多種編程語言選擇,幾乎包括了所有流行的編程語言,如VC4?觸VC6、Borland C++Builder3?觸4、Pascal、Delphi、Linuxmake、Solariesmake等等。這就讓用戶不必去學(xué)新的編程語言,很容易地直接上手。

  (2)公用程序

  WinDriver提供了pci_scan、pci_dump、pci_diag、isapnp_scan、wdreg、wddebug等多個公用程序。pci_scan可以給出安裝的PCI卡及系統(tǒng)為它們分配資源的列表;pci_dump則負(fù)責(zé)得到已安裝的PCI卡的系統(tǒng)配置信息;pci_diag兼有兩者功能;isapnp_scan為用戶指出了即插即用的ISA插卡的有關(guān)信息;wdreg為用戶提供了修改注冊表的工具,可以用來方便地安裝用戶編寫的程序;wddebug則是一個用于調(diào)試用戶程序的有效工具。

  (3)大量例程

  WinDriver提供了許多例程,使用者可以利用它們來產(chǎn)生自己驅(qū)動程序的基本框架。與此同時,在WinDriver提供的在線幫助里,可以查到許多WinDriver封裝好的功能函數(shù)。這些函數(shù)能夠方便地實現(xiàn)中斷處理、DMA傳輸、I/O操作、內(nèi)存映射以及即插即用等功能。而且對于常用的PCI橋芯片,如PLX9050、PLX9060、PLX9080、AMCC5923、AMCC5933、V3、ALTERA、GT64等等,提供了特定的檢測程序和相應(yīng)的API函數(shù),大大減輕了用戶的編程難度。

3 WinDriver的驅(qū)動程序編程模式原理

  WinDriver編程有兩種模式。一種模式是用戶模式,這種模式實際上不是讓用戶來編驅(qū)動程序,而是利用軟件自身提供的驅(qū)動程序Windrvr.vxd和Windrvr.sys,用戶所面對的只是驅(qū)動程序給出的相應(yīng)功能接口;即使是這個接口,也用高級語言進行了很好的封裝,使用十分容易。另一種模式是“核心插入”模式用KernelPlugIn方式進行編程,形成.vxd和.sys文件,這是真正意義上的驅(qū)動程序。當(dāng)用戶有特殊的速度要求時,后者是較好的方式。這種方式最快,據(jù)Jungo公司的評測報告中講,可以在一秒鐘內(nèi)處理100,000次中斷,筆者在硬件中嘗試了一下10,000次中斷/秒,獲得了成功。

  對于對操作系統(tǒng)內(nèi)核了解不多的開發(fā)者,用戶模式無疑是非常值得推薦的。本文重點即是放在這方面。使用用戶模式,這里要特別注意以下幾個功能函數(shù):

  (1) WD_Open()——獲得驅(qū)動程序(指Windrvr.vxd或Windrvr.sys)的句柄,它實際上是調(diào)用了CreateFile()API函數(shù),在程序開始時必須調(diào)用;

  (2) WD_Close()——釋放驅(qū)動程序的句柄,它實際上是調(diào)用了CloseHandle()API函數(shù),在程序結(jié)束時必須調(diào)用;

  (3) WD_CardRegister()——負(fù)責(zé)插卡登記項目的建立和資源分配,資源包括I/O操作、內(nèi)存分配、中斷處理等。它調(diào)用了DeviceIOControl()API函數(shù);

  (4) WD_CardUnRegister()——負(fù)責(zé)插卡登記項目的刪除和資源釋放,與前者相對應(yīng),也調(diào)用了DeviceIOControl()API函數(shù);

  (5) InterruptThreadEnable()-中斷使能,使能后可以接收中斷信號,調(diào)用Interrupt_handler()函數(shù)對中斷進行相應(yīng)處理。在其中集成了CreateThread()API函數(shù);

  (6) Interrupt_handler()-中斷處理函數(shù),開發(fā)者在這里加入自己對硬件的控制代碼。

  (7) InterruptThreadDisable()-使中斷無效的函數(shù),屏蔽掉中斷信號,不再對其進行處理。在其中集成了WaitForSingleObject()和CloseHandle()這兩個API函數(shù)。

4 具體示例

  下面給出一個用戶模式的具體示例。用VisualC++6編譯調(diào)試通過,在Windows9x和WindowsNT下系統(tǒng)運行良好,在Windows2000下也能夠穩(wěn)定運行。windrvr.h和windrvr.vxd、windrvr.sys由軟件提供,這里就不詳述。對于Windows9x系統(tǒng),注意將windrvr.vxd拷貝到C:WindowsSystemVmm32目錄下;對于WindowsNT系統(tǒng),注意將windrvr.sys拷貝到C:WINNTSystem32DRIVERS目錄下。Listen_Interupt.C程序框架如下,該程序?qū)崿F(xiàn)了中斷12的截獲:

  Listen_Interupt.c源程序

 

  //應(yīng)包含的頭文件

  #include ″../../include/windrvr.h″

  #include ″../../include/windrvr_int_thread.h″

  #include

  //設(shè)置自己的中斷號,這個例子為中斷12

  enum {MY_IRQ=12};

  //建立全局的WinDriver句柄

  HANDLE hWD;

  //建立中斷結(jié)構(gòu)

  WD_INTERRUPT Intrp;

  Static char line[256];

  //中斷處理過程,你可以用pData來傳遞從InterruptThreadEnable()得來的信息

    VOID interrupt_handler(PVOID pData)

  {

       //在這里加入你要做的中斷處理代碼

       printf(″截獲中斷的數(shù)目為%dn″,Intrp.dwCounter);

  }

  //主函數(shù)

  int main()

  {

       WD_CARD_REGISTER cardReg;//建立插卡登記項目的一個實例

       WD_VERSION verBuf;

       hWD=WD_Open();//獲得驅(qū)動程序的句柄

  if(hWD==INVALID_HANDLE_VALUE)

  {

       printf(″打開WINDRVR出現(xiàn)錯誤!n″);

       return0;

  }

  BZERO(verBuf);

  WD_Version(hWD,&verBuf);

  if(verBuf.dwVer

  {

       printf(″WINDRVR版本不正確,這里需要的版本為:%dn″,WD_VER);

       return0;

  }

  //初始化cardReg,這是程序的重要部分

  BZERO(cardReg);

  cardReg.Card.dwItems=1;

  cardReg.Card.Item[0].item=ITEM_INTERRUPT;

  cardReg.Card.Item[0].fNotSharable=True;

  cardReg.Card.Item[0].I.Int.dwInterrupt=MY_IRQ;

  cardReg.Card.Item[0].I.Int.dwOptions=1;

  cardReg.fCheckLockOnly=True;

  WD_CardRegister(hWD,&cardReg);

  if(cardReg.hCard==0)

  {

              printf(″無法鎖定設(shè)備!″);

  }

  else

  {

              HANDLE thread_handle;

              BZERO(Intrp);

              Intrp.hInterrupt=cardReg.Card.Item[0].I.Int.hInterrupt;

              Intrp.Cmd=NULL;

              Intrp.dwCmds=0;

              Intrp.dwOptions=0;

              printf(″開始中斷線程n″);

              //這里調(diào)用WD_IntEnable(),并且建立一個中斷處理的線程

              if(!InterruptThreadEnable(&thread_handle,hWD,&Intrp,&interrupt_handler,NULL))

              {

                     printf(″中斷使能失敗!n″);

              }

              else

              {

                     //callyourdrivercodehere

                            printf(″敲回車鍵不再進行中斷截獲n″);

                     gets(line);

                     //這里調(diào)用禁止截獲中斷的函數(shù):WD_IntDisable()

                     InterruptThreadDisable(&thread_handle);

                     }

                     //釋放所登記的資源

                     WD_CardUnregister(hWD,&cardReg);

                     }

                     //刪除驅(qū)動程序的句柄。

                     WD_Close(hWD);

                     return0;

  }

  按照本文給出的技術(shù)方案,掌握必要的Windows編程技術(shù),即可以成功地實現(xiàn)Windows環(huán)境下對硬件中斷的直接控制,很方便地在不同系統(tǒng)下進行移植。實踐證明,這種方法是切實可行,行之有效的。

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉