No.30545 作者:MICKEYMOUSE 邮件:zhanghf@embedinfo.com ID:104569 登陆:13次 文章数:28篇 最后登陆IP:183.38.85.6 最后登陆:2011/6/29 15:33:54 注册:2008/4/1 15:50:28 财富:301 发帖时间:2008/4/11 9:55:17 发贴者IP:218.17.61.186 标题:MICKEYMOUSE:Realview MDK中编译器对中断处理的过程处理[推荐] 摘要:No.30545Realview MDK中编译器对中断处理的过程处理[推荐] 在ARM程序的开发过程中,对中断的处理是很普遍的、也是相当重要的。Realview MDK使用的RVCT编译器提供了__irq关键字,用此关键字修饰的函数被作为中断出来函数编译,即在编译的过程中,编译器会自动添加中断处理过程中现场保护和恢复的代码,减小程序的开发难度,加快软件的开发过程。 在理解__irq关键字的作用之前,先看一下ARM核对异常的处理过程。当产生异常时, ARM核拷贝CPSR寄存器的内容SPSR_ <mode> 寄存器中,同时设置适当的CPSR 位、改变处理器状态进入ARM 态和处理器模式,从而进入相应的异常模式。在设置中断禁止位禁止相应中断(如果需要)后,ARM核保存返回地址到LR_ <mode> ,同时设置PC为相应的异常向量。当异常返回时, 异常处理需要从SPSR_ <mode> 寄存器中恢复CPSR的值,同时从LR_ <mode> 恢复PC,具体的异常返回指令如下: Ø 从SWI和Undef异常返回时使用: movs pc, LR; Ø 从FIQ、IRQ和预取终止返回时使用: SUBS PC, LR,#4; Ø 从数据异常返回时使用: SUBS PC, LR,#8 在使用上述指令异常返回时,如果LR之前被压栈的话使用LDM “∧”, 例如: LDMFD SP!, {PC}∧ 理解了ARM异常处理的过程以后,Realview MDK中__irq关键字的作用就容易理解了。下面的函数为一个中断处理函数,其前面加了__irq关键字。 __irq void pwm0_irq_handler(void) { //Deassert PWM0 interrupt signal unsigned i ......
>>返回讨论的主题
|