已备案个人网站做淘宝客,绚丽网站,厦门模板做网站,2021年不付费黄台软件下载这里我们主要讨论的是CE的中断建立和中断相应的大概流程以及所涉及的代码位置。这里所讲述的#xff0c;是针对ARM平台的。在CE的中断处理里面#xff0c;有一部分工作是CE Kernel完成的#xff0c;有一部分工作是要由OEM完成的。 Kernel代码工作 ExVector.s#xff1a;中断…这里我们主要讨论的是CE的中断建立和中断相应的大概流程以及所涉及的代码位置。这里所讲述的是针对ARM平台的。在CE的中断处理里面有一部分工作是CE Kernel完成的有一部分工作是要由OEM完成的。 Kernel代码工作 ExVector.s中断向量定义里面定义的是armtrap.s的函数地址 Armtrap.s中断处理定义最重要是里面的IRQHandler函数而其中最重要的是CALL OEMInterruptHandler Mdarm.c中断向量加载 Kdriver.cNKCallIntChain函数把IRQ转换为SysIntr值得留意的是pIntChainTable[]是IRQ所对应的ISR处理程序的入口其中最主要的是其成员函数pfnHandler。pfnHandler的填充是在HookIntChain里面这个函数是ISR在初始化的时候调用的。在这个函数里面如果pIntChainTable为空则返回SYSINTR_CHAIN如果pIntChainTable[]不为空则调用pfnHandler得到一个sysintr值然后返回之。 OEM定义工作Oalintr.cOEMInterruptHandler函数通过查询硬件的中断寄存器得到硬件IRQ号。对于EINT04-23的中断通过EINTMASK寄存器得到相对应的系统IRQ。注意这里的IRQ是CE定义的IRQ是系统硬件IRQ的扩展。然后调用NKCallIntChain看看这个IRQ是否是一个Chain的Interrupt。如果函数返回SYSINTR_CHAIN或者返回一个不合法的sysintr则通过OALIntrTranslateIrq把IRQ转化为sysintr。如果是一个合法的sysintr则返回该值。 单一ISR的Device主要通过OEMInterruptHandler处理在OEMInterruptHandler没有定义的IRQ可以在OAL里面或者驱动的加载里面通过HookInterrupt函数进行关联。 多个ISR的Device通常这是总线设备的需求因为总线设备上面通常串有几个设备。这些总线上的设备需要有一个ISR判断究竟是哪个设备发出的中断。这个ISR是一个DLL的程序设备驱动必须在初始化的时候通过LoadIntChainHandler文件名函数名irq加载这个DLL程序。LoadIntChainHandler的定义在kdriver.c的NKLoadIntChainHandler里面。对于大多数的总线设备可以利用微软已经写好的giisr.dll来实现。giisr的实现代码在Public\common\oak\drivers下面。 对于总线设备如果利用GIISR的话原理如下 总线设备驱动在初始化的时候通过LoadIntChainHandler加载GIISR而加载的时候LoadIntChainHandler会调用GIISR的CreateInstance创建一个实例GIISR会返回一个index值给LoadIntChainHandler以标示实例LoadIntChainHandler则会返回一个Handle给驱动驱动则根据这个Handle存取GIISR。得到这个handle之后初始化还需要包括从reg表里面读出相关的初始化参数对GIISR进行赋值譬如Port AddressMask AddressSysIntr等。 驱动程序在初始化的时候 1、创建一个EventCreateEvent 2、然后用InterruptInitialize函数把sysintr和这个Event相关联 3、Kick-off一个ThreadIST 4、这个Thread最终是WaitForSingleObjectEventID 具体的例子可以参阅USBFN的例子sc2410pdd.cpp里面UfnPdd_Start函数 转载处http://space.itpub.net/16918737/viewspace-504351转载于:https://www.cnblogs.com/sql4me/archive/2010/06/21/1762080.html