关于中断的问题,没人知道吗?

[复制链接]
2102|0
 楼主| kingjie 发表于 2007-5-12 09:53 | 显示全部楼层 |阅读模式
ASM_ISR.S文件:<br /><br /><br /><br />;-----------------------------------------------------------------------------------------------------------<br />;Function&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;timer1_asm_irq_handler<br />;Treatments&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;Timer&nbsp;1&nbsp;interrupt&nbsp;handler<br />;Called&nbsp;Fuctions&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;timer1_c_irq_handler<br />;Called&nbsp;Macros&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;IRQ_ENTRY,&nbsp;IRQ_EXIT<br />;------------------------------------------------------------------------------------------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EXPORT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tc0_asm_irq_handler<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IMPORT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timer1_c_irq_handler<br /><br />tc0_asm_irq_handler<br />;Manage&nbsp;Exception&nbsp;Entry<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IRQ_ENTRY<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />;Call&nbsp;the&nbsp;timer&nbsp;Interrupt&nbsp;C&nbsp;handler<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,=timer1_c_irq_handler<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />;Manage&nbsp;Exception&nbsp;Exit<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IRQ_EXIT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;END&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /><br /><br />中断处理函数:<br /><br /><br /><br />void&nbsp;timer1_c_irq_handler(void)<br /><br /><br /><br />{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;dummy;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dummy=*AT91C_TC1_SR;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dummy=dummy;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AT91C_BASE_TC1-&gtTC_RC=46800;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sys-&gtAIC_IDCR=0xffffffff;//禁用中断<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sys-&gtAIC_ICCR=0xffffffff;//清除中断<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*Read&nbsp;TC1&nbsp;Status&nbsp;Register&nbsp;to&nbsp;clear&nbsp;it&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ledon();<br /><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay();<br /><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ledoff()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tc-&gtTC_IER|=AT91C_TC_CPCS;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sys-&gtAIC_IECR=0x1&lt&ltAT91C_ID_TC1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sys-&gtAIC_EOICR=0x1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//AT91F_US_Printf(&quot;
hello!
&quot;);&nbsp;&nbsp;&nbsp;<br />}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /><br /><br />定时器发生中断后,pc跳到tc0_asm_irq_handler,然后执行IRQ_ENTRY,进行现场保护,玩了以后再跳到中断处理函数timer1_c_irq_handler,执行完这个函数后,pc应该返回来执行&nbsp;IRQ_EXIT&nbsp;,恢复现场(我是这么理解的)。现在的问题是我必须在中断处理函数timer1_c_irq_handler里加上sys-&gtAIC_EOICR=0x1;来通知内核中断结束,但是这个写EOICR寄存器的指令在汇编函数IRQ_EXIT&nbsp;里已经存在了啊?如果我不在c处理函数timer1_c_irq_handler对EOICR寄存器写操作的话,中断只能进一次!唯一的解释是汇编函数IRQ_EXIT&nbsp;没有执行。会不会和&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;Call&nbsp;the&nbsp;timer&nbsp;Interrupt&nbsp;C&nbsp;handler<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,=timer1_c_irq_handler<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1<br />bx这跳指令有关系啊?我看了arm汇编指令,bx好像不带返回的跳转指令,那么执行完timer1_c_irq_handler这个函数以后pc也就不会返回,的人也就不能执行IRQ_EXIT了。可我看了好多中断的例程,都用的是这跳指令,这是为什么呢?困惑!<br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

5

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部