色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

實現Windows環境下對硬件中斷的控制方法

電子設計 ? 作者:電子設計 ? 2018-11-02 08:05 ? 次閱讀

在計算機控制領域,隨著硬件的發展,一些原本十分復雜的控制算法的設計和仿真變得越來越容易實現。與基于VME、MULTIBUS以及STD總線的平臺相比,基于ISA總線的高性能PC工控機(IPC)無疑是近來應用最為廣泛的主流產品。這主要得益于IPC與PC的軟件兼容性,此外其開放性結構、外圍高性能I/O模板的不斷涌現以及實進工業網絡的迅速發展都為IPC創造了有利的發展環境。可以說,IPC的時代已經到來。此外,在當今的計算機控制領域中,控制軟件是否基于Windows平臺已經成為產品是否有競爭力的重要標準之一。目前基于Windows平臺的相關產品已經占據了市場份額的90%。而Windows 9X和Windows NT憑借其出色的多任務、圖形用戶接口(GUI)、性能優越的硬件兼容性以及卓越的32位軟件環境等性能已經越來越廣泛地被應用于工業控制,成為實現實時控制的優秀平臺。在Windows9x(95、97、98)下,用戶如果需要實現對硬件的中斷、DMA或存儲空間物理地址等資源進行訪問,必須通過設備驅動程序來進行硬件操作;在WindowsNT下,即使是簡單的I/O操作,也需要編寫驅動程序方能與硬件打交道。

兼容X86指令的微機CPU運行時有4個優先級,Ring0~Ring3。操作系統與驅動程序運行在Ring0級,Ring3級,對資源控制受到一些限制。對于Ring0級的驅動程序而言,它的編寫和調試要求程序開發者掌握Windows9x、NT及Windows2000的內核管理機制,對于開發人員來講這有相當大的難度。在這里,使用美國Jungo公司出品的WinDriver工具包,在不更改程序代碼的前提下,完成了在多個操作系統下對硬件中斷的一致處理,很方便地解決了硬件與程序在不同系統下的移植問題。

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

在多任務的環境里,硬件設備中斷管理程序是非常重要的系統級程序。它不僅要把硬件發生的中斷時間傳給相應的驅動程序,還要允許某些設備驅動程序處理它們特殊的中斷服務。在Windows平臺下,VPICD(虛擬可編程中斷控制器)就是這樣的硬件設備管理程序,它負責管理所有的硬件中斷時間。PC機的硬件中斷需要確定硬件中斷的IRQS(中斷申請號),對一個特定的IRQ中斷源,VPICD或提供缺省的中斷處理函數,或允許其它VxD重載中處理函數。

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

2 WinDriver工具包簡介

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

(1)WinDriverWizard

這是一個友好的Windows向導界面。運行WinDriverWizard,然后,選擇“GenerateCode”選項,WinDriverWizard會為你的插卡產生基本的程序代碼。4.2版本以后還提供了多種編程語言選擇,幾乎包括了所有流行的編程語言,如VC4~VC6、Borland C++Builder3~4、Pascal、Delphi、Linuxmake、Solariesmake等等。這就讓用戶不必去學新的編程語言,很容易地直接上手。

(2)公用程序

WinDriver提供了pci_Scan、pci_dump、pci_diag、isapnp-scan、wdreg、wddebug等多個公用程序。pci_scan可以給出安裝的PCI卡及系統為它們分配資源的列表;pci_dump則負責得到已安裝的PCI卡的系統配置信息;pci_diag兼有兩者功能;isapnp_scan為用戶指出了即插即用的ISA插卡的有關信息;wdreg為用戶提供了修改注冊表的工具;wddebug則是一個用于調試用戶程序的有效工具。

(3)大量例程

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

3 WinDriver的驅動程序編程模式原理

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

對于對操作系統內核了解不多的開發者,使用用戶模式,這里要特別注意以下幾個功能函數:

(1)WD-Open()--獲得驅動程序(指Windrvr.vxd或Windrvr.sys)的句柄,它實際上是調用了Create-File()API函數,在程序開始時必須調用;

(2)WD-Close()--釋放驅動程序的句柄,它實際上是調用了CloseHandle()API函數,在程序結束時必須調用;

(3)WD-CardRegister()--負責插卡登記項目的建立和資源分配,資源包括I/O操作,內存分配、中斷處理等。它調用了DeviceIOControl()API函數;

(4)WD-CardUnRegister()--負責插卡登記項目的刪除和資源釋放,與前者相對應,也調用了DeviceIOControl()API函數;

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

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

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

4 具體示例

下面給出一個用戶模式的具體示例。用VisualC++6編譯調試通過,在Windows9x和WindowsNT下系統運行良好,在Windows2000下也能夠穩定運行。對于Windows9x系統,注意將windrvr.vxd拷貝到C:\Windows\System\Vmm32目錄下;對于WindowsNT系統,注意將windrvr.sys拷貝到C:\WINNT\System32\DRIVERS目錄下。Listen_Interupt.C程序框架如下,該程序實現了中斷12的截獲:

Listem_Interupt.c源程序

//應包含的頭文件

#include"http://include/windrvr.h"

#include"http://include/windrvr_int_thread.h"

#include

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

enum{MY_IRQ=12};

//建立全局的WinDriver包柄

HANDLE hWD;

//建立中斷結構

WD_INTERRUPT Intrp;

Static char line[256];

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

VOID interrupt_handler(PVOID pData)

{

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

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

}

//主函數

int main()

{

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

WD_VERSION verVuf;

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

if(hWD==INVALID_HANDLE_VALUE)

{

Printf("打開WINDRVR出現錯誤!\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('無法鎖定設備!');

}

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('開始中斷線程\');

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

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

{

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

}

else

{

//callyourdrivercodehere

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

gets(line);

//這里調用禁止截獲中斷的函數WD_IntDisable()

InterruptThreadDisable(&thread_handle);

}

//釋放所登記的資源

WD_CardUnregister(hWD,&cardReg);

}

//刪除驅動程序的句柄。

WD_Close(hWD);

return0;

}

按照本文給出的技術方案,掌握必要的Windows編程技術,即可以成功地實現Windows環境下對硬件中斷的直接控制,很方便地在不同系統下進行移植。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 計算機
    +關注

    關注

    19

    文章

    7511

    瀏覽量

    88121
  • WINDOWS
    +關注

    關注

    4

    文章

    3552

    瀏覽量

    88824
  • 操作系統
    +關注

    關注

    37

    文章

    6838

    瀏覽量

    123397
收藏 人收藏

    評論

    相關推薦

    Windows基于MSVC搭建libjpeg開發環境

    Windows基于MSVC搭建libjpeg開發環境
    的頭像 發表于 06-08 10:23 ?1739次閱讀
    <b class='flag-5'>Windows</b><b class='flag-5'>下</b>基于MSVC搭建libjpeg開發<b class='flag-5'>環境</b>

    Windows基于MSVC搭建libusb開發環境

    Windows基于MSVC搭建libusb開發環境
    的頭像 發表于 06-08 10:25 ?3132次閱讀
    <b class='flag-5'>Windows</b><b class='flag-5'>下</b>基于MSVC搭建libusb開發<b class='flag-5'>環境</b>

    Windows基于MSVC搭建ffmpeg開發環境

    Windows基于MSVC搭建ffmpeg開發環境
    的頭像 發表于 06-08 10:27 ?1974次閱讀
    <b class='flag-5'>Windows</b><b class='flag-5'>下</b>基于MSVC搭建ffmpeg開發<b class='flag-5'>環境</b>

    Windows基于MSVC搭建SDL開發環境

    Windows基于MSVC搭建SDL開發環境
    的頭像 發表于 06-08 10:29 ?1600次閱讀
    <b class='flag-5'>Windows</b><b class='flag-5'>下</b>基于MSVC搭建SDL開發<b class='flag-5'>環境</b>

    Windows使用pthread-開發環境搭建

    Windows使用pthread-開發環境搭建
    的頭像 發表于 06-08 10:32 ?5768次閱讀
    <b class='flag-5'>Windows</b><b class='flag-5'>下</b>使用pthread-開發<b class='flag-5'>環境</b>搭建

    Windows數字I/O卡控制步進電機的方法實現

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

    Windows環境高速數據采集系統軟件設計

    設計了基于工控機和高速模入板卡的數據采集系統,介紹了Windows 多任務多線程環境,高速同步采集數據、存儲與處理數據的軟件設計方法。根據系統的特點, 采用半滿
    發表于 08-13 10:35 ?15次下載

    Windows中斷實驗

    Windows中斷實驗一)實驗目的􀁺 了解Windows中斷處理過程􀁺 比較
    發表于 03-25 10:59 ?1608次閱讀

    Windows環境硬件中斷的性能分析

    分析了32 位 Windows 系統實現硬件中斷服務的內部機理和系統對中斷信號的響應性能,通過比較多種測試
    發表于 06-27 10:57 ?26次下載

    Windows CEGPS與PDA串行通信的實現

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

    ARM9的中斷處理技術及其在Windows CE實現的研究

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

    Windows CE環境擴展串口通信功能的方法

    本文闡述了在Windows CE環境采用驅動程序擴展串口通信功能的方法,并通過具體實例介紹了驅動程序能夠完成的功能以及具體實現過程。
    發表于 04-18 10:02 ?5次下載

    Windows CE實現串口通信

    文章首先簡單介紹了在WIndows CE下設備驅動程序的訪問 方式, 然后詳細介紹了在WIndows CE實現串口通信的方法和過程。
    發表于 04-18 14:12 ?6次下載

    Windows環境使用Redis緩存工具的圖文詳細方法

    Windows環境使用Redis緩存工具的圖文詳細方法。Redis 是一個高性能的key-value數據庫。redis的出現,很大程度補償了memcached這類key/value存
    的頭像 發表于 02-09 14:25 ?4782次閱讀
    <b class='flag-5'>Windows</b><b class='flag-5'>環境</b><b class='flag-5'>下</b>使用Redis緩存工具的圖文詳細<b class='flag-5'>方法</b>

    Windows硬件中斷虛擬設備驅動程序開發工具和編程方法

    的程序,現在在Windows98就不那么容易實現了。作為一個完善的操作系統也必須能控制硬件,象DOS那樣直接與
    的頭像 發表于 09-20 14:22 ?4769次閱讀
    主站蜘蛛池模板: 偷拍 自怕 亚洲 在线| 欧美动物交ideos| 蜜桃人妻无码AV天堂三区| 十九岁在线观看免费完整版电影| 97超碰在线视频 免费| 久久91精品久久久久久水蜜桃 | 久久re这里精品23| 亚洲AV无码乱码A片无码蜜桃| 攻把受做哭边走边肉楼梯PLAY| 秋霞电影在线观看午夜伦| av老司机色爱区综合| 嗯啊快拔出来我是你老师视频| 中文字幕在线不卡精品视频99| 久久久99精品成人片中文| 在线不卡日本v二区| 久久精品亚洲视频| 2021自产拍在线观看视频 | 芭乐草莓樱桃丝瓜18岁大全| 欧美日韩精品一区二区三区四区 | 芭乐视频免费资源在线观看| 秋霞特色大片18岁入口| 大陆老熟女60岁| 天天躁日日躁狠狠躁AV麻豆| 国产色精品久久人妻无码| 亚洲国产精品高清在线| 精品午夜国产福利观看| 中文字幕无码乱人伦蜜桃| 免费精品国偷自产在线在线| caoporen超碰在线视频| 色男人综合| 好男人好资源在线观看| 尤物yw193can入口| 欧美日韩1区| 国产精品99久久久久久宅男AV| 亚洲国产区中文在线观看| 久久秋霞理论电影| a免费在线观看视频| 我和黑帮老大第365天第2季在线| 娇妻在床上迎合男人| 97国产人妻精品无码AV在线 | 蜜桃视频无码区在线观看|