background image

Windows CE 操作系统中的线程的优先级层次安排,0~96 为高实时性程序的线程[2],

再结合绣花机整体系统的任务安排,运动控制系统部分的线程对象的优先级也主要安排在
这个层次。运动控制部分的线程任务根据系统中的模块来划分,其内容和优先级安排如表

所示:

        为了设置和获得一个线程的优先级,在系统中可以使用 CeSetThreadPriority()和
CeGetThreadPriority()函数来实现。线程创建完其优先级也被确定下来。

3.2 线程之间的协调与通信
      在多线程系统中,同步不同线程的活动是很重要的。WindowsCE5.0 提供了多种方法来
实现线程之间的协调和同步,有信号量(

Semaphore)、临界区(Critical Section)、事件

Event)、互斥体(Mutex)、对点的消息队列等。各个方法都有各自的特点和适用的场合。

在设计中的运动控制系统中,线程同步主要用的是事件和中断来实现的。
3.2.1 事件 Event 的应用
      事件是用的比较广泛的同步对象,如果一个线程需要通知其它线程某个时间发生,可以
使用事件(

Event)同步对象,前一个线程给时间发送一个通知信号,其他对事件发生感兴

趣的线程一般调用等待函数在时间上等待。初始化线程将事件设置为无信号状态后开始进行
初始化。当初始化完成后,线程把事件设置为有信号态,通知下一个线程来完成余下的工作。
在运动控制系统中主要定义了以下事件:
      Event_EncoderA       //编码器 A 相计数事件, 标志主轴电机所在位置(100°和 220°)
      Event_MotorX        //X 轴电机移动事件,标志 X 轴电机运行完。
      Event_MotorY        //Y 轴电机移动事件,标志 Y 轴电机运行完。
      Event_EncoderZ        //编码器 Z 相中断事件,标志电机旋转完一周。
      Event_Limit        //限位中断事件,标志绣框越界。
      事件创建采用 CreateEvent()函数来实现,同时再创建好事件后要对其进行初始化。
3.2.2 运动控制系统中断处理
      在运动控制系统中,中断处理是重要部分。事件的创建也是为中断处理准备的,中断响
应是根据事件触发来实现的。中断源的配置是由

 Windows CE 中的 OAL(OEM 适配层)操

作的

[3][5],OAL 将物理中断号映射成逻辑中断号,并关联具体的事件。实现方法如下面的

两个步骤:
            ( 1 ) 申 请 g_  Count1sysint  为 IRQ_EINT8  的 逻 辑 中 断 号 :KernelIoControl 

IOCTL_HAL_REQUEST_SYSINTR,&IRQ_EINT8,sizeof(UINT32),&g_Count1sysint,size

of(UINT32), NULL) ;