在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

實(shí)現(xiàn)Windows環(huán)境下對(duì)硬件中斷的控制方法

電子設(shè)計(jì) ? 作者:電子設(shè)計(jì) ? 2018-11-02 08:05 ? 次閱讀

在計(jì)算機(jī)控制領(lǐng)域,隨著硬件的發(fā)展,一些原本十分復(fù)雜的控制算法的設(shè)計(jì)和仿真變得越來越容易實(shí)現(xiàn)。與基于VME、MULTIBUS以及STD總線的平臺(tái)相比,基于ISA總線的高性能PC工控機(jī)(IPC)無疑是近來應(yīng)用最為廣泛的主流產(chǎn)品。這主要得益于IPC與PC的軟件兼容性,此外其開放性結(jié)構(gòu)、外圍高性能I/O模板的不斷涌現(xiàn)以及實(shí)進(jìn)工業(yè)網(wǎng)絡(luò)的迅速發(fā)展都為IPC創(chuàng)造了有利的發(fā)展環(huán)境。可以說,IPC的時(shí)代已經(jīng)到來。此外,在當(dāng)今的計(jì)算機(jī)控制領(lǐng)域中,控制軟件是否基于Windows平臺(tái)已經(jīng)成為產(chǎn)品是否有競爭力的重要標(biāo)準(zhǔn)之一。目前基于Windows平臺(tái)的相關(guān)產(chǎn)品已經(jīng)占據(jù)了市場份額的90%。而Windows 9X和Windows NT憑借其出色的多任務(wù)、圖形用戶接口(GUI)、性能優(yōu)越的硬件兼容性以及卓越的32位軟件環(huán)境等性能已經(jīng)越來越廣泛地被應(yīng)用于工業(yè)控制,成為實(shí)現(xiàn)實(shí)時(shí)控制的優(yōu)秀平臺(tái)。在Windows9x(95、97、98)下,用戶如果需要實(shí)現(xiàn)對(duì)硬件的中斷、DMA或存儲(chǔ)空間物理地址等資源進(jìn)行訪問,必須通過設(shè)備驅(qū)動(dòng)程序來進(jìn)行硬件操作;在WindowsNT下,即使是簡單的I/O操作,也需要編寫驅(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)程序而言,它的編寫和調(diào)試要求程序開發(fā)者掌握Windows9x、NT及Windows2000的內(nèi)核管理機(jī)制,對(duì)于開發(fā)人員來講這有相當(dāng)大的難度。在這里,使用美國Jungo公司出品的WinDriver工具包,在不更改程序代碼的前提下,完成了在多個(gè)操作系統(tǒng)下對(duì)硬件中斷的一致處理,很方便地解決了硬件與程序在不同系統(tǒng)下的移植問題。

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í)間。PC機(jī)的硬件中斷需要確定硬件中斷的IRQS(中斷申請?zhí)枺瑢?duì)一個(gè)特定的IRQ中斷源,VPICD或提供缺省的中斷處理函數(shù),或允許其它VxD重載中處理函數(shù)。

VPICD提供的缺省中斷處理是:首先置中斷禁止,再觸發(fā)相應(yīng)VM中的中斷處理函數(shù)。因?yàn)閂PICD實(shí)現(xiàn)了對(duì)PPIC的虛擬化,所以當(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í),就需要親手編寫一個(gè)VxD,在其中實(shí)現(xiàn)中斷的虛擬化。VxD將決定如何處理硬件中斷以及如何調(diào)用VM中的中斷處理函數(shù)。

2 WinDriver工具包簡介

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

(1)WinDriverWizard

這是一個(gè)友好的Windows向?qū)Ы缑妗_\(yùn)行WinDriverWizard,然后,選擇“GenerateCode”選項(xiàng),WinDriverWizard會(huì)為你的插卡產(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等多個(gè)公用程序。pci_scan可以給出安裝的PCI卡及系統(tǒng)為它們分配資源的列表;pci_dump則負(fù)責(zé)得到已安裝的PCI卡的系統(tǒng)配置信息;pci_diag兼有兩者功能;isapnp_scan為用戶指出了即插即用的ISA插卡的有關(guān)信息;wdreg為用戶提供了修改注冊表的工具;wddebug則是一個(gè)用于調(diào)試用戶程序的有效工具。

(3)大量例程

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

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

WinDriver編程有兩種模式。一種模式是用戶模式,這種模式實(shí)際上不是讓用戶來編驅(qū)動(dòng)程序,而是利用軟件自身提供的驅(qū)動(dòng)程序Windrvr.vxd和Windrvr.sys,用戶所面對(duì)的中是驅(qū)動(dòng)程序給出的相應(yīng)功能接口;即使是這個(gè)接口,也用高級(jí)語言進(jìn)行了很好的封裝,使用十分容易。另一種模式是“核心插入”模式用KernelPlugIn方式進(jìn)行編程,形成。vxd和。sys文件,。當(dāng)用戶有特殊的速度要求時(shí),后者是較好的方式。

對(duì)于對(duì)操作系統(tǒng)內(nèi)核了解不多的開發(fā)者,使用用戶模式,這里要特別注意以下幾個(gè)功能函數(shù):

(1)WD-Open()--獲得驅(qū)動(dòng)程序(指Windrvr.vxd或Windrvr.sys)的句柄,它實(shí)際上是調(diào)用了Create-File()API函數(shù),在程序開始時(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ù),開發(fā)者在這里加入自己對(duì)硬件的控制代碼。

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

4 具體示例

下面給出一個(gè)用戶模式的具體示例。用VisualC++6編譯調(diào)試通過,在Windows9x和WindowsNT下系統(tǒng)運(yùn)行良好,在Windows2000下也能夠穩(wěn)定運(yùn)行。對(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"http://include/windrvr.h"

#include"http://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];

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

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("打開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('無法鎖定設(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('開始中斷線程\');

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

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

{

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

}

else

{

//callyourdrivercodehere

printf('敲回車鍵不再進(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)行移植。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 計(jì)算機(jī)
    +關(guān)注

    關(guān)注

    19

    文章

    7638

    瀏覽量

    90363
  • WINDOWS
    +關(guān)注

    關(guān)注

    4

    文章

    3609

    瀏覽量

    91091
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    7113

    瀏覽量

    125114
收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Windows基于MSVC搭建libjpeg開發(fā)環(huán)境

    Windows基于MSVC搭建libjpeg開發(fā)環(huán)境
    的頭像 發(fā)表于 06-08 10:23 ?2306次閱讀
    <b class='flag-5'>Windows</b><b class='flag-5'>下</b>基于MSVC搭建libjpeg開發(fā)<b class='flag-5'>環(huán)境</b>

    Windows基于MSVC搭建libusb開發(fā)環(huán)境

    Windows基于MSVC搭建libusb開發(fā)環(huán)境
    的頭像 發(fā)表于 06-08 10:25 ?4257次閱讀
    <b class='flag-5'>Windows</b><b class='flag-5'>下</b>基于MSVC搭建libusb開發(fā)<b class='flag-5'>環(huán)境</b>

    Windows基于MSVC搭建ffmpeg開發(fā)環(huán)境

    Windows基于MSVC搭建ffmpeg開發(fā)環(huán)境
    的頭像 發(fā)表于 06-08 10:27 ?2793次閱讀
    <b class='flag-5'>Windows</b><b class='flag-5'>下</b>基于MSVC搭建ffmpeg開發(fā)<b class='flag-5'>環(huán)境</b>

    Windows基于MSVC搭建SDL開發(fā)環(huán)境

    Windows基于MSVC搭建SDL開發(fā)環(huán)境
    的頭像 發(fā)表于 06-08 10:29 ?1982次閱讀
    <b class='flag-5'>Windows</b><b class='flag-5'>下</b>基于MSVC搭建SDL開發(fā)<b class='flag-5'>環(huán)境</b>

    Windows使用pthread-開發(fā)環(huán)境搭建

    Windows使用pthread-開發(fā)環(huán)境搭建
    的頭像 發(fā)表于 06-08 10:32 ?6559次閱讀
    <b class='flag-5'>Windows</b><b class='flag-5'>下</b>使用pthread-開發(fā)<b class='flag-5'>環(huán)境</b>搭建

    Windows數(shù)字I/O卡控制步進(jìn)電機(jī)的方法實(shí)現(xiàn)

    本文介紹了一種基于Windows通過程序采用數(shù)字I/O卡控制步進(jìn)電機(jī)的方法
    發(fā)表于 04-02 16:07 ?34次下載

    Windows環(huán)境高速數(shù)據(jù)采集系統(tǒng)軟件設(shè)計(jì)

    設(shè)計(jì)了基于工控機(jī)和高速模入板卡的數(shù)據(jù)采集系統(tǒng),介紹了Windows 多任務(wù)多線程環(huán)境,高速同步采集數(shù)據(jù)、存儲(chǔ)與處理數(shù)據(jù)的軟件設(shè)計(jì)方法。根據(jù)系統(tǒng)的特點(diǎn), 采用半滿
    發(fā)表于 08-13 10:35 ?15次下載

    Windows中斷實(shí)驗(yàn)

    Windows中斷實(shí)驗(yàn)一)實(shí)驗(yàn)?zāi)康?#1048698; 了解Windows中斷處理過程􀁺 比較
    發(fā)表于 03-25 10:59 ?1650次閱讀

    Windows環(huán)境硬件中斷的性能分析

    分析了32 位 Windows 系統(tǒng)實(shí)現(xiàn)硬件中斷服務(wù)的內(nèi)部機(jī)理和系統(tǒng)對(duì)中斷信號(hào)的響應(yīng)性能,通過比較多種測試
    發(fā)表于 06-27 10:57 ?26次下載

    Windows CEGPS與PDA串行通信的實(shí)現(xiàn)

    論述了在 Windows CE 嵌入式系統(tǒng)中,利用串口實(shí)現(xiàn)GPS 和 PDA 通信的方法;簡要介紹了Windows CE串行通信基礎(chǔ)知識(shí)以及PDA 與GPS 接收機(jī)的串行連接
    發(fā)表于 06-27 15:51 ?32次下載
    <b class='flag-5'>Windows</b> CE<b class='flag-5'>下</b>GPS與PDA串行通信的<b class='flag-5'>實(shí)現(xiàn)</b>

    ARM9的中斷處理技術(shù)及其在Windows CE實(shí)現(xiàn)的研究

    文中介紹ARM9系列嵌入式微處理器的中斷體系結(jié)構(gòu) ,論述 Windows CE.net 的中斷處理過程 ,并在此基礎(chǔ)上給出基于 EP9301 微處理器的 Windows CE.net
    發(fā)表于 03-14 16:11 ?0次下載

    Windows CE環(huán)境擴(kuò)展串口通信功能的方法

    本文闡述了在Windows CE環(huán)境采用驅(qū)動(dòng)程序擴(kuò)展串口通信功能的方法,并通過具體實(shí)例介紹了驅(qū)動(dòng)程序能夠完成的功能以及具體實(shí)現(xiàn)過程。
    發(fā)表于 04-18 10:02 ?5次下載

    Windows CE實(shí)現(xiàn)串口通信

    文章首先簡單介紹了在WIndows CE下設(shè)備驅(qū)動(dòng)程序的訪問 方式, 然后詳細(xì)介紹了在WIndows CE實(shí)現(xiàn)串口通信的方法和過程。
    發(fā)表于 04-18 14:12 ?6次下載

    Windows環(huán)境使用Redis緩存工具的圖文詳細(xì)方法

    Windows環(huán)境使用Redis緩存工具的圖文詳細(xì)方法。Redis 是一個(gè)高性能的key-value數(shù)據(jù)庫。redis的出現(xiàn),很大程度補(bǔ)償了memcached這類key/value存
    的頭像 發(fā)表于 02-09 14:25 ?4981次閱讀
    <b class='flag-5'>Windows</b><b class='flag-5'>環(huán)境</b><b class='flag-5'>下</b>使用Redis緩存工具的圖文詳細(xì)<b class='flag-5'>方法</b>

    Windows硬件中斷虛擬設(shè)備驅(qū)動(dòng)程序開發(fā)工具和編程方法

    的程序,現(xiàn)在在Windows98就不那么容易實(shí)現(xiàn)了。作為一個(gè)完善的操作系統(tǒng)也必須能控制硬件,象DOS那樣直接與
    的頭像 發(fā)表于 09-20 14:22 ?5030次閱讀
    主站蜘蛛池模板: 天天摸天天看天天爽 | 上课被同桌摸下面做羞羞 | 激情久久久久久久久久久 | 成人在线综合网 | 精品在线一区二区 | 国产操视频 | 天天视频在线观看免费 | 国产一区二区在线观看免费 | 99热这里只有精品69 | 欧美在线bdsm调教一区 | 黄频免费| 亚洲国产日韩欧美在线as乱码 | 手机看片福利永久 | 伊人久色| 丁香视频在线观看播放 | 天堂tv亚洲tv日本tv欧美人tv | 不卡视频一区二区三区 | 久久九九国产 | 99久热成人精品视频 | 美女视频黄免费 | 色色色色网站 | 午夜视频免费国产在线 | 一道精品视频一区二区三区男同 | 欧美城天堂网 | 欧洲熟色妇 | 国产女人在线视频 | 四虎永久在线视频 | 婷婷综合五月天 | 超级毛片| 日韩a一级欧美一级 | 国产女人在线视频 | 日本午夜片 | 日本在线不卡一区二区 | 很黄很黄的网站免费的 | 香蕉成人国产精品免费看网站 | 欧美日韩一日韩一线不卡 | 免费一级毛毛片 | 一级毛片子| 97福利视频 | 亚洲国产成人久久77 | 校园激情综合网 |