打印

关于中断返回的问题

[复制链接]
1769|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kingjie|  楼主 | 2007-5-10 16:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ASM_ISR.S文件:



;-----------------------------------------------------------------------------------------------------------
;Function               ;timer1_asm_irq_handler
;Treatments             ;Timer 1 interrupt handler
;Called Fuctions        ;timer1_c_irq_handler
;Called Macros          ;IRQ_ENTRY, IRQ_EXIT
;------------------------------------------------------------------------------------------------------------
                     EXPORT         tc0_asm_irq_handler
                     IMPORT         timer1_c_irq_handler

tc0_asm_irq_handler
;Manage Exception Entry
                      IRQ_ENTRY
                      
;Call the timer Interrupt C handler
                      ldr      r1,=timer1_c_irq_handler
                      bx       r1
                       
;Manage Exception Exit
                      IRQ_EXIT                      
                      END         



中断处理函数:



void timer1_c_irq_handler(void)




     unsigned int dummy;
     
     dummy=*AT91C_TC1_SR;
     dummy=dummy;
     AT91C_BASE_TC1->TC_RC=46800; 
     sys->AIC_IDCR=0xffffffff;//禁用中断
     sys->AIC_ICCR=0xffffffff;//清除中断
                                             /*Read TC1 Status Register to clear it */
     ledon();



     delay();



     ledoff()
     tc->TC_IER|=AT91C_TC_CPCS;
     sys->AIC_IECR=0x1<<AT91C_ID_TC1;
     sys->AIC_EOICR=0x1;
        
      
     //AT91F_US_Printf(" hello! ");   
}           



定时器发生中断后,pc跳到tc0_asm_irq_handler,然后执行IRQ_ENTRY,进行现场保护,玩了以后再跳到中断处理函数timer1_c_irq_handler,执行完这个函数后,pc应该返回来执行 IRQ_EXIT ,恢复现场(我是这么理解的)。现在的问题是我必须在中断处理函数timer1_c_irq_handler里加上sys->AIC_EOICR=0x1;来通知内核中断结束,但是这个写EOICR寄存器的指令在汇编函数IRQ_EXIT 里已经存在了啊?如果我不在c处理函数timer1_c_irq_handler对EOICR寄存器写操作的话,中断只能进一次!唯一的解释是汇编函数IRQ_EXIT 没有执行。会不会和              ;Call the timer Interrupt C handler
                      ldr      r1,=timer1_c_irq_handler
                      bx       r1
bx这跳指令有关系啊?我看了arm汇编指令,bx好像不带返回的跳转指令,那么执行完timer1_c_irq_handler这个函数以后pc也就不会返回,的人也就不能执行IRQ_EXIT了。可我看了好多中断的例程,都用的是这跳指令,这是为什么呢?困惑!

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

5

帖子

1

粉丝