日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式硬件
[導(dǎo)讀]摘要:針對(duì)Windows9x/NT及Windows2000操作系統(tǒng),利用Windriver工具包,實(shí)現(xiàn)了在多種操作系統(tǒng)下對(duì)硬件中斷驅(qū)動(dòng)程序進(jìn)行統(tǒng)一化處理,保證了程序在不同的操作系統(tǒng)下良好的移植

摘要:針對(duì)Windows9x/NT及Windows2000操作系統(tǒng),利用Windriver工具包,實(shí)現(xiàn)了在多種操作系統(tǒng)下對(duì)硬件中斷驅(qū)動(dòng)程序進(jìn)行統(tǒng)一化處理,保證了程序在不同的操作系統(tǒng)下良好的移植性矣兼容性,并給出了用C語(yǔ)言編寫(xiě)的程序?qū)嵗?/p>

關(guān)鍵詞:Windows9x/NT/2000 虛擬設(shè)備驅(qū)動(dòng)程序(VxD) Windriver工具包 中斷驅(qū)動(dòng)程序的統(tǒng)一化處理

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

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

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

1 Windows下硬件中斷的管理機(jī)制

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

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

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

2 WinDriver工具包簡(jiǎn)介

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

(1)WinDriverWizard

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

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

(2)公用程序

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

(3)大量例程

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

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

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

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

(1)WD-Open()--獲得驅(qū)動(dòng)程序(指Windrvr.vxd或Windrvr.sys)的句柄,它實(shí)際上是調(diào)用了Create-File()API函數(shù),在程序開(kāi)始時(shí)必須調(diào)用;

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

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

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

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

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

(7)InterruptThreadDisable()-使中斷無(wú)效的函數(shù),屏蔽掉中斷信號(hào),不再對(duì)其進(jìn)行處理。在其中集成了WaitForSingleObject()和CloseHandle()這兩個(gè)API函數(shù)。

4 具體示例

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

Listem_Interupt.c源程序

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

#include"../../include/windrvr.h"

#include"../../include/windrvr_int_thread.h"

#include

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

enum{MY_IRQ=12};

//建立全局的WinDriver包柄

HANDLE hWD;

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

WD_INTERRUPT Intrp;

Static char line[256];

//中斷處理過(guò)程,你可以用pData來(lái)傳遞從InterruptThreaEnable()得來(lái)的信息

VOID interrupt_handler(PVOID pData)

{

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

prinft('截獲中斷的數(shù)目為%d\n',Intrp.dwCounter);

}

//主函數(shù)

int main()

{

WD_CARD_REFISTER cardReg;//建立插卡登記項(xiàng)目的一個(gè)實(shí)例

WD_VERSION verVuf;

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

if(hWD==INVALID_HANDLE_VALUE)

{

Printf("打開(kāi)WINDRVR出現(xiàn)錯(cuò)誤!\n");

return0;

}

BZERO(verBuf);

WD_Version(hWD,&verBuf);

if(verBuf,dwVer

{

printf("WINDRVR版本不正確,這里需要的版本為:%d\n",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,dwIntrrupt=MY_IRQ;

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

cardReg.fGhecklockOnly=True;

WD_CardReguster(hWD,&cardReg);

if(cardReg.hCard==0)

{

prinft('無(wú)法鎖定設(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;

printh('開(kāi)始中斷線(xiàn)程\');

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

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

{

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

}

else

{

//callyourdrivercodehere

printf('敲回車(chē)鍵不再進(jìn)行中斷截獲\n');

gets(line);

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

InterruptThreadDisable(&thread_handle);

}

//釋放所登記的資源

WD_CardUnregister(hWD,&cardReg);

}

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

WD_Close(hWD);

return0;

}

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

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

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過(guò)流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問(wèn)題卻十分常見(jiàn),不僅增加了維護(hù)成本,還影響了用戶(hù)體驗(yàn)。要解決這一問(wèn)題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(chē)(EV)作為新能源汽車(chē)的重要代表,正逐漸成為全球汽車(chē)產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車(chē)的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車(chē)的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車(chē) 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車(chē)場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問(wèn)題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周?chē)娮釉O(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來(lái)解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開(kāi)關(guān)電源具有效率高的特性,而且開(kāi)關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開(kāi)關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉