- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
WINCE驱动开发之中断的使用中断的使用
1、wince中断简介
1: ISR的概念SYSINTR_xx:系统中断或者称逻辑中断号。ISR(interrupt service routine)是处理IRQs(interrupt request line)的程序。Windows CE用一个ISR来处理所有的IRQ请求。当一个中断发生时,内核的异常处理程序先调用内核ISR,内核ISR禁用所有具有相同优先级和较低优先级的中断,然后调用已经注册的OAL ISR程序,一般ISR有下列特征:
1) 执行最小的中断处理,最小的中断处理指能够检验、答复产生中断的硬件,而把更多的处理工作留给IST(interrupt service thread)。
2) 当ISR完成时返回中断IDSYSINTR_xx)(中断ID大部分是预定义的)。????ISROAL层中实现的运行于内核态的程序。根据执行效率要高和嵌入式实时性的要求,ISR多用汇编或者C语言实现,主要任务就是根据硬件中断返回一个逻辑中断号。根据CPU是单个中断入口还是多个中断入口,ISR分为单ISR模型和多ISR模型:
(1)单ISR模型:CPU只有一个硬件中断IRQ入口(如ARM和XScale处理器),所有的中断只有一个ISR入口,在OAL层中有一个统一的函数名:OEMInterruptHandler,在此函数中识别中断源并返回一个逻辑中断号SYSINTR_ID。 如:在BSP的oalintr.h里定义自定义中断的逻辑中断值??????????? #define SYSINTR_MYINTR? (SYSINTR_FIRMWARE + 10)armint.c的OEMInterruptHandler()中
OEMInterruptHandler()
{
…………….
else if (IntPendVal == INTSRC_EINT2)?// EINT2? ? ?return(SYSINTR_MYINTR);
}
(2)多ISR模型:即ISR链(IISR)。CPU有多个硬件中断IRQ入口(如X86),它通过内核HookInterrupt函数将硬件中断号与ISR绑定起来,注册一个ISR,使多个硬件中断形成对应的ISR链,反之通过内核UnhookInterrupt函数解除硬件中断与ISR的绑定,此时无OEMInterruptHandler函数。HookInterrupt函数的调用一般在OEMInit硬件初始化函数中进行,在多ISR模型中,当一硬件中断发生时,核心跳转到OAL层的主ISR,跳转的开销会非常小,原因是系统使用了少量的装配指令,主ISR可以直接处理中断,返回SYSINTR_ID逻辑中断号。或者调用NKCallIntChain函数遍历已安装的ISR列表,已安装的ISR确定是否是注册了的硬件中断,如果是系统已注册的中断,查询中断源返回SYSINTR_ID,激活IST。如果是未注册的硬件中断,直接返回SYSINTR_NOP。
2:中断注册步骤
1) 用SETUP_INTERRUPT_MAP宏关联SYSINTR和IRQ。以“SYSINTR_”为前缀的常量由内核使用,用于唯一标识发生中断的硬件。在Nkintr.h文件中预定义了一些SYSINTR,OEM可以在Oalintr.h文件中自定义SYSINTR。\wince\WINCE500\PUBLIC\COMMON\OAK\CSP\X86\OAL\cfwpc.c文件的OEMInit()中,g_Sysintr2IntrMap和g_Intr2SysintrMap就是物理中断和逻辑中断对应的表,g_Sysintr2IntrMap[SysIntr]的值是逻辑中断SysIntr所对应的物理中断Irq,而g_Intr2SysintrMap[Irq]的值则是物理中断Irq所对应的逻辑中断SysIntr,OEMInit()中先用SETUP_INTERRUPT_MAP宏cfwpc.c还有OEMTranslateIrq(DWORD Irq),它是得到指定物理中断的逻辑中断,如果这个物理中断之前没有被映射,它还会建立这个映射。OEMTranslateSysIntr(DWORD SysIntr)它是得到逻辑中断所对应的物理中断。OEMRequestSysIntr(DWORD Irq)它会自己搜索一个可用的没有被占用的逻辑中断号,然后把这个物理中断映射到这个逻辑中断上去。并返回这个被映射好的物理中断的逻辑中断。在driver中调用KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR,g_Irq,sizeof(UINT32),g_SysIntr,sizeof(UINT32),NULL)动态申请逻辑中断号时候,OAL层就是调用的这个O
文档评论(0)