|
中断向量地址 |
异常类型 |
异常模式 |
优先级(6最低) |
|
0x8 |
软件中断 |
管理模式(svc) |
6 |
|
0x18 |
外部中断(IRQ) |
外部中断(IRQ)模式 |
4 |
|
0x1c |
快速中断(FIQ) |
快速中断(FIQ)模式 |
3 |
S3C44BOX的中断控制器可以接收来自30个中断源的中断请求 。这些中断源来自DMA、UART、SIO等芯片内部外围或接口芯片的外部引脚。
中断控制器的任务是在片内外围和外部中断源组成的多重中断发生时,经过优先级判断选择其中的一个中断,通过FIQ(快速中断请求)或IRQ(通用中断请求)向ARM7TDMI内核发出FIQ或IRQ中断请求。
实际上最初ARM7TDMI内核只有FIQ和IRQ两种中断,其他的中断都是各芯片厂家在设计芯片时定义的,这些中断根据中断的优先级高低来进行处理。特别的是,为了解决一般的中断模式在进入所需的服务程序前需要很长的中断反应时间的问题,S3C44BOX提供了一种新的中断模式——矢量中断模式。它具有CISC结构微控制器的特征,能够缩短中断反应时间[4]。
3 S3C44BOX中断处理流程
S3C44BOX处理器的中断处理与其他处理器的处理模式基本上是一致的,只是由于引入了几种不同的处理器模式,使中断处理变得更容易。中断处理流程图如图1所示。其典型步骤如下:
第1步:保存现场。当系统出现中断时,处理器首先要做的就是保存现场,这一过程包括:保存当前的PC值到lr(链接寄存器)中,保存当前程序运行状态CPSR到程序状态保存寄存器SPSR中。由于ARM7TDMI采用了三级流水线结构,此时的PC值实际上等于当前指令地址加上8(ARM指令时),则返回时还需要将保存的PC值减4,得到当前指令的下一条指令。
第2步:模式切换。设置当前程序状态CPSR中相应的位,使处理器进入相应的执行模式。如当进入FIQ模式时,禁止FIQ中断。
第3步:获取中断源。如IRQ中断,都从向量地址0x18处开始执行,通常在此地址处放一条跳转指令,跳转到中断程序。
第4步:处理中断。获取中断源后,通过中断向量表获取相应中断的处理程序入口,调用对应的中断处理函数。
第5步:恢复现场,中断返回。返回时需要恢复处理器模式,包括恢复中断处理用到的所有寄存器、恢复被中断的程序状态到当前程序状态CPSR,并跳转到被中断的主程序。
图1 中断处理流程图
4中断处理程序实例
下面以可重入外部中断处理程序[5](运行时仍可响应外部中断)为例,说明S3C44BOX的中断处理开发方法。程序中用到了S3C44BOX的IRQ中断服务挂起寄存器I_ISPR,用来表示当前正在被响应的中断。
整个中断程序是在武汉创维特信息技术有限公司开发的ADT(ARM Development Tools)嵌入式系统开发环境中完成的。
为了提高执行效率,外部中断处理程序一般用汇编指令编写。在编写可重入常规中断处理程序时,为了防止因寄存器崩溃而无法返回的情况发生,必须先把链接积存器和程序中用的工作寄存器入栈后,才开放中断;等到各寄存器出栈前,必须先关闭中断。
# ENTRY
__entry:
b ResetHandler //复位
b HandlerUndef //未定义的指令
b HandlerSWI //软件中断
b HandlerPabort //指令预取中止
b HandlerDabort //数据访问中止
b HandlerAbort //保留异常处理
b HandlerIRQ //外部中断请求
b HandlerFIQ //快速中断请求
……(略)
IsrIRQ:
SUB lr,lr,#4
STMFD sp!,{lr} //保存中断返回的PC值
STMFD sp!,{r0-r4} //备份寄存器r0-r4
SUB sp,sp,#4 //为PC预留空间
STMFD sp!,{r8-r9}
LDR r9,=I_ISPR //读取中断状态
LDR r9,[r9]
CMP r9,#0x0 //检查中断状态
……
ADD r8,r8,#4 //修改当前的中断偏移
……
LDR r9,=HandleADC // HandleADC位于中断地址向量表
起始位置
ADD r9,r9,r8
LDR r9,[r9] //从地址向量表中获取入口地址
STR r9,[sp,#8]
MOV lr,pc //保存当前PC
LDMFD sp!,{r8-r9,pc} //调用中断例程
LDMFD sp!,{r0-r4,pc} //中断返回,并恢复中断前的处理器模式
5 结束语
中断技术是处理器和系统芯片开发的重要技术。快速、高效的中断处理程序是实时多任务系统设计成功的关键。由于ARM7TDMI内核的微处理器具有相同的中断系统,因此上述中断开发方法同样适合其他ARM7TDMI 内核的CPU。