ARM微处理器的编程模型之:异常中断处理
3.4异常中断处理
异常或中断是用户程序中最基本的一种执行流程和形态。这部分主要对ARM架构下的异常中断做详细说明。
ARM有7种类型的异常,按优先级从高到低的排列如下:复位异常(Reset)、数据异常(Data Abort)、快速中断异常(FIQ)、外部中断异常(IRQ)、预取异常(Prefetch Abort)、软件中断(SWI)和未定义指令异常(Undefined instruction)。
注意 |
在ARM文档中,使用术语Exception来描述异常。Exception主要是从处理器被动接受异常的角度出发,而Interrupt带有向处理器主动申请的色彩。在本书中,对“异常”和“中断”不做严格区分,两者都是指请求处理器打断正常的程序执行流程,进入特定程序循环的一种机制。 |
3.4.1 异常种类
ARM体系结构中,存在7种异常处理。当异常发生时,处理器会把PC设置为一个特定的存储器地址。这一地址放在被称为向量表(vector table)的特定地址范围内。向量表的入口是一些跳转指令,跳转到专门处理某个异常或中断的子程序。
存储器映射地址0x00000000是为向量表(一组32位字)保留的。在有些处理器中,向量表可以选择定位在存储空间的高地址(从偏移量0xffff0000开始)。一些嵌入式操作系统,如Linux和Windows CE就要利用这一特性。
表3.4列出了ARM的7种异常。
表3.4 ARM的7种异常
异 常 类 型 |
处理器模式 |
执行低地址 |
执行高地址 |
复位异常(Reset) |
特权模式 |
0x00000000 |
0xFFFF0000 |
未定义指令异常(Undefined interrupt) |
未定义指令中止模式 |
0x00000004 |
0xFFFF0004 |
软中断异常(Software Abort) |
特权模式 |
0x00000008 |
0xFFFF0008 |
预取异常(Prefetch Abort) |
数据访问中止模式 |
0x0000000C |
0xFFFF000C |
数据异常(Data Abort) |
数据访问中止模式 |
0x00000010 |
0xFFFF0010 |
外部中断请求IRQ |
外部中断请求模式 |
0x00000018 |
0xFFFF0018 |
快速中断请求FIQ |
快速中断请求模式 |
0x0000001C |
0xFFFF001C |
异常处理向量表如图3.5所示。
当异常发生时,分组寄存器r14和SPSR用于保存处理器状态,操作伪指令如下。
R14_exception_mode> = return link
SPSR_exception_mode> = CPSR
CPSR[4∶0] = exception mode number
CPSR[5] = 0 /*进入ARM状态*/
If exception_mode> = = reset or FIQ then
CPSR[6] = 1 /*屏蔽快速中断FIQ*/
CPSR[7] = 1 /*屏蔽外部中断IRQ*/
PC = exception vector address
图3.5 异常处理向量表
异常返回时,SPSR内容恢复到CPSR,连接寄存器r14的内容恢复到程序计数器PC。
1.复位异常
当处理器的复位引脚有效时,系统产生复位异常中断,程序跳转到复位异常中断处理程序处执行。复位异常中断通常用在下面两种情况下。
· 系统上电。
· 系统复位。
当复位异常时,系统执行下列伪操作。
R14_svc = UNPREDICTABLE value
SPSR_svc = UNPREDICTABLE value
CPSR[4∶0] = 0b10011 /*进入特权模式*/
CPSR[5] = 0 /*处理器进入ARM状态*/
CPSR[6] = 1 /*禁止快速中断*/
CPSR[7] = 1 /*禁止外设中断*/
If high vectors configured then
PC = 0xffff0000
Else
PC = 0x00000000
评论