ARM S3C4510B系统中的异常中断技术
要求返回到出现异常的执行现场,重新执行操作。
2 S3C4510B系统中的异常中断处理程序的安装
S3C4510B系统通过异常向量表安装异常中断处理程序,即将异常向量表指向异常中断处理程序的入口,实现面向异常中断的跳转。这里需要介绍一下 S3C4510B系统的中断向量表。在S3C4510B系统中,无论在地址重映射之前还是之后,异常中断向量表的入口地址为固定的(见表1)。当系统运行到满足异常中断条件而产生异常中断时,系统将自动跳入相应的异常中断向量表中。而在异常向量表中保存的,正是利用跳转指令或ldr指令指向该中断的异常中断处理程序的指令程序,这样就实现了异常中断处理程序的安装。以SWI软中断为例,异常中断安装的基本顺序如图2所示,其中异常中断向量的地址是固定的,其他地址为假设的。
2.1 利用跳转指令实现异常中断的安装
将BL指令放置到中断向量表的特定位置,跳转目标地址为中断处理程序的首地址,便可直接实现异常中断的安装。其优点是BL指令可以直接保存地址,缺点是BL的跳转范围只有32MB的地址空间,如bl SWI_Handler。
2.2 利用ldr指令实现异常中断的安装
利用ldr直接向程序计数器PC中赋值也可以实现中断处理程序的安装。先要将异常中断处理程序首地址的绝对地址放在邻近的一个存储单元中,然后用ldr命令将该内存单元中的地址读取到PC中。其优点是可调用程序的范围不受限制,如:
ldr pc,SWI_ADDR
……
SWI_ADDR dcd SWI_Handler
以上两种安装方法各有优缺点,需要根据实际情况来选择。 电子技术书籍网
3 S3C4510B系统中SWI异常中断实例
S3C4510B中的SWI指令可以用来实现RTOS中的系统功能调用。它由用户模式下当前执行的指令引发,通过一个24位的立即数来指代SWI需要调用的系统功能,调用执行的过程在特权模式中进行。
3.1 SWI异常中断的处理程序
通常我们把SWI的中断处理程序分为两级,分别完成立即数的读取和功能调用的执行。其指令代码如下:
……
stmfd sp!,{r0-r12,lr}
保护现场,保存寄存器的值
ldr r0,[lr,#-4]
lr寄存器保存指令
bic r0,r0,#0XFF000000 ;读取指令中的24位立即数
……
cmp R0,#MaxOfSWI
判断立即数是否有效
ldrls pc,[pc,r0,lsl #2]
b OutOfSWIRange ;超出范围
JumpListofSWI
dcd SWIPro_0
dcd SWIPro_1
……
其他所有的软中断入口
SWIPro_0
进入SWI对应立即数0的中断处理程序
……
对应立即数0的中断处理程序
b EndOfSWI
SWIPro0
进入SWI对应立即数1的中断处理程序
……
对应立即数1的中断处理程序
b EndOfSWI
……
其他的SWI处理程序
EndOfSWI
1dmfd sp!,{r0-r12,pc}^
恢复各寄存器
3.2 SWI异常中断的调用与返回
对于SWI异常中断的调用要根据中断现场所处的处理器模式进行调用。通常用户模式下调用SWI功能只需将处理器所需要的参数存放于寄存器中,然后调用相应功能号的系统功能。
Mov r0,#80
假设参数为#80
swi 0X1
SWI中断立即数1
由于SWI中断功能调用在特权模式下执行,故而当在特权模式下调用SWI功能时,必须对当前模式下的SPSR和寄存器LR进行保存。
stmfd sp!,{r0-r12,lr}
保存寄存器
mov r1,sp
mov r0, spsr_svc
stmfd sp!,{r0} ;保存SPSR
……
读取立即数,调用SWI中断处理程序
ldmfd sp!,{r0} ;恢复SPSR
msr spsr_svc, r0
ldmdf sp!,{r0-r12,lr}^ ;恢复其他寄存器
4 S3C4510B系统中的IRQ异常中断实例
4.1 IRQ异常中断的产生
S3C4510B处理器系统常用于进行外部异常的响应和操作系统进程的控制。CPSR寄存器的I控制位置0时,处理器在指令边界查询是否有IRQ请求,系统的外部中断管理器或者外设通过使能处理器的IRQ输入管脚产生IRQ异常中断。
4.2 IRQ异常中断的处理程序
IRQ异常中断产生后,根据中断向量的指令跳入相应的中断处理程序。系统的外围中断管理硬件会将所用的IRQ中断请求按照优先级进行排列,把最高优先级的IRQ中断的信息放入寄存器中。通常的IRQ中断处理程序也需要保存返回地址、寄存器,而且需要屏蔽IRQ中断,以保证优先级较高的中断完全处理。
sub lr,lr,#4
stmfd sp!,{lr}
保存返回地址
mrs r14,spsr_irq
stmfd sp!,[r12,r14]
保存r12,spsr
mov r12,#IntBase
读取中断管理接口的基址
ldr r12,[r12,#IntLevel]
计算当前中断的物理地址
mrs r14,cpsr
bic r14,r14,#0X80
清零IRQ中断禁止位
msr cpsr_irq,r14
开IRQ中断
ldr pc,[ pc,r12,lsr #2]
跳转到相应的中断处理程序
dcd PirQ0Handler
dcd PirQ1Handler
…
dcd PirQnHandler
优先级为n的中断处理程序地址
PirQ0Handler
stmfd sp!,{r0-r11}
……
优先级为1的中断处理程序
ldmfd sp!,{r0-r11}
msr spsr_irq,r14
恢复r12和spsr
ldmfd sp!,{pc}^ ;中段返回
……
dcd PirQnHandler
中断优先级为N的中断处理程序
……
中断 技术 异常 系统 S3C4510B ARM 相关文章:
- LPC2292的伪中断与伪中断处理(03-25)
- Linux 2.4.x内核软中断机制(04-06)
- 嵌入式系统开发之中断控制的实现(04-18)
- uC/OS-II的任务切换机理及中断调度优化(05-11)
- μC/OSII的时钟中断技术研究(06-30)
- 微内核RTOS的核外中断管理(07-27)