汉语大全>嵌入式系统>S3C2410 中断程序的实现

S3C2410 中断程序的实现

详细内容

S3C2410(IRQ)中断处理过程:
S3C2410 中断程序的实现
在此要注意的是区别中断向量表和异常向量表。中断发生后总是从IRQ 或者FIQ 异常入口处进入,然后跳转到相应的异常处理程序处执行,这个异常处理程序一般都是进行查找中断向量表的操作,然后调用中断处理程序。
以下是在应用中中断处理实现的过程:从中不难体会到中断的处理过程。
定义中断向量表的物理地址:
代码

  1. .equpISR_DABORT,(_ISR_STARTADDRESS 0x10)
  2. .equpISR_RESERVED,(_ISR_STARTADDRESS 0x14)
  3. .equpISR_IRQ,(_ISR_STARTADDRESS 0x18)
  4. .equpISR_FIQ,(_ISR_STARTADDRESS 0x1c)//异常向量表
  5. ……………………………………………………………………
  6. .equpISR_EINT0,(_ISR_STARTADDRESS 0x20)//中断向量表
  7. .equpISR_EINT1,(_ISR_STARTADDRESS 0x24)
  8. .equpISR_EINT2,(_ISR_STARTADDRESS 0x28)
  9. .equpISR_EINT3,(_ISR_STARTADDRESS 0x2c)
将中断处理程序入口地址放入中断向量表:
代码
  1. pISR_EINT0=(unsignedint)isrEINT0;//isrEINT0中断处理程序
  2. pISR_EINT1=(unsignedint)isrEINT1;
定义中断处理程序:
代码
  1. .externInterrupt_Rbutton
  2. .globalisrEINT0
  3. isrEINT0:
  4. IRQHandleInterrupt_Rbutton
定义异常向量表:
代码
  1. bHandlerUndef/*handlerforUndefinedmode*/
  2. bHandlerSWI/*handlerforSWIinterrupt*/
  3. bHandlerPabort/*handlerforPAbort*/
  4. bHandlerDabort/*handlerforDAbort*/
  5. .longFileIDTable/*id*/
  6. bHandlerIRQ/*handlerforIRQinterrupt*/
  7. bHandlerFIQ
定义异常处理函数:
代码
  1. HandlerFIQ:HANDLERHandleFIQ
  2. HandlerIRQ:HANDLERHandleIRQ
  3. HandlerUndef:HANDLERHandleUndef
  4. HandlerSWI:HANDLERHandleSWI
  5. HandlerDabort:HANDLERHandleDabort
  6. HandlerPabort:HANDLERHandlePabort
异常处理宏HANDLER的定义:
代码
  1. .macroHANDLERHandleLabel
  2. subsp,sp,#4/*decrementsp(tostorejumpaddress)*/
  3. stmfdsp!,{r0}/*PUSHtheworkregistertostack(lrdoes'tpushbec
  4. auseitreturntooriginaladdress)*/
  5. ldrr0,=HandleLabel/*loadtheaddressofHandleXXXtor0*/
  6. ldrr0,[r0]/*loadthecontents(serviceroutinestartaddress)of
  7. HandleXXX*/
  8. strr0,[sp,#4]/*storethecontents(ISR)ofHandleXXXtostack*/
  9. ldmfdsp!,{r0,pc}/*POPtheworkregisterandpc(jumptoISR)*/
  10. .endm
定义IRQ 中断处理宏IRQHandle:
代码
  1. .macroIRQHandleisrHandle:
  2. stmdbsp!,{r0-r11,ip,lr}/*saver0-r11,ip,lr*/
  3. ldrr0,=isrHandle
  4. movlr,pc
  5. bxr0/*jumptouser_handle(void)*/
  6. ldmiasp!,{r0-r11,ip,lr}/*restorer0,ip,lr*/
  7. subspc,r14,#4/*returnfrominterrupt*/
  8. .endm
申明IRQ 异常的服务程序为:IsrIRQ,即,发生IRQ 异常时,执行"b HandlerIRQ"即是
运行IsrIRQ代码:
代码
  1. ldrr0,=HandleIRQ@Thisroutineisneeded
  2. ldrr1,=IsrIRQ@ifthereisn't'subspc,lr,#4'at0x18,0x1c
  3. strr1,[r0]
IRQ 异常处理程序:
代码
  1. IsrIRQ:
  2. subsp,sp,#4@reservedforPC
  3. stmfdsp!,{r8-r9}
  4. ldrr9,=INTOFFSET
  5. ldrr9,[r9]
  6. ldrr8,=HandleEINT0
  7. addr8,r8,r9,lsl#2
  8. ldrr8,[r8]
  9. strr8,[sp,#8]
  10. ldmfdsp!,{r8-r9,pc}
由上可以知道,当一个IRQ 中断发生时,CPU将从0X18(IRQ 异常入口地址)取指执行,在这一步PC 的跳转是有硬件实现的。在入口0x18 地址处放的是一条跳转指令,这条指令将跳到IRQ 异常处理程序运行,IRQ 异常处理程序主要是根据中断源查找中断向量表。获得中断入口地址后,接着CPU 跳转中断处理程序运行。
在嵌入式系统中异常向量表和中断向量表都是存于FLASH起始的一段空间中。而异常处理和中断处理程序都是运行在RAM中的。