在wince6.0中,各种外设是通过中断和wince的核心进行通信的。其过程为:
1 . 硬件设备产生硬件中断
2 . OAL完成硬件中断到逻辑中断(SYSINTR)的转换
3 . 系统识别逻辑中断,同时进行相应的处理。
其中。OAL层的中断处理包括以下一些功能:
1. 中断初始化;有函数BOOL BSPIntrInit(void)完成。实现的功能有为相关的寄存器分配虚拟地址,相关中断的初始化,将逻辑中断与硬件中断相关联。
2. 中断使能;有UINT32 BSPIntrEnableIrq(UINT32 irq)完成。完成中断使能的功能、用户添加的中断需要在此添加中断使能的处理。
3. 中断禁止;偶UNIT32 BSPIntrDisableIrq(UINT32 irq)完成。完成中断的禁止的功能,用户添加的中断需要在此添加中断禁止的功能。
4. 中断完成;UINT32 BSPIntrDoneIrq(UINT32 irq) 完成。在中断处理完后调用,完成打开中断的作用,用户添加的中断需要在此添加相应的处理。
5. 中断激活;在中断产生后被调用,完成分配系统中断号的功能,用户添加的中断需要在此添加相应的处理。
最后,当系统发现中断以后,将分为两部分进行处理。为中断服务例程(ISR)和中断服务线程(IST)
中断服务例程(ISR)只负责最简单的功能,即响应设备并返回一个中断标识给操作系统的核心。而对中断的实际处理则不在ISR中实现,对中断的处理被放在了中断服务线程(IST)中。
ISR的主要作用:
1. 如果数据可能丢失或被下一个中断改写,则ISR将数据从设备读取到缓冲区。
2. ISR清除该设备上的中断条件
3. ISR向内核返回一个SYSINTR。
4. 内核设置供IST等待的中断事件
5. 调度程序调度等待的IST以执行后续的中断服务操纵。
IST是运行在用户空间的中断服务线程,它负责接到系统逻辑中断号之后的中断服务处理. IST在运行时首先要注册自己,然后再与一个系统事件关联。用InterruptInitialize注册自己,然后用WaitForSingleObject来等待终端请求事件。
IST实现过程为:
1. 创建一个事件
2. 得到系统 的中断号
3. 创建一个挂起的中断服务线程
4. 设置中断服务线程的优先级别
5. 调用函数InterruptInitialize同时系统注册中断
6. 回复终端服务线程,IST 开始工作。