各种外设时通过中断和wince核心进行通信的。过程是:

1)硬件设备产生硬件中断

2)OAL完成硬件中断到逻辑中断(SYSINTR)的转换(OEMinit函数实现)

3)系统识别逻辑中断,同时进行处理。

分两步:中断服务例程(ISR)和中断服务线程(IST)。

ISR主要负责中断响应,一般要求短小精干,对执行效率有很高的要求,只负责最简单的工程,即响应设备并返回一个中断标示给核心。而对中断的实际处理则在IST中。

ISR的主要作用:

1 如果数据可能丢失或者被下一个中断改写,则ISR将数据从设备读到缓冲区

2 ISR清除设备上的中断条件

3 ISR向内核返回一个SYSINTR

4 内核设置供IST等待的中断事件

5 调度程序调度等待的IST以执行后续的中断服务操作。

ISR分为静态ISR和可安装的ISR。

静态ISR只能静态被编译到核心,在运行时不能改变,和IST通信是单向的,ISR-IST,支持中断嵌套,可以使用核心的堆栈。

可安装的ISR由内核管理程序从DLL中动态加载,是由IST-ISR,多个ISR可以同一个中断请求相连,按加载驱动的顺序进行调度,共享内存的使用比较灵活。

 

IST是运行在用户空间的中断服务线程,负责接到系统逻辑中断号之后的处理,使用中首先要注册自己,再与一个系统事件关联。

一般来说,使用InterruptInitialize函数注册自己,使用WaitForSingleObject函数来等待终端请求事件。系统调度器会调度这个线程来进行中断的处理。

流接口驱动一般在XXX_Init里面做这些事情,IST是Device。exe的一个附属线程。

具体实现过程是:

1 创建一个事件

2 得到系统的中断号

3 创建一个挂起的中断服务线程(IST)

4 设置中断服务线程的优先级别

5 调用函数InterruptInitialize通知系统注册中断

6 回复中断服务线程IST,IST开始服务

 

最后总结下WINCE6的中断发生和处理过程:

1 硬件设备产生中断信号

2 中断信号被异常处理程序(ExceptionHandle)捕获

3 异常处理程序激活挂载中断服务例程ISR

4 ISR响应硬件,并操作硬件设备

5 ISR将中断映射

6 ISR设置相应的核心中断标示

7  中断服务调度程序与OAL例程合作,设置中断事件,操纵在特定中断事件上的等待队列

8 OAL操作硬件,改变硬件的中断状态,将其设置为开中断

9 中断事件激活系统调度程序, 在相隔一段时间以后调度中断服务线程

10 IST处理中断的相关事件,并调用系统的支持库

11 系统支持库访问硬件设备,完成对硬件设备的操作