ARM 体系的异常中断
6.1.1 异常中断的种类
响应过程称之为异常中断。例如当ARM 系统检测到外部的复位信号有效,ARM 系统的程
序就会跳转到复位处理程序。在处理异常之前,ARM 内核保存当前的处理器状态,这样当
处理程序结束时可以恢复执行原来的程序。当然ARM 体系的产生异常中断后,会按照一定
的程序进行中断处理。下面我们分别介绍ARM 系统异常,ARM 体系异常中断包括复位、
未定义的指令、软件中断,指令预取中断等。
●复位(Reset ):当处理器的复位引脚有效时,系统产生复位异常中断,程序跳转到复位异
常中断处理程序处执行。复位异常中断通常用在下面两种情况:①系统加电时 ②系统复位
时。
●未定义的指令(undefined instruction):当ARM 处理器或者时系统中是协处理器认为当前指
令未定义时,产生未定义指令异常中断。可以通过该异常中断机仿真浮点向量的运算。
●软件中断(Soft interrupt SWI):这时有用户定义的中断指令。可用于用户模式下的程序调
试特权操作指令。在实际的操作中可以通过该机制实现系统功能的调用。
●指令预取中止(Prefech Abort) :如果处理器预取的指令的地址不存在,或者该地址不允许
当前指令访问,当该预取的指令执行时,处理器产生指令预取中止异常中断。
数据访问中止(Data Abort):如果数据访问指令的目标地址不存在,或许该地址不允许当前
指令访问,处理器产生。
●外部中断请求(IRQ):当处理器的外部中断请求引脚有效,而且 CPSR 寄存器的 1 位控
制位被清除时,处理器产生外部中断请求(IRQ)异常中断。系统中个外设通常通过该异常
中断请求处理器服务。
●快速中断请求(FIQ ):当处理器外部快速中断请求引脚有效,而且 CPSR 寄存器的 F 控
制位被清除时,处理器产生外部中断请求(FIQ )异常中断。
6.1.2 处理异常中断的寄存器
中止模式(Abort abt ) 用于虚拟存储及存储保护
未定义指令模式(Undefined und ) 用于支持通过软件仿真硬件的协处理器
系统模式(System sys) 用于运行特权级的操作系统
R13_svc 表示特权模式下的R13 寄存器,R_13abt 表示中止模式下的R13 寄存器,其余的各
寄存器名称含义类推。
用户模式 系统模式 特权模式 中止模式 未定义指令模式 外部中断模式 快速中断模式
CPSR CPSR CPSR CPSR CPSR CPSR CPSR
必须保存和恢复这些寄存器。
必须使用伪操作RN 来定义这些名称。例如我们要使用寄存器R13_abt 可以使用下面的语句。
过给各异常中断赋予一定的优先级来实现这种处理次序。当然有些异常中断时不可能同时发
生的,如指令预取中止异常中断和阮籍异常中断时由同一条指令的执行触发,它们时不可能
同时发生的。处理器执行一个特定的异常中断的过程中,称为处理器处于特定的中断模式。
各异常中断的中断向量地址以及中断的处理优先级如表 6.3 所示。
中断向量地址 异常中断类型 异常中断模式 优先级(6 级最低)
0x0 复位 特权模式(SVC) 1
0x4 未定义的指令 未定义的指令中止模式 6
0x8 软件中断 特权模式 6
0x10 数据访问中止 中止模式 2
0x14 保留 未使用 未使用
0x18 外部中断请求 外部中断模式 4
0x1c 快速中断请求 快速中断模式 3
6.1.4 进入异常中断
6.1.5 退出异常中断
ARM 系统处理完中断后从异常中断处理程序中返回包括下面的步骤。
因为整个应用系统时从复位异常中断处理程序执行的,所以复位异常中断处理程序不需要返
回。
不同的。同样,返回地址对于各种不同的异常中断也是不同的。
下面我们分别介绍各种异常中断处理程序的返回方法。
1.SWI 和未定义指令异常中断处理程序的返回
SWI 和未定义指令异常中断是由当前执行的指令自身产生的,当 SWI 和未定义指令异常中断
产生时,程序及顺气 PC的值还未更新,它指向当前指令后面第 2 指令(对于 ARM指令来说,
它指向当前指令地址加 8 个字节的位置;对于 Thumb 指令来说,它指向当前指令地址加 4
个字节的位置)。当 SWI 和未定义指令异常中断发生时,处理器将值(PC-4)保存到异常模
式下的寄存器 lr_mode中。这时(PC-4)即指向当前的下一条指令。因此返回操作可以通过
下面的指令来实现:
MOV PC,LR
寄存器内容复制到当前程序状态寄存器 CPSR 中。
保存被中断程序的执行现场,在退出异常中断处理程序时恢复被中断程序执行现场。异常中
断处理程序中使用的数据栈由用户提供。
SPSR_mode 寄存器内容复制到当前程序状态寄存器 CPSR 中。该指令只能在特权模式下使用。
2.IRQ和 FIQ 异常中断处理程序的返回
许 IRQ 中断及 FIQ 中断。如果有中断引脚有效,并且系统允许该中断产生,处理器将产生
IRQ 异常中断或 FIQ 异常中断。当 IRQ 和FIQ 异常中断产生时,程序计数器 PC 的值也经更
新,它指向当前指令后面第 3 条指令(对预 ARM 指令来说,它指向当前指令地址加 12 个字
节的位置;对于 Thumb 指令来说,它指向当前指令地址加 6 个字节的位置)。当 IRQ 和 FIQ
异常中断发生时,处理器将值(PC-4)保存到异常模式下的寄存器 lr_mode 中。这时(PC-4)
即指向当前指令后的第 2 条指令。因此返回操作可以通过下面的指令来实现:
该指令将寄存器LR中的值减4后,复制到程序计数器PC中,实现程序返回,同时将SPSR_mode
寄存器内容复制到当前程序状态寄存器 CPSR 中。
当异常中断处理程序中使用了数据栈时,可以通过下面的指令进入异常中断处理程序时保存
被中断程序的执行现场。异常中断处理程序中使用的数据栈由用户提供。
SPSR_mode 寄存器内容复制到当前程序程序寄存器 CPSR 中。该指令只能在特权模式下使用。
3.预取中止异常中断处理程序的返回
在指令预取时,如果目标地址时非法的,该指令将被标记称有问题的指令。这时,流水线上
该指令之前的指令继续执行。当执行到该被标记称有问题的指令时,处理器产生指令预取中
止异常中断。
指令。因此指令预取中止异常中断程序应该返回到产生该指令预取中止异常中断的指令处。
而不是像前面两种情况下返回到发生中断的指令的下一条指令。
时,程序计数器 PC 的值还未更新,指向它当前指令后面第 2 条指令(对于 ARM 指令来说,
它指向当前指令地址加 8 各字节的位置;对于 Thumb 指令来说,它指向当前指令地址 4个字
节的位置)。当指令预取中止异常中断发生时,处理器将值(PC-4)保存到异常模式下的寄
存器 lr_mode 中。这时(PC-4)即指向当前指令的下一条指令。因此返回操作可以通过下面
的指令来实现:
SUSB PC , LR ,#4
该指令将寄存器 LR 中的值减 4 后,复制到程序计数器 PC 中,实现程序的返回,同时将
SPSR_mode 寄存器内容复制到当前程序状态寄存器 CPSR 中。
时保存被中断程序的执行现场,在推出异常中断处理程序时恢复被中断程序的执行现场。异
常中断处理程序中使用的数据栈由用户提供。
SPSR_mode 寄存器内容复制到当前程序状态寄存器 CPSR 中。该指令只能在特权模式下使用。
4.数据访问中止异常中断处理程序返回
评论