Windows CE是紧凑的、高效的和可升级的操作系统,它被广泛的应用在各种嵌入式式的产品中,能够满足32位嵌入式式程序开发的需求。
为了支持应用程序在最小的规定的时间之内对设备和系统事件做出反应,Windows CE中包括了高度优化中断传送,优先级和服务系统。
http://a.zimgs.cn/b/200907/01/MDMwMDYyODEyMzc=_1246422302197953.jpg
Windows CE的中断体系是由:硬件中断、内核中断服务例程、OAL中断服务例程和IST程序组成。
系统最低层是硬件及其中断控制器。外围设备向处理器的中断信号线上发送中断信号,这时就产生了中断。
http://a.zimgs.cn/b/200907/01/MDMwMDYyODEyMzc=_1246422323377437.jpg
在Windows CE中,系统的中断分为两种:
软中断:是一种“信号机制”,而不是由软件产生的中断信号。一般来说,软中断是由操作系统内核机制的事件产生的,如:定时器超叫等。
硬中断:通常是外部设备对CPU发出中断信号。
在Windows CE内核中,中断处理分成两部分:
中断服务例程(ISR):通常要求短小精悍,效率要求很严格。它只决定该怎样处理这个中断,一般情况下不应该做太多的工作。
中断服务线程(IST):一旦IST被初始化,系统便准备好接受下一中断并且处理下一中断。IST处理大多数的工作,如:将数据移到缓存等。
Windows CE这种将ISR 和IST在中断程序中,分开处理最终结果是:典型的中断等待时间,被大大地减少了;在中断程序中发生不可接受的延迟的可能性,也大大减少了。
http://a.zimgs.cn/b/200907/01/MDMwMDYyODEyMzc=_1246422346124054.jpg
Windows CE支持两种ISR(中断服务例程):
静态ISR:只能静态地编译进内核,运行时不能改变。与IST通信时,它也只能是单向的,即由ISR到IST。静态ISR支持嵌套中断,并且使用内核堆栈。
可安装ISR:由内核管理程序从动态链接库中加载。和静态ISR不同,它和IST的通信是双向的,多个ISR可以与同一个中断请求相关联,系统按照加载驱动的顺序依次调度。在可安装ISR中,共享内存的使用也比较灵活。
Windows CE中断处理流程:
硬件设备发送中断异常的代码,如果检测到中断异常,异常处理被截获。 中断服务调度程序会调用OAL例程中的OEMInterruptDisable函数。该函数会通知硬件在处理完这一中断前关闭特殊的中断。
异常处理器调用ISR来响应中断。
内核接收到ISR的返回值,得知如何处理这一中断。其响应结果是,忽略掉这一中断不作处理,或准备执行IST。
内核引发中断服务调度程序去唤醒中断服务线程。IST是常规的Win32线程,一旦启动后,它会创建必要的EVENT,然后等待该EVENT被激发。
通过调用PulseEvent函数来激发EVENT,唤醒IST线程运行,IST对中断进行处理。
Kernel调用OEMInterruptDone函数完成此次中断的处理过程
最后,OAL例程通知底层硬件设备重新启用中断。
http://a.zimgs.cn/b/200907/01/MDMwMDYyODEyMzc=_124642237175590.jpg
中断处理的常用函数:
Windows CE在处理中断时,一般涉及到两类函数的使用:
第一类:供OAL调用的ISR函数。
例如:HookInterrupt函数,在OEMInit函数中,被调用以关联IRQ和ISR,UnhookInterrupt函数用来终止IRQ和ISR的关联。
第二类:供驱动程序调用的IST函数。
例如:InterruptInitialize函数,用来将EVENT对象和逻辑中断号关联并允许中断,InterruptDone函数用来通知中断处理的结束。InterruptDisable函数被驱动程序调用,可以关闭中断、同时取消被InterruptInitialize初始化的EVENT对象。
ISR函数属于OAL层,将CPU寄存器中的数据移动到内存缓冲区中,可以进行物理中断号和逻辑中断号的映射。经过ISR之后,就能把物理中断转换成Windows CE标准的SYSINTR_KEYBOARD逻辑中断。内核会根据这个逻辑中断值,找到对应的EVENT,从而唤醒IST。
Windows CE中的中断结构定义完善且易于理解,中断体系结构方面的知识,可以大大加快调查驱动程序和延迟问题的速度。共享中断大大提高了Windows CE的开放性,能够支持不同公司之间以及公司内部的平台应用程序开发方案。
|