0 引 言
数控系统是一种典型的工业控制软件,其系统的实时检测以及控制时序都需要时间基准。尽管Windows操作系统因其具有强大的功能和友好的通信用户界面,而使得它不仅被广泛的用作管理事务型工作的平台,也被工业领域的工程人员所关注。但Windows系统顶层的应用程序并非是基于优先级来调度任务的,无法立即响应外部事件的中断,因此也就不能满足工业应用环境中实时事件处理和实时控制应用的要求,因此如何在Windows环境下实现实时控制是实现大多数实时系统的关键。本文归纳了Windows环境下实时操作系统实现的几种方案,并通过分析比较,提出了线接触加工数控系统中实时控制的解决方案——引入外部高的定时时钟,在Windows环境中编写WDM程序来响应高定时时钟,从而实现线接触加工数控系统的强实时控制问题。
1 Windows 2000操作系统进行实时控制的解决方案
在Windows 2000操作系统环境中进行实时控制时,根据对定时以及实时性要求不同,通常可采用以下几种方法。
1.1 利用Windows系统提供的常规定时器及多媒体定时器
PC机中,的定时间隔是55 ms申请中断请求。在一般的应用软件开发平台上都提供了一个具有定时功能的Timer控件用于响应这个中断,如C++Builder中的Timer控件,用户可以通过Windows提供的API函数SetTimer和KillTimer来实现定时,但是由于系统时钟的限制,采用这种方式所获得的时钟周期是不会超过55 ms的。同时这些常用的定时器事件也是由消息机制驱动的,定时消息被放在消息队列里与其他消息一起排队,而定时消息的优先权很低,一旦遇到系统比较忙时,就有可能在消息队列里同时阻塞很多条定时消息。Windows系统对定时消息的处理是:当在队列中同时有几条时间消息时,系统就会丢弃其他的时间消息,而仅仅处理其中的一条定时消息。由此可见,利用系统提供的定时器只能处理一些对定时、实时控制要求不高的情况。另外也可以利用Windows操作系统中mmsystem.dll多媒体扩展库提供的定时器,它是利用设置定时器回调函数TimeSetEvent,定时时间一到,系统就会调用回调函数,从而实现定时。定时回调函数是通过挂接定时中断来实现的,从而避开操作系统的消息驱动机制。采用这种方法可以获得1 ms的定时。
1.2 利用系统定时中断
利用PC机中8254定芯片产生的中断请求0获得定时间隔。操作系统在工作时,工作时钟主要由PC机的8254时钟芯片提供。8254.共有三个独立的16位计数器,计数器0,1,2的地址分别是40H,41H和42H,43H是控制寄存器的端口地址。其中计数器0为日时钟的中断源,同时也是系统的定时中断源。在系统加电后,:BIOS对8254初始化,设置计数器0的初值为0,脉冲输出方式是方式3(输出方波脉冲)。这样,就可以在输出端得到频率为f=1.913 18 MHz/65 535=18.2 Hz(其中1.913 18 MHz是8254时钟输入端的输入脉冲频率,65 535是16位计数器的计数宽度)的方波输出脉冲作为输出中断频率,即每隔55 ms提起中断请求,CPU响应后转入日时钟中断处理程序,即中断请求0的中断服务程序。
通过上面的分析,要想获得高的定时时钟,可以通过两步实现:首先,根据需要修改8254计数器0的计数初值,从而改变计数器0的输出时钟中断频率。然后通过修改中断请求0中断服务程序的中断地址,将中断请求0挂接到中断服务程序上。
具体挂接中断服务程序的办法是通过编写WDM驱动程序,修改IDT(Interrupt Descriptor Table)中断描述符表。IDT是定义硬件中断映射的表,其工作原理类似于MS-DOS环境中的中断向量表,它在内存中的地址是从0000:0000开始,每个表项共占4个字节,共有8 192个中断描述符,但是CPU能够利用的只有前面的256个。在Windows 2000操作系统中这些IDT表项及其所对应的中断地址可以通过在SoftICE中执行IDT指令显示出来。当中断到来时,要执行中断服务程序,可以通过将IDT中8号中断对应的中断服务例程地址改为中断服务程序所在的地址。硬件中断发生的时候,CPU就会直接把控制权交到IDT的相应ISR中去运行。
通过修改8254.定时器0的定时初值,并挂接中断服务程序,可以获得一个稳定的时钟中断。但是由于8254定时器除了提供系统的日时钟中断源外,还是系统工作的定时中断源,当把中断请求0挂接到中断服务程序上时,为确保系统稳定工作,必须保存原来系统的中断服务程序地址,当8254计数器0的定时时间达到55 ms时,必须将中断请求8的中断服务程序地址恢复为原来的中断服务程序地址,以完成系统定时需要。这种通过修改中断服务程序地址的方法获得高的定时中断,由于涉及到系统工作的定时中断源,一旦处理不当,很容易使系统工作不稳定,严重时会造成系统的崩溃。
Windows 2000操作系统中要获得高的定时中断,可以通过修改CMOS实时时钟的方法来获得,即利用PC机的中断请求8来获得。在Pc机中都存在一个CMOS实时时钟芯片,该时钟由于采用的是独立晶振、用独立的电池供电,因此可以永不间断地运行。它的主要功能是为系统提供备用时钟、三个可屏蔽的中断和一个通用的中断输出、可编程方波发生器等。另外,它与操作系统相互独立,修改它的定时中断频率对操作系统工作的影响不大,所以,通过修改CMOS中断频率的办法可获得与前面利用系统定时中断相比较,更可靠、更稳定的高定时时钟中断。
PC机的CMOS实时时钟一般采用MC146818芯片,该芯片上包含了一个实时时钟和一个64 B的CMOS内存。在这64个字节的内存中0~0DH是与实时时钟相关的信息,0E~3FH中包含的是关于计算机的硬件配置信息。其中CMOS内存的地址口的地址为70H,数据口的地址为71H。实时时钟有4个状态寄存器A,B,C,D。其中寄存器A主要功能是用来开启、关闭振荡器,并选择不同的输出频率,它的具体位定义如表1所示。寄存器B用来控制实时时钟各种功能的使能状态等。寄存器C与D是只读寄存器,寄存器C主要是提供各种中断状态标志位。因此,当设置好A,B寄存器后,要想读出CMOS内存的数据,只需将要读数据所在内存地址送到70H,再从71H中将数据读出即可,向CMOS内写入数据的过程正好与上面的操作相反。
表2列出了寄存器A的周期性中断速率和方波输出频率,可以看到,通过修改CMOS实时时钟的A寄存器选择不同的方波输出频率,其输出速率可达到122μs。与上面利用系统提供的中断请求0相比较,IRQ0是每隔55 ms中断,而IRQ8因为用的是自己的晶振,中断频率则要高很多,软件上的实现上同前面利用系统定时中断中的方法相同,即通过编写WDM驱动程序,修改中断描述表(IDT),然后通过hook挂接中断服务程序,从而抢先实现任务。
1.4 引入外部定时中断
在Windows 2000操作系统下要获得高定时时钟还可以通过引入外部定时时钟的方法。即在PC机的外部提供一个高的时钟,在PC机的内部,在Windows 2000操作系统下,通过编写WDM程序的方式来响应这个外部的中断。
通过对这几种实时控制方案解决方法的分析,可以看到,利用Windows系统提供的常规定时器及多媒体定时器,其定时太低,无法满足数控系统对高定时时钟的需求;利用系统的定时时钟,一旦处理不当,很容易使系统工作不稳定,因此不适合于数控系统对控制可靠性的要求;通过修改CMOS实时时钟的方法来获得高的定时时钟,因为受到输入晶振频率的限制,其输出频率也只能可达到122μs,仍然无法满足数控系统对较高加工速度的要求。
综合以上原因,本文提出通过ISA总线引入外部时钟的方法来获得高、稳定的定时中断。在程序上通过编写WDM驱动程序来响应该时钟中断。利用这种方法完全避开了依靠操作系统提供的中断的弊端。采用这种方法有两点好处:首先,利用外部提供的时钟,其时钟的频率可以根据实际的需要提供,也就是说可以灵活地提供所需要的任何频率的定时时钟。其次,利用外部定时中断提供高的定时时钟与利用PC机系统提供的定时时钟相比较,可避免使用不当而导致的系统工作不稳定。
2 线接触加工数控系统高定时时钟的解决
通过对Windows操作系统下高定时时钟引入方法的分析,采用了第四种方法,即通过引入外部定时时钟中断的方法,在操作系统的内部通过编写系统WDM程序来响应这个外部中断。图1是线接触加工数控系统高定时时钟解决方法的方框图,即在PC机的外部提供一个高的定时中断源,在PC机一侧则是利用ISA总线通过中断IRQ5接入PC机,在Windows操作系统内部通过WDM程序响应这个外部中断。
为了方便试验以及测试需要,选用了华邦公司生产的W77E58单片机来产生不同频率的时钟。W77E58是与Intel51系列单片机完全兼容的8位单片机,但是它比51系列单片机的工作速度更快。该单片机一个机器周期仅需要4个时钟周期,外接晶振频率为40 MHz。经计算这种单片机的单周期指令仅需要O.1μs,通过如下的循环指令很容易就实现1μs的定时周期。
输出的中断脉冲如图2所示。在上面的循环指令中插入适当个数的Nop指令便可以得到一系列小于1 MHz时钟的输出脉冲。
将上面输出的方波脉冲作为外部中断经过ISA总线连接至中断请求IRQ5以此作为线接触加工数控系统的基准中断时钟。为了试验的需要,本文将单片机输出的时钟连接到了ISA总线的几个不同的中断上,并另外做了一个小的键盘用来选择ISA总线上不同频率的时钟源。
为了能够使系统实时响应外部的IRQ5中断,必须通过编写Windows操作系统下的设备驱动程序。WDM驱动程序是*.sys系统驱动程序。在WDM程序中对中断的响应可以通过下面的方法实现:
该WDM设备程序是非即插即用的ISA驱动程序,因此驱动程序的资源分配必须在.inf文件中进行。线接触加工数控系统对资源的分配是在.inf文件的资源分配中按下面的方式分配端口资源和中断资源的:
3 结 语
在Windows操作系统结构理论的基础上,研究了Windows 2000操作系统下实现实时性控制的几种解决方案,并对这几种方案进行了具体的分析比较,提出了适合于数控系统的的实时控制方案——引入外部定时中断的方式,并具体研究了此方法的实现过程,同时用实验手段验证了线接触加工数控系统,终实现了控制系统的极限加工进给速度可达到1 500 mm/min,系统的脉冲当量是0.037 μm。
评论
查看更多