欢迎来到天天文库
浏览记录
ID:20538192
大小:29.00 KB
页数:4页
时间:2018-10-12
《wince中断使用》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、WinCE中断的使用1、wince中断简介1:ISR的概念ISR(interruptserviceroutine)是处理IRQs(interruptrequestline)的程序。WindowsCE用一个ISR来处理所有的IRQ请求。当一个中断发生时,内核的异常处理程序先调用内核ISR,内核ISR禁用所有具有相同优先级和较低优先级的中断,然后调用已经注册的OALISR程序,一般ISR有下列特征:1)执行最小的中断处理,最小的中断处理指能够检验、答复产生中断的硬件,而把更多的处理工作留给IST(interruptservicethread)。2)当ISR完成时返回中断ID(中断ID大部
2、分是预定义的)。 2:中断注册步骤1)用SETUP_INTERRUPT_MAP宏关联SYSINTR和IRQ。以“SYSINTR_”为前缀的常量由内核使用,用于唯一标识发生中断的硬件。在Nkintr.h文件中预定义了一些SYSINTR,OEM可以在Oalintr.h文件中自定义SYSINTR。2)用HookInterrupt函数关联硬件中断号和ISR。这里的硬件中断号为物理中断号,而非逻辑中断号IRQ。2、驱动中IST使用ISR是中断最小处理函数,因此各个驱动的中断处理函数称为IST。系统中保留16个虚拟中断号,ak3224_intr.h已经定义好各个ISR的虚拟中断号28个。因
3、此,驱动中的中断处理函数,只要与定义好的28个虚拟中断映射上即可。例子:首先,我们创建一个事件pGPIOInfo->hGPIOEvent1=CreateEvent(0,FALSE,FALSE,NULL);其次创建一个处理事件的线程(IST)pGPIOInfo->hGPIOThread1=CreateThread(NULL,0,GPIOFuncThread1,pGPIOInfo,0,NULL);然后使用InterruptInitialize让虚拟中断号pGPIOInfo->dwIntID1与创建的事件pGPIOInfo->hGPIOEvent1挂钩。InterruptInitializ
4、e(pGPIOInfo->dwIntID1,pGPIOInfo->hGPIOEvent1,NULL,0)那么,当GPIO的中断到来,与GPIO虚拟中断挂钩的事件pGPIOInfo->hGPIOEvent1就会被设为Active。线程pGPIOInfo->hGPIOThread1的语句WaitForSingleObject(pGPIOInfo->hGPIOEvent1,INFINITE);GPIOEventHandler1;就会被唤醒,然后执行下一条指令。这里加入的函数GPIOEventHandler1(中断处理操作)就被执行。当中断处理结束以后,必须使用InterruptDone(p
5、GPIOInfo->dwIntID1);通知系统已经完成中断处理,那么下一次的中断到来,事件pGPIOInfo->hGPIOEvent1就才会再次被设为Active。驱动卸载时,需要释放申请的事件及线程CloseHandle(pGPIOInfo->hGPIOEvent1);CloseHandle(pGPIOInfo->hGPIOThread1);3、可安装ISR介绍OEM在OEMInit函数中关联IRQ和SysIntr,当硬件设备发生中断时,ISR会禁止同级和低级中断,然后根据IRQ返回关联的SysIntr,内核根据ISR返回的SysIntr唤醒相应的IST(SysIntr与IST创
6、建的Event关联),IST处理中断之后调用InterruptDone解除中断禁止。在OEMInit中关联的缺点是一旦编译了CE内核后就无法添加这种关联了,而一些硬件设备会随时插拔或者共享中断,要关联这样的硬件设备解决方法就是可安装ISR,可安装ISR专用于处理指定的硬件设备发出的中断,所以如果硬件设备需要可安装ISR必须在注册表中添加IsrDll、IsrHandler。多数硬件设备采用CE默认的可安装ISRgiisr.dll,格式如下:"IsrDll"="giisr.dll""IsrHandler"="ISRHandler"如果一个硬件驱动程序需要可安装ISR而开发者又不想自己写一
7、个,那么可以利用giisr.dll来实现。除了在注册表中添加如上所示外,还要在驱动程序中调用相关函数注册可安装ISR。如下:g_IsrHandle=LoadIntChainHandler(IsrDll,IsrHandler,(BYTE)Irq);GIISR_INFOInfo;Info.SysIntr=dwSysIntr;Info.CheckPort=TRUE;Info.PortIsIO=(dwIOSpace)?TRUE:FALSE;Info.UseMask
此文档下载收益归作者所有