S3C2410 中断程序的实现
详细内容
S3C2410(IRQ)中断处理过程:
在此要注意的是区别中断向量表和异常向量表。中断发生后总是从IRQ 或者FIQ 异常入口处进入,然后跳转到相应的异常处理程序处执行,这个异常处理程序一般都是进行查找中断向量表的操作,然后调用中断处理程序。
以下是在应用中中断处理实现的过程:从中不难体会到中断的处理过程。
定义中断向量表的物理地址:
代码
- .equpISR_DABORT,(_ISR_STARTADDRESS 0x10)
- .equpISR_RESERVED,(_ISR_STARTADDRESS 0x14)
- .equpISR_IRQ,(_ISR_STARTADDRESS 0x18)
- .equpISR_FIQ,(_ISR_STARTADDRESS 0x1c)//异常向量表
- ……………………………………………………………………
- .equpISR_EINT0,(_ISR_STARTADDRESS 0x20)//中断向量表
- .equpISR_EINT1,(_ISR_STARTADDRESS 0x24)
- .equpISR_EINT2,(_ISR_STARTADDRESS 0x28)
- .equpISR_EINT3,(_ISR_STARTADDRESS 0x2c)
代码
- pISR_EINT0=(unsignedint)isrEINT0;//isrEINT0中断处理程序
- pISR_EINT1=(unsignedint)isrEINT1;
代码
- .externInterrupt_Rbutton
- .globalisrEINT0
- isrEINT0:
- IRQHandleInterrupt_Rbutton
代码
- bHandlerUndef/*handlerforUndefinedmode*/
- bHandlerSWI/*handlerforSWIinterrupt*/
- bHandlerPabort/*handlerforPAbort*/
- bHandlerDabort/*handlerforDAbort*/
- .longFileIDTable/*id*/
- bHandlerIRQ/*handlerforIRQinterrupt*/
- bHandlerFIQ
代码
- HandlerFIQ:HANDLERHandleFIQ
- HandlerIRQ:HANDLERHandleIRQ
- HandlerUndef:HANDLERHandleUndef
- HandlerSWI:HANDLERHandleSWI
- HandlerDabort:HANDLERHandleDabort
- HandlerPabort:HANDLERHandlePabort
代码
- .macroHANDLERHandleLabel
- subsp,sp,#4/*decrementsp(tostorejumpaddress)*/
- stmfdsp!,{r0}/*PUSHtheworkregistertostack(lrdoes'tpushbec
- auseitreturntooriginaladdress)*/
- ldrr0,=HandleLabel/*loadtheaddressofHandleXXXtor0*/
- ldrr0,[r0]/*loadthecontents(serviceroutinestartaddress)of
- HandleXXX*/
- strr0,[sp,#4]/*storethecontents(ISR)ofHandleXXXtostack*/
- ldmfdsp!,{r0,pc}/*POPtheworkregisterandpc(jumptoISR)*/
- .endm
代码
- .macroIRQHandleisrHandle:
- stmdbsp!,{r0-r11,ip,lr}/*saver0-r11,ip,lr*/
- ldrr0,=isrHandle
- movlr,pc
- bxr0/*jumptouser_handle(void)*/
- ldmiasp!,{r0-r11,ip,lr}/*restorer0,ip,lr*/
- subspc,r14,#4/*returnfrominterrupt*/
- .endm
运行IsrIRQ代码:
代码
- ldrr0,=HandleIRQ@Thisroutineisneeded
- ldrr1,=IsrIRQ@ifthereisn't'subspc,lr,#4'at0x18,0x1c
- strr1,[r0]
代码
- IsrIRQ:
- subsp,sp,#4@reservedforPC
- stmfdsp!,{r8-r9}
- ldrr9,=INTOFFSET
- ldrr9,[r9]
- ldrr8,=HandleEINT0
- addr8,r8,r9,lsl#2
- ldrr8,[r8]
- strr8,[sp,#8]
- ldmfdsp!,{r8-r9,pc}
在嵌入式系统中异常向量表和中断向量表都是存于FLASH起始的一段空间中。而异常处理和中断处理程序都是运行在RAM中的。