<所有已使能中断的查询与服务>
;将同时发生的中断全部服务,以提高效率
LDMFD SP!,{R0-R3,R12,R14} ;恢复上下文
在上述保存上下文中没有必要保存SPSR。因在非嵌套的中断处理程序中,它不会被任何顺序的中断所破坏。
如果用C语言来书写该处理程序,可以使用关键字一IRQ来说明,以告诉编译器实现如下的操作:
①保存.ATPCS规定的被破坏的寄存器;
②保存其他中断处理程序中用到的寄存器;
③同时将(LR-4)赋予程序计数器PC,实现中断程序的返回并且恢复CPSR寄存器的内容。
普通中断处理的C语言程序可以按如下格式编写:
可见,无论是用C语言还是汇编语言来编写,它们的工作原理都是一样的。图2给出了普通中断处理过程中,ARM寄存器的保存示意图(虚线是压栈保存,实线是弹栈恢复)。图中与程序处理的步骤相对应,可以帮助理解处理器上下文的保存过程。
3 任务切换
有操作系统的嵌入式系统中,中断的发生要求保存全部寄存器的内容到任务的栈中,它不是基于安全的考虑是因为可能中断会导致任务的切换。任务切换发生时所有任务的寄存器的值都要保存到该任务的栈中。下个任务的上下文将从该任务栈中得以恢复到处理器的寄存器中。下面就本问题作出分析并给出实现的程序代码。从图1中断处理寄存器的保存可知,中断发生后任务的CPSR和PC两寄存器的值在IRQ模式的SPSR和LR中,所以不能简单地切换到任务运行的模式中,否则被中断任务返回时的CPSR和PC将不可见(因为它们保存在IRQ模式的专用寄存器中,在其他模式中无法操作)。此时,可以考虑设置一些变量区作为媒介,将其予以转存到任务运行模式的栈中去。