ASM_ISR.S文件:<br /><br /><br /><br />;-----------------------------------------------------------------------------------------------------------<br />;Function ;timer1_asm_irq_handler<br />;Treatments ;Timer 1 interrupt handler<br />;Called Fuctions ;timer1_c_irq_handler<br />;Called Macros ;IRQ_ENTRY, IRQ_EXIT<br />;------------------------------------------------------------------------------------------------------------<br /> EXPORT tc0_asm_irq_handler<br /> IMPORT timer1_c_irq_handler<br /><br />tc0_asm_irq_handler<br />;Manage Exception Entry<br /> IRQ_ENTRY<br /> <br />;Call the timer Interrupt C handler<br /> ldr r1,=timer1_c_irq_handler<br /> bx r1<br /> <br />;Manage Exception Exit<br /> IRQ_EXIT <br /> END <br /><br /><br /><br />中断处理函数:<br /><br /><br /><br />void timer1_c_irq_handler(void)<br /><br /><br /><br />{ <br /> unsigned int dummy;<br /> <br /> dummy=*AT91C_TC1_SR;<br /> dummy=dummy;<br /> AT91C_BASE_TC1->TC_RC=46800; <br /> sys->AIC_IDCR=0xffffffff;//禁用中断<br /> sys->AIC_ICCR=0xffffffff;//清除中断<br /> /*Read TC1 Status Register to clear it */<br /> ledon();<br /><br /><br /><br /> delay();<br /><br /><br /><br /> ledoff()<br /> tc->TC_IER|=AT91C_TC_CPCS;<br /> sys->AIC_IECR=0x1<<AT91C_ID_TC1;<br /> sys->AIC_EOICR=0x1;<br /> <br /> <br /> //AT91F_US_Printf("
hello!
"); <br />} <br /><br /><br /><br />定时器发生中断后,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<br /> ldr r1,=timer1_c_irq_handler<br /> bx r1<br />bx这跳指令有关系啊?我看了arm汇编指令,bx好像不带返回的跳转指令,那么执行完timer1_c_irq_handler这个函数以后pc也就不会返回,的人也就不能执行IRQ_EXIT了。可我看了好多中断的例程,都用的是这跳指令,这是为什么呢?困惑!<br /> |
|