ARM内核的中断技术
3 中断处理程序的编写
(1)软件中断处理程序的编写
软件中断指令的格式如图1所示。低24位立即数为软件中断号。在中断处理程序中,必须首先得到软件中断号,然后根据中断号执行不同代码。以下的中断处理程序,在软件中断号为1时,将端口A的0号引脚置“1”。
STMFD sp!,{r0-r12,lr} //保存各工作寄存器
LDR r0,{lr,#-4} //得到该软件中断指令
BIC r0,r0,#0xff000000 //从中取出中断号
ADR r2,SWIJumpTable //r2指向代码入口表
LDR pc,[r2,r0,LSL #2] //把r0中的值乘4后加到r2。将//程序计数器指向中断号对应的代码入口地址
SWIJumpTable //代码入口表
DCD SWInum0
DCD SWInum1
……
SWInum0 //中断号为0时的处理代码(略)
SWInum1 //中断号为1时的处理代码
MOV r0,#0x80000000 //r0指向端口A
STRB r0,#0x01 //A口0脚置“1”
B EndofSWI //跳转
EndofSWI
LDMFD sp! {r0-r12,pc} //恢复各寄存器,返回原程序
(2)常规中断处理程序的编写
为快速执行,常规中断处理程序一般用汇编指令编写。在编写可重入常规中断处理程序(运行时仍可响应常规中断)时,必须先把链接寄存器和程序用到的工作寄存器入栈,然后才能开放中断;各寄存器出栈前,必须先关闭中断。这样可防止因寄存器崩溃而无法返回的情况发生。下文介绍了一个与中控制器相配置的可重入的常规中断处理程序。当若干中断源同时有效时,中断控制器(基址为IntBase)把16个中断源中优先级最高的一个存入中断寄存器(偏移地址为IntLevel)中,并发出硬件中断信号。
SUB lr,lr,#4 //得至并保存返回地址
STMFD sp!,{lr}
MRS r14,SPSR //把SPSR和sl2入栈
STMFD sp!,{r12,r14}
MOV r12,#IntBase
LDR r12,[r12,#IntLevel] //将最高优先级号存入r12
MRS r14,CPSR. //开中断
BIC r14,r14,#0x80
MSR CPSR_c,r14
LDR PC,[PC,r12,LSL #2] //将pc指向该优先级号对应的处理代码入口
NOP //补位
DCD Priority0Handler //代码入口表
DCD Priority 1 Handler
DCD Priority 2 Handler
……
Priority0Handler //0优先级中断处理代码
STMFD sp!,{r0-r11} //保存工作寄存器
……(略) //具体代码
LDMFD sp!,{r0-r11} //恢复工作寄存器
MRS r12,CPSR //关中断
ORR r12,r12,#0x80
MSR CPSR_c,r12
LDMFD sp!,{r12,r14} //恢复r12
MSR SPSR_csxf,r14 //恢复备用程序状态寄存器(SPSR)
LDMFD sp!,{pc}^ //返回原程序
Priority 1 Handler //优先级中断处理代码(略)
(3)快中断处理程序的编写
为保证高速处理,快中断处理程序必须要用汇编语言编写,而且必须是非重入的。一般快中断处理程序主要是些数据存取指令,就不具体介绍了。
结束语
中断技术是处理器和系统芯片开发的重要技术。快速、高效的中断处理程序是实时多任务系统设计成功的关键。
评论