S3C2410A的异常机制[中断处理]


以YLE2410A开发板为例,说说ARM的异常是如何处理滴。

;Pre-defined constants

USERMODE     EQU   0x10

FIQMODE        EQU   0x11

IRQMODE        EQU   0x12

SVCMODE       EQU   0x13

ABORTMODE   EQU   0x17

UNDEFMODE   EQU   0x1B

MODEMASK     EQU   0x1F

NOINT             EQU   0xC0

 

;The location of stacks

UserStack     EQU   (_STACK_BASEADDRESS-0x3800) ;0x33ff4800 ~ 

SVCStack      EQU   (_STACK_BASEADDRESS-0x2800) ;0x33ff5800 ~

UndefStack   EQU   (_STACK_BASEADDRESS-0x2400) ;0x33ff5c00 ~

AbortStack    EQU   (_STACK_BASEADDRESS-0x2000) ;0x33ff6000 ~

IRQStack       EQU   (_STACK_BASEADDRESS-0x1000) ;0x33ff7000 ~

FIQStack       EQU   (_STACK_BASEADDRESS-0x0) ;0x33ff8000 ~ 

 

 

首先当然是进行堆栈初始化啦。。。有7种不同的异常处理,因为它们的堆栈是独立滴,所以需要单独进行堆栈分配以及初始化。初始化代码如下:

 

InitStacks

;Don't use DRAM,such as stmfd,ldmfd......

;SVCstack is initialized before

;Under toolkit ver 2.5, 'msr cpsr,r1' can be used instead of 'msr cpsr_cxsf,r1'

mrs r0,cpsr

bic r0,r0,#MODEMASK

orr r1,r0,#UNDEFMODE|NOINT

msr cpsr_cxsf,r1 ;UndefMode

ldr sp,=UndefStack

orr r1,r0,#ABORTMODE|NOINT

msr cpsr_cxsf,r1 ;AbortMode

ldr sp,=AbortStack


orr r1,r0,#IRQMODE|NOINT

msr cpsr_cxsf,r1 ;IRQMode

ldr sp,=IRQStack

    

orr r1,r0,#FIQMODE|NOINT

msr cpsr_cxsf,r1 ;FIQMode

ldr sp,=FIQStack


bic r0,r0,#MODEMASK|NOINT

orr r1,r0,#SVCMODE

msr cpsr_cxsf,r1 ;SVCMode

ldr sp,=SVCStack

;USER mode has not be initialized.

mov pc,lr 


做好这个初始化之后呢,当然就是IRQ的分配了。就说说普通的IRQ吧,一般在WINCE下很难用到FIQ滴。嘿嘿。。。一家之言。

因为ARM有7种不同的异常处理,所以:

 

LTORG   

HandlerFIQ      HANDLER HandleFIQ

HandlerIRQ      HANDLER HandleIRQ

HandlerUndef    HANDLER HandleUndef

;HandlerUndef

; sub sp, sp, #4 ;decrement sp(to store jump address)

; stmfd sp!, {r14} ;PUSH the work register to stack(lr does't push because it return to original address)

; ldr r0, =HandleUndef ;load the address of HandleXXX to r0

; ldr r0, [r0]         ;load the contents(service routine start address) of HandleXXX

; str r0, [sp, #4] ;store the contents(ISR) of HandleXXX to stack

; ldmfd sp!, {r0, pc}

HandlerSWI      HANDLER HandleSWI

HandlerDabort   HANDLER HandleDabort

HandlerPabort   HANDLER HandlePabort

也是需要7种不同的中断向量了哦。这个和单片机是差不多滴。。。一般都是放在前面撒。

异常服务程序 

这里不用中断(interrupt)而用异常(exception),毕竟中断只是异常的一种情况,

  • 1
  • 2
  • 下一页

相关内容