摘 要 阐述了Windows 95 的中断原理,介绍了采用VxD实现中断处理的方法。通过在电火花数控系统中的应用,证明了该项技术的实用与可靠。
关键词 VxD 中断 电火花数控系统
Abstract In this paper,the principle of interrupt for Windows 95 is presented,and the method of handling interrupt, which is based on VxD, is introduced. It is demonstrated that this technology is reliable and useful in the application of NC for EDM.
1 前言
近年来,在Windows 95 平台上进行数控软件的开发是数控产品更新的标志和趋势。利用Windows 95 丰富的资源,可方便地生成各种菜单及数控指令编辑软件等,产品的开发周期短。而且,利用Windows 95 是多任务操作系统的特性,在保证前台加工任务准确按时完成的情况下,还可执行在线监测、故障诊断等任务,充分发挥主机的性能。
目前,国内数控电火花成形机控制软件的操作平台一般采用DOS 系统或 16 位的Windows 3.X系统,而国外如阿奇公司等已采用 Windows 95系统作为其控制软件平台,使软件的数据库和网络等功能得到很大的提高,用户使用效果很好。另外,基于 Windows 95 的 CAD/CAM 软件及其他工具软件很多,为了增强控制软件的功能,在 Windows 95 平台上开发电火花数控系统控制软件是很有必要的。
事实上,在电火花数控系统的开发中,常需实时采集一些状态信息,通过接口板将信号传送给主机,主机则通过中断方式接受数据来实现实时的测量和控制。而 Windows 95 是消息驱动的多任务环境,各种消息都按它们到达的先后顺序排队处理,消息机制是不分任务轻重缓急的,若无中断设置,仅凭消息机制,不能保证数控前台控制任务在准确的时间内执行。因此,要想解决这个问题,必须实现 Windows 95 的中断处理。
2 Windows 95的中断原理与实现
关于 DOS 和 16 位的Windows 3.X 的中断原
理和机制方面介绍的资料很多,实现起来相对容易,不再赘述。这里着重阐述Windows 95 的中断原理,并简要介绍其实现方法。
众所周知,Intel 的 8086CPU 系列芯片规定了0、1、2和3四个级别的执行代码可信度(即ring 0~3级),Windows 95 中只用到了0级和3级。执行ring 0级的代码,可直接对硬件、中断和文件系统进行物理访问,仅有操作系统及其部件被允许在 ring 0 级内执行。而应用程序的代码只在可信度最低的 ring 3 级内执行,其访问硬件和自身进程空间以外的内存能力受到限制。
通常,在 Windows 95 下可用两种方法实现中断,一种是编写 DLL 程序,另一种是使用虚拟设备驱动程序(VxD)。二者的区别在于:VxD 是作为操作系统的组件运行于 ring 0级的,而DLL程序运行于 ring 3级。事实上,VxD 也被认为是一个32位保护模式下的可执行 DLL。应明确的是 VxD 运行在虚拟机管理器 (VMM) 控制之下,VMM 是位于最底层的操作系统部件(VMM 包含了所有基本的系统功能,如任务调度、虚拟内存操作、程序装入及终止、任务间通讯等,此外,还负责处理主要的中断及例外情况)。硬件设备在数据准备好后就发中断信号,但 VxD 并不直接截获这些中断信号,而是依赖于虚拟可编程中断控制器 (VPICD) 来硬件中断。 VPICD 可以将硬件中断映射到其它设备,向其它设备提供服务,通过这些服务允许虚拟设备请求中断,并可在 VMM 中模拟硬件中断信号。由于 Windows 95 系统多任务在硬件上就是通过硬件的虚拟化来实现的,利用这种方法来实现较高的定时精度符合 Windows 95 系统本身的原则,简单方便且有利于 Windows 95 系统的稳定。见下图。
VxD运行过程图
因此,目前在 Windows 95 系统下实现较高精度的实时控制,一般采用编写VxD 程序来实现。实现定时的方法如下:
(1)采用 Windows 系统本身所提供的虚拟定时器的 API(VTDAPI)。应用程序必须首先得到 VTDAPI的入口地址,再通过功能 VTDAPI-Begin-Int-Period 来设置中断周期,最后可用功能 VTDAPI-Start-User-Timer 启动定时器,声明一个将被周期调用的回调函数。需要指出的是 Windows 95 系统中可注册32个这样的定时器。
(2)采用虚拟定时器设备虚拟硬件定时器,提供别的虚拟设备用来建立时钟的中断率服务或捕获一个给定的虚拟设备 I/O 端口的禁止或开放。首先通过功能VTD-Begin-Min-Int-Period 设置系统中断周期。然后可通过功能 VTD-Enable-Trapping 和 VTD-Disable-Trapping 来强迫定时设备禁止或开放端口。通过功能 Set-VM-Time-Out 启动定时器,配合相应函数完成所要求的实时控制任务。实际上,对于外部的物理中断,同样可采用这种方法。
为了说明虚拟设备的中断控制,首先介绍一个数据结构,定义如下:
STRUCT VPICD-IRQ-Descriptor {
WORD VID-IRQ-Number; ∥虚拟设备申请的 IRQ 数
WORD VID-Options; ∥初始化为0
DWORD VID-Hw-Int-Proc; ∥用户中断处理程序的地址
DWORD VID-Virt-Int-Proc; ∥虚拟中断处理程序地址
DWORD VID-EOI-Proc; ∥物理中断结束后调用函数的地址
DWORD VID-Mask-Change-Proc; ∥中断屏蔽地址
DWORD VID-IRET-Proc; ∥中断请求地址
DWORD VID-IRET-Time-Out; ∥中断请求的最大时间,500ms
PVOID VID-Hw-Int-Ref; ∥用户中断参数 };
虚拟设备中断控制的处理过程如下:首先,用户通过 CreateFile()函数装载VxD,系统向 VxD 发送 DEVICE-DYNAMIC-INIT 消息,调用对应的初始化程序。然后,执行中断处理程序,它的步骤是调用 VPICD-Pyhs-EOI 结束物理中断,调用 VPICD-Set-Int-Request 设置虚拟中断,进行中断处理,调用VPICD-Clear-Int-Request 清除虚拟中断,调用VPICD-Virtual-EOI 结束虚拟中断。当用户通过 CloseHandle()函数卸载 VxD 时,系统向 VxD 发送 DEVICE-DYNAMIC-EXIT 消息,控制处理程序调用对应的退出处理程序。
了解了虚拟设备中断控制过程的原理,就可方便地使用 VxD 实现中断处理。目前,具有代表性的 VxD 开发工具包括: Microsoft 公司出品的设备驱动程序开发包 DDK,该产品出现较早,使用的范围也较广,但要求开发人员具备一定的汇编语言基础,工作量较大。Vireo Software 公司开发的用于编写设备驱动程序的工具包 VtoolsD,它包括一个 VxD 代码生成器 Quick VxD、可加载和卸载 VxD 的工具 VxDLoad,可给出系统已加载 VxD 信息的 VxDView,以及 ANSI C 运行库、VMM/VxD 服务库、VxD 的 C++类库。VtoolsD 除了能工作在 Windows95 环境下,还具有很强的开发能力及较高的开发效率,是个相当优秀的软件包。另外,KRFTech 公司出品的编写设备驱动程序的工具包 WinDriver 也是一个不错的开发工具,与 VtoolsD 一样,可使编程人员用 C++语言来编写设备驱动程序,而不是将大量精力放在编写那些复杂、难于调试的内核模式代码上,从而使用起来方便可靠。
3 VxD 在数控系统中的一个应用
在我们研制开发的电火花成形机数控系统中,对主轴的伺服控制要求很高,因此需要相当高的实时性。采用 Windows 95 操作系统之后,必须解决实时性问题,为此编制了 VxD 程序。限于篇幅,只能结合功能简单介绍一下其实现过程。
根据设计方案,采用 IRQ10 作为硬件中断信号,中断源由外部硬件定时器提供,设定为 1ms。使用 VtoolsD 中 VxD 代码生成器 Quick VxD 自动生成一个 VxD 框架。在其中添加自己的代码,如硬件中断处理函数:
VOID MyHwInt::onHardwareInt(VMHANDLE hVM)
{
InterruptHandling(); ∥中断处理函数,包含了具体要实现的控制任务
sendPhysicalEOI();
ClearCarry();
}
VxD 程序动态加载和卸载函数:
BOOL MyintDevice::onSysDynamicDeviceInit()
{
pMyIRQ=new MyHwInt();
if(pMyIRQ&&pMyIRO->hook()){
pMyIRQ->physicalUnmask();
return TRUE;
}
else return FALSE;
}
BOOL MyintDevice::onSysDynamicDeviceExit()
{
pMyIRQ->physicalMask();
delet pMyIRQ;
return TRUE;
}
VxD 与主程序之间的通讯函数:
DWORD MyintDevice::OnW32DeviceIoControl(PIOCTLPARAMS pDIOCParams)
{…
switch(pDIOCParmas->dioc-IOCtlCode){
case 111:
…
break;
default:
break;
}
return 0;
…
}
等等。
通常情况下,源代码直接用 VC++就可编译通过,生成需要的 VxD。如需要调试的话,采用 Numega Technologies 公司的 Soft/ICE for Windows 95 工具软件来调试 VxD 相当方便。
实践证明,使用 VxD 之后,再结合一定的伺服策略,很好地解决了主轴的伺服控制问题,加工精度得到可靠保证,而且系统的稳定性也很好,经长时间考机后,没出现任何异常。
4 实时控制应用程序的发展趋势
由于 Windows 系统的硬件不透明性,使得一般用户要完成一定硬件操作具有较大的难度。鉴于 VxD 和 VMM 已成为 Windows 95 的系统核心,VxD 的设计业已成为实时控制应用程序的关键技术。
另外,Microsoft 公司为了满足工业上一些实时控制的要求,特别于 1999 年 6 月推出了实时操作系统 Windows CE。
我们知道,对于一个实时操作系统来讲,有三个关键的参数,即中断由操作系统和设备驱动程序屏蔽的最大时间、设备驱动程序处理中断的最大时间和从中断开始到任务执行的中断延迟时间,Windows CE 系统中这三个参数限值的参考值均在微秒级,这对于现在的一些控制要求基本能满足。由此看来,基于 Windows CE 系统的实时应用程序的开发,将成为可能。