欢迎来到天天文库
浏览记录
ID:30451294
大小:74.04 KB
页数:7页
时间:2018-12-30
《中断处理可以分为两部分中断服务b例程bisr》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、中断在系统设计中的应用非常广泛,可以说,硬件中断、软件中断无处不在,在WINCE下驱动开发更是如此,比如:按键中断、触摸屏中断、AUDIO中断、DMA中断.....等等,几乎含概每个模块。因此,了解中断的处理过程对驱动开发极其重要,下面对WINCE下的中断处理过程做一个简单介绍。 中断处理可以分为两部分:中断服务例程-ISR、中断服务线程-IST。系统在处理中断异常的时候,应该要尽可能快的完成,因此,我们应该ISR中做简短的处理,把中断标识返回给中断处理器,越快越好。那么就要把大部分的处理留给IST来处理。我们
2、可以简单的认为,ISR的任务就是完成把硬件中断也就是物理中断转为系统中断并返回。 下面再来了解一下IST,IST就是一个线程,在驱动初始化的时候创建并等待一个事件,当然,在这之前要先创建一个事件,并与中断相关联起来,当中断产生以后该事件触发IST,IST里通常是用户的处理程序。IST的实现必须先实现两个过程:IST的中断必须和一个事件相关联,IST必须通过WaitForSingleObject来等待这个事件的唤醒,IST的最后要调用INTERRUPTDONE来对注销中断,否则该中断只能用一次,一般我们在驱动的X
3、XX_INIT函数中实现。 IST在BSP/COMMON/INTR/intr.c中,这里面的内容包括init、enable、disable、oeminterrupthandler等函数,主要是对中断的初始化、使能、处理等,其中最关键的是oeminterrupthandler。以下是我在该函数中对EINT的简单处理部分代码:if(irq==IRQ_EINT4_7
4、
5、irq==IRQ_EINT8_23){//4or5 //Findexternalinterruptnumber
6、 mask=INREG32(&g_pPortRegs->EINTPEND); mask&=~INREG32(&g_pPortRegs->EINTMASK); mask=(mask^(mask-1))>>5; irq2=IRQ_EINT4; while(mask!=0){ mask>>=1; irq2++; } //Maskandclearint
7、errupt mask=1<<(irq2-IRQ_EINT4+4); SETREG32(&g_pPortRegs->EINTMASK,mask); OUTREG32(&g_pPortRegs->EINTPEND,mask); //Clearprimaryinterrupt mask=1<SRCPND,mask);
8、 OUTREG32(&g_pIntrRegs->INTPND,mask); //Fromnowwecareaboutthisirq irq=irq2;else{ //Maskandclearinterrupt mask=1<INTMSK,mask); OUTREG32(&g_pIntrRegs->SRCPND,mask);
9、 OUTREG32(&g_pIntrRegs->INTPND,mask); } //FirstfindifIRQisclaimedbychain sysIntr=NKCallIntChain((UCHAR)irq); if(sysIntr==SYSINTR_CHAIN
10、
11、!NKIsSysIntrValid(sysIntr)){ //IRQwasn'tclaimed,usestaticmapping s
12、ysIntr=OALIntrTranslateIrq(irq); }而IST的具体实现过程可以参照下面的步骤:1、创建一个事件。用createEvent来实现2、定义一个中断DWORDkey_intr=SYSINTR_NOP;3、得到ISR返回的中断号,并通过KernelIoControl将其与上面定义的中断相关联。4、将创建的事
此文档下载收益归作者所有