关于mini2440启动代码中中断的产生原理分析

一.首先,我们先看一下它的中断向量表:

 由中断向量表,可知如果有任何一个IRQ中断源产生中断,CPU都会到0x18地址读指令。

 二.在启动代码中,下面的指令分别在中断向量地址中: 即0x18地址处是指令 b HandlerIRQ

 b ResetHandler

b HandlerUndef ;handler for Undefined mode

b HandlerSWI ;handler for SWI interrupt

b HandlerPabort ;handler for PAbort

b HandlerDabort ;handler for DAbort

b . ;reserved

bHandlerIRQ ;handler for IRQ interrupt

b HandlerFIQ ;handler for FIQ interrupt

 

3、 HandlerFIQ      HANDLER HandleFIQ

HandlerIRQ      HANDLER HandleIRQ

HandlerUndef    HANDLER HandleUndef

HandlerSWI      HANDLER HandleSWI

HandlerDabort   HANDLER HandleDabort

HandlerPabort   HANDLER HandlePabort

 

4

     MACRO    

$HandlerLabel HANDLER $HandleLabel           ;$lable macroname $parameter

;HandlerLabel     

$HandlerLabel

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

                       ;

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

ldr     r0,=$HandleLabel;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}     ;POP the work register and pc(jump to ISR)

MEND

 

展开为:

HandlerFIQ      

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

                       ;

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

ldr     r0,= HandleFIQ;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}     ;POP the work register and pc(jump to ISR)

 

HandlerIRQ      

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

                       ;

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

ldr     r0,= HandleIRQ;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}     ;POP the work register and pc(jump to ISR)

 

  。。。。上面的6次宏调用,会展开为类似上面的代码6

 

   HandleIRQ #   4

5 ldr r0,=HandleIRQ       ;This routine is needed

ldr r1,=IsrIRQ   ;if there is not 'subs pc,lr,#4' at 0x18, 0x1c

str r1,[r0]

 

6

IsrIRQ

sub sp, sp, #4       ;reserved for PC  ;//

stmfd sp!, {r8-r9}

ldr r9, =INTOFFSET    ; //

ldr r9, [r9]    ;//14---timer4

ldr r8, =HandleEINT0  ;//

add r8, r8,r9,lsl #2   ;// 

ldr r8, [r8]           ;//

str r8, [sp,#8]

ldmfd sp!,{r8-r9,pc}  ;// 

 

   HandleEINT0+INTOFFSET*4 就是发生中断的扩展向量地址,而该地址就是放相应的中断函数名。

 

在2440init.s中有定义:HandleTIMER4  #   4

2440addr.h中有定义:#define pISR_TIMER4 (*(unsigned *)(_ISR_STARTADDRESS+0x58))

在模块的初始化函数中,有安装中断处理函数:pISR_TIMER4 = (unsigned int)timer4_irq;

 

具体的的流程如下图:

大致的产生流程就是这样的了.

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值