据
Windows CE 操作系统中的线程的优先级层次安排,0~96 为高实时性程序的线程[2],
再结合绣花机整体系统的任务安排,运动控制系统部分的线程对象的优先级也主要安排在
这个层次。运动控制部分的线程任务根据系统中的模块来划分,其内容和优先级安排如表
1
所示:
为了设置和获得一个线程的优先级,在系统中可以使用 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) ;