为了测定中断响应时间,我们用汇编语言编写了虚拟设备驱动程序来实现对外部中断信号的响应,并设计了一块基于1SA的插件板,用以产生脉冲中断信号送CPIT。其上设有一个高精度定时器8253、一个脉冲频率发生器和一个中断发生器。考虑到硬件匹配的需要我们选用20 MH:的晶振,由它产生的晶振周期是50ns。比如一个主频为500 MHz Pentium处理器的
一个指令周期是2 ns,对于它,使用这个插件板可以大致测量到几十、几百个指令的时阀。设计该程序的思路是这样的:先关闭8253 GATEl,把8253设置在方波发生器模式,写入初始簸0FFFFH;打开8253 GATEl,使定时器开始工作;开中断并触发中断。在中断服务子程序里安排一个关闭8253 GATEl的操作,使定时器停止计数;并读出当前8253计数器中的数值,把初始值减去这个数值的结果再乘以50便是当前系统环境下程序中断响应的时间了。
利用这个方法,我们分别在不同主频和Windows98系统、Windows2000系统的空闲状态下分20次为一组测量,取每组的最大值(即最迟相应时间)如表1所示。
这个实验结果表明,这些响应时间都是微秒级的,使用外围设备的硬件中断来实现实时控制能够达到控制要求。同时我们还注意到同一主频下,Win98比Win2000的响应时间略短一些,我们初步分析认为这是由于系统处理中断过程的差异性造成的。
3 利用Windows多线程技术实现实时多任务
我们把插补计算和位置控制放在前台的实时中断服务子程序中去完成,通过变量和寄存器进行前后台的信息交互。那么剩下的}h作就是组织全软件数控系统后台的处理工作了,这时应当合理充分利用Win-down的多线程技术来展现全软件数控系统控制的灵活性和强大功能。设计中,为便于人机交互的工作,以用户界面线程作为主线程,利用多线程将“CPU资源分时共享”的特点,将有并行要求的模块比如程序编辑模块、参数设置模块、图形仿真模块等置于独立的线程中,实现系统的多任务并行工作。考虑到在信息处理过程的轻重缓急,需要设置线程的优先级别,比如限位报警线程要高于其他线程,加工代码解释及预处理线程要高于图形仿真线程等等。基于进程的不同基础优先级和可能的线程优先级,一共有22个不同优先级值,它们分布在1和31之间,数值越大,优先级越高。
多线程之间须要考虑同步,它有四种方法,分别是:互斥量、临界段、信号量和事件。比如事件同步是通过把事件设置为有或者无信号状态来通知其他线程关于某操作己完成或者仍未完成。线程的具体实现原理是首先在头文件里声明一个事件对象,然后在初始化对话框中使这个事件对象处于无信号状态。下面以手动运行为例说明。当在手动运行按钮事件中无限循环输出脉冲的时候,每次循环都判断这个事件对象是否有信号,如果没有,程序继续运行,如有信号,则退出循环。而使这个事件对象处于有信号状态的操作就在手动复位按钮事件中写出。由于篇幅所限,相关程序代码从略。其程序流程如图2所示。
在辅助线程响应的时候,数控系统最好是要求CPU能快速响应用户发出的消息,所以优先级别应设得较高。可以通过函数Set'ThreadPriority ( HA}DL.E <>hThread , iut nPriority)来设置线程优先级。在这里把nPriority设置成THREAD_ PRIORITY_ HIGHEST,就可以满足系统的实时性要求。
4 结语
在机械制造加工中,数控软件的设计很重要的一个方面是实现连续加工控制的实时性。我们以VisualC++6. 0作为开发工具,在Windows2000平台下,充分利用PC的硬件功能,通过编写VPICD虚拟设备驱动程序来提供实时中断并结合Windows多线程机制较好地解决了全软件开放式数控系统实时控制问题,并对我们己开发的一套数控系统作了这方面进一步的改进,取得了比较明显的成效。