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了。可我看了好多中断的例程,都用的是这跳指令,这是为什么呢?困惑!
|