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"//include/windrvr.h"

#include"//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

    文章

    7425

    浏览量

    87722
  • WINDOWS
    +关注

    关注

    3

    文章

    3524

    浏览量

    88441
  • 操作系统
    +关注

    关注

    37

    文章

    6742

    浏览量

    123194
收藏 人收藏

    评论

    相关推荐

    Windows基于MSVC搭建libjpeg开发环境

    Windows基于MSVC搭建libjpeg开发环境
    的头像 发表于 06-08 10:23 1662次阅读
    <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 2871次阅读
    <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 1846次阅读
    <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 1522次阅读
    <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 5594次阅读
    <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 1604次阅读

    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 4748次阅读
    <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 4725次阅读