2 系统中断控制
本系统采用基于数据采样法的粗精两级插补结构,插补周期为8 ms,采用中断方式保证通信的实时性。中断信号由CPLD每隔8 ms定时产生。当接收到CPLD的中断信号时,ARM把粗插补计算结果写入CPLD的固定地址。CPLD从固定地址读取数据计算脉冲数,输出脉冲信号,完成运动控制。本系统的中断控制分成3部分:Windows CE中断服务、应用程序中断响应程序和CPLD程序。
2.1 Windows CE中断服务
Windows CE是实时操作系统,其实时性体现在6个方面:(1)具有256个线程优先级;(2)应用程序可以控制提供给每个线程的时间片,计时器精确到1 ms;(3)优先级倒置处理机制;(4)支持嵌套中断;(5)中断延迟时间短;(6)更细粒度的内存管理控制[4-5]。Windows CE以上机制特别是中断体系保证了数控系统的实时性。
Windows CE的中断体系包括核心态的中断例程ISR和用户态的中断线程IST两部分。ISR主要响应中断请求,识别中断源,给操作系统内核返回相应的中断标识。ISR具有最高的优先级。本系统采用ISR完成中断服务。进入ISR以后,系统中所有的同级或下级中断均被屏蔽。为了不降低系统执行多任务的性能,ISR应非常短小精干,以使其他中断也能够获得及时的服务。
定制Windows CE中断服务程序步骤如下:
(1)在操作系统内核中注册事件hMotor,用于操作系统和应用程序中断响应的同步。
(2)在操作系统内核中注册插补中断标识号SYSINTR_PWM_READY。
(3)调用函数InterruptInitialize,使中断请求和hMotor事件挂钩,当接收到中断请求时操作系统自动将事件置为有信号,退出ISR时将事件置为无信号。
(4)编写ISR程序。ISR程序框架如下:
if(IntPendVal==INTSRC_EINT1)//判断中断是否来自CPLD
{
s2410INT|=BIT_EINT1;//清除中断请求
if(PWM_FINISH==TRUE)
return(SYSINTR_PWM_READY);
//向内核返回中断标识号
rADDR=*pulse_buf;//向CPLD写数据
}
当ARM接收到由CPLD发出的中断请求,操作系统将调用ISR,并将hMotor事件置为有信号。在ISR中将粗插补计算结果写入CPLD,并向操作系统内核返回中断标识号。退出ISR时,操作系统将hMotor事件置为无信号。整个ISR程序非常精短,保证了系统其他程序的正常运行。
2.2 应用程序中断响应程序
应用程序无法直接获知是否有中断请求。利用hMotor事件使操作系统中断服务与应用程序中断响应程序达到同步。通过调用WaitForSingleObject函数查询该事件状态,应用程序可获知是否有中断请求并及时响应中断。中断响应程序框架结构如下:
while(!IsEnd)//判断插补是否结束
{
……//粗插补计算
WaitForSingleObject(hMotor,INFINITE);//无限期等待
//hMotor事件状态变为有信号
DeviceIoControl();//向操作系统传递
//粗插补计算结果,即位置增量
}
插补线程启动后进行插补计算,调用WaitForSingleObject函数阻塞插补线程,等待hMotor事件状态变为有信号。当操作系统接收到中断请求后调度ISR,将事件置为有信号。此时WaitForSingleObject函数被返回,插补线程阻塞状态解除。通过调用DeviceIoControl函数将插补结果传递到驱动层,再由操作系统将数据发送到CPLD。插补运算时间远小于插补周期,因此插补线程经常处于阻塞状态。WaitForSingleObject函数虽然会阻塞当前线程,但是不会占用任何CPU资源,因此即使插补线程优先级较高,当其被阻塞时也不会影响其他线程的正常运行。