各种外设时通过中断和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 系统支持库访问硬件设备,完成对硬件设备的操作