Windows CE陷阱调度机制
大多数硬件中断允许设备驱动程序注册其设备的ISR,包含内核所需的设备ISR与中断特定级相联系的所有信息,包括ISR的地址、设备中断的IRQL以及与ISR相联系的内核入口。当中断对象被初始化后,称为调度代码的一些汇编语言代码指令就会被存储在对象中。当中断发生时,这些代码会调用真正的中断调度程序,并传递一个指向中断对象的指针。中断对象包含了第二个调度程序例程所需要的信息,以便定位和正确地调用设备驱动程序提供的ISR。需要两步过程的原因是自硬件完成初始调度后,没有方法可以在初始调度上传递一个指向中断对象的指针。 (3)软件中断 软件也可以产生中断,包括:启动线程调度、处理定时器到时、在特定线程的描述表中异步执行一个过程,以及支持异步I/O操作等。例如,内核可以发布启动线程调度的软件中断,内核也可以禁用中断以使处理器不被中断,但这种情况很少出现,只在处理中断或调度异常的关键时刻才这样做。软件中断由中断调度程序的子模块响应,它确定中断源并将控制转交给处理中断的外部例程(ISR),或转交给响应中断的内核例程。 三.Windows CE如何进行中断处理? (1)Windows CE中断处理流程 ①硬件设备向Kernel发送中断异常的代码,如果检测到这个中断异常,就会被Kernel层的异常处理所截获。然后,中断服务调度程序会调用OAL例程中的OEMInterruptDisable函数,这个函数会通知硬件在处理完这一中断前关闭特殊的中断,但其它的中断仍然处于开放状态,中断服务例程ISR会被调用来决定如何处理这一中断。 ②Kernel接收到ISR的返回值可得知如何处理这一中断。它的响应结果之一是忽略掉这一中断不作处理(SYSINTR_NOP),或另一结果是准备执行IST。然后,Kernel引发中断服务调度程序去唤醒中断服务线程。IST是常规的Win32线程,一旦启动后,它会创建必要的EVENT,然后等待该EVENT被激发。中断服务调度通过调用PulseEvent函数来激发EVENT,从而唤醒IST线程运行。当唤醒以后,IST会对中断进行处理。 ③当IST处理完成后,还需要调用InterruptDone函数通知Kernel。Kernel则调用OEMInterruptDone函数完成此次中断的处理过程。最后,OAL例程通知硬件设备重新启用中断。 (2)中断处理涉及的几个常用函数 Windows CE在处理中断时会涉及到两类函数的使用,第一类是供OAL调用的ISR函数,例如HookInterrupt函数在OEMInit函数中被调用以关联IRQ和ISR,UnhookInterrupt函数用来终止IRQ和ISR的关联。第二类是供驱动程序调用的IST函数,例如InterruptInitialize函数用来将EVENT对象和逻辑中断号关联并允许中断,InterruptDone函数用来通知中断处理的结束,InterruptDisable函数被驱动程序调用以关闭中断同时取消被InterruptInitialize初始化的EVENT对象。 ISR函数属于OAL层,它将CPU寄存器中的数据移动到内存缓冲区中,但是它不能做更多的工作,其中一个原因是它不能访问用户态的存储区,它要把这些工作交给IST来完成。ISR函数做的另一项工作是进行物理中断号和逻辑中断号的映射。经过ISR后,就能把这一物理中断转换成Windows CE标准的SYSINTR_KEYBOARD逻辑中断。Kernel会根据这个逻辑中断值找到对应的EVENT,从而唤醒IST。 最后,需要提醒一下的是,常常有一些开发人员习惯拖延或忽视陷阱调度的编写。因为轻视陷阱调度这一坏习惯是如此常见,它甚至已经影响到了Windows CE系统的研发。因此,建议从开始时就应该着手进行陷阱调度研发和计划,应该投入大精力把陷阱调度的策略融合到嵌入式产品中。
- 深入剖析MFC中Windows消息处理机制(04-11)
- TMS320C54x系列DSP的中断机制(08-08)
- 记录仪实时多任务调度策略的研究(07-16)
- 基于Nios II自助点菜系统的μC/GUI应用(06-05)
- 变频器伺服电机的几种制动方法(12-12)
- STC11F04单片机制作的32灯摇摇棒(11-30)