中断与异常
定义
ARM 中的工作模式除 User 和 System 外,均为异常模式,这里的异常是广义的,包含以下三类情况
外部中断(外部中断)
由于 CPU 外部的原因而改变程序执行流程,属于异步事件,可以屏蔽
软件中断(自陷)
通过处理器拥有的软件指令,可预期地使正在执行的程序改变执行流程,以执行特定的程序
显式的事件,无条件执行
属同步事件,且不可屏蔽
例如 Motorola 68000 系列的 Trap 指令、ARM 中的 SWI、Intel 8086 中的 INT
异常
由 CPU 内部的原因(如非法指令)或外部的原因(如访存错误)引起的事件
没有对应的处理器指令
异常发生时,处理器无条件地挂起当前运行的程序,去执行特定的处理程序
属同步事件,且不可屏蔽
ARM 处理器把上述三种事件以异常模式来处理,通过异常向量来响应。ARM 的每个异常向量中存放的是一条指令(一般是跳转指令),异常发生时,CPU 自动到指定的向量地址读取该指令并执行。
异常向量表
ARM 的异常向量一般是完成程序跳转的指令
在 ARM720T,ARM9 系列及以后的内核中,异常向量表可放置在 0xFFFF0000 开始的高位地址空间
具体内容
如果异常处理程序的起始地址位于 32MB 的范围内,可以直接用分支指令完成跳转
如果异常处理程序的起始地址是一个合法的 ARM 指令立即数(可由0~255内的数循环右移偶数位得到),则可以用数据传输指令将该地址加载到 PC 中
其他情况需采用 LDR 指令完成对 PC 的加载
ARM 引起的异常事件类型
异常响应过程
当一个异常产生,处理器核会
把 CPSR 的内容拷贝到对应模式下的 SPSR_< mode> 寄存器中
设置 CPSR 的相关位(改变到ARM态、改变到异常模式 、关闭中断(如果适合))
把返回地址保存在对应模式下的 LR_< mode> 寄存器中
把 PC 拨到异常向量表地址
从异常返回,异常处理程序需要
从 SPSR_< mode> 恢复 CPSR
把 PC 拨到 LR_< mode> 指向的地址(返回地址加载到 PC)
以上只能在 ARM 状态完成
Reset 异常
Reset 被触发时,CPU 进入 Supervisor 模式并禁止 FIQ 和 IRQ
R14_svc = 不确定的值
SPSR_svc = CPSR
CPSR[4:0] = 0b10011 ;进入管理模式
CPSR[5] = 0 ;在ARM态中执行
CPSR[6] = 1 ;禁止快速中断FIQ
CPSR[7] = 1 ;禁止普通中断IRQ
未定义指令异常
触发该异常,有两种情形
CPU 执行一条协处理器指令,未等到任何协处理器的应答
CPU 执行一条未被定义的指令时
一旦发生该异常,CPU 将完成如下动作
R14_und = 未定义指令的下一条指令地址
SPSR_und = CPSR
CPSR[4:0] = 0b11011 ;进入未定义模式
CPSR[5] = 0 ;在ARM态中执行
CPSR[7] = 1 ;禁止普通中断IRQ
常用的异常返回方式
MOVS PC, R14 ;跳过发生异常的指令
SUBS PC, R14, #4 ;重新执行发生异常的指令
软件中断异常
执行 SWI 指令时触发,主要用于进入 OS 的系统调用
R14_svc = SWI指令的下一条指令地址
SPSR_svc = CPSR
CPSR[4:0] = 0b10011 ;进入管理模式
CPSR[5] = 0 ;在ARM态中执行
CPSR[7] = 1 ;禁止普通中断IRQ
常用的异常返回方式:MOVS PC, R14
指令预取异常
读取指令时发生读内存错误时被标记为中止,该指令还要执行时触发该异常,若未执行,不触发该异常
即 CPU 试图执行已被标记为无效的指令时,触发该异常
R14_abt = 中止指令的下一条指令地址
SPSR_abt = CPSR
CPSR[4:0] = 0b10111 ;进入中止模式
CPSR[5] = 0 ;在ARM态中执行
CPSR[7] = 1 ;禁止普通中断IRQ
常用的异常返回方式:SUBS PC, R14, #4
数据中止异常
CPU 和存储系统之间进行加载/存储数据操作时,若发生错误则触发该异常,分为两种情况
内部中止异常
由CPU内核自己引起,如 MMU/MPU 错误,意味着需要采取正确的措施并重新执行合适的指令
外部中止异常
由存储系统引起,可能是硬件错误,可能是内存地址不存在
R14_abt = 中止指令的下一条指令地址
SPSR_abt = CPSR
CPSR[4:0] = 0b10111 ;进入中止模式
CPSR[5] = 0 ;在ARM态中执行
CPSR[7] = 1 ;禁止普通中断IRQ
常用的异常返回方式
SUBS PC, R14, #4 ;跳过发生异常的指令
SUBS PC, R14, #8 ;返回到发生异常的指令
IRQ
当外部IRQ输入请求发生并且IRQ中断响应已经被使能,触发该异常
R14_irq = 下一条指令地址
SPSR_irq = CPSR
CPSR[4:0] = 0b10010 ;进入IRQ模式
CPSR[5] = 0 ;在ARM态中执行
CPSR[7] = 1 ;禁止普通中断IRQ
常用的异常返回方式:SUBS PC, R14, #4
FIQ
当外部 FIQ 输入请求发生并且 FIQ 中断响应已经被使能,触发该异常
通常用于快速传输数据
R14_fiq = 下一条指令地址
SPSR_fiq = CPSR
CPSR[4:0] = 0b10001 ;进入FIQ模式
CPSR[5] = 0 ;在ARM态中执行
CPSR[6] = 1 ;禁止快速中断FIQ
CPSR[7] = 1 ;禁止普通中断IRQ
常用的异常返回方式:SUBS PC, R14, #4
异常返回
除复位异常外,其他异常在处理完成后都可以返回异常发生时被打断的程序中继续执行
通常在异常处理程序的最后使用一条数据传输指令来完成
在异常模式下,在指令后加后缀 ’ S ’ ,将 PC 作为目标寄存器,这样不仅将更新 PC 的值,还会将 SPSR 寄存器的内容加载到 CPSR 中
校正返回地址的一大原因是 ARM 处理器的流水线
计算返回地址的注意点
发生异常时 PC 的值是否已经更新
异常返回后被中断的指令是否还需要执行
LR = PC - 4
异常优先级
异常被赋以了优先级,据此决定被响应的顺序
在所有异常的入口,IRQ 中断被屏蔽,只有重新被使能才可触发内核响应(如中断嵌套处理)
在 FIQ 和 Reset 异常的入口,FIQ 中断被屏蔽
异常处理中的寄存器使用
异常发生时伴随的模式切换意味着, 被调用的异常处理程序会访问
它自己的堆栈指针 (SP_)
它自己的链接寄存器 (LR_)
它自己的备份程序状态寄存器 (SPSR_)
如果是 FIQ异常处理,5个其它的通用状态寄存器 (r8_FIQ to r12_FIQ)
其它寄存器和原来模式下的寄存器是相同的
在外部接口上,堆栈指针(SP_) 必须保持8字节对齐
异常处理程序在返回前必须保证其它(被破坏的寄存器) 被重新载入,以恢复到异常发生前的状态
这可以通过将工作(即被破坏)寄存器的内容压栈,而在返回前出栈恢复来完成
应用的初始化代码将执行必要的寄存器初始化工作
中断处理
ARM 可响应两个外部中断请求信号,FIQ 和 IRQ
FIQ 中断比 IRQ 中断的优先级更高
当多个中断发生时,首先处理 FIQ
在响应 FIQ 中断时屏蔽 IRQ 中断(和 FIQ中断),直到 FIQ 中断处理程序完成,IRQ 中断才会被处理
以下设计使得 IFQ 尽快的响应
FIQ 向量在异常向量表的最后,使 FIQ 处理程序可以直接从 FIQ 向量开始,省去跳转的时间
FIQ 模式下有五个额外的寄存器 (R8_FIQ to R12_FIQ),这些寄存器在进入和退出 FIQ 时不需保存和恢复
FIQ 中断在 FIQ 中断处理程序的入口是被屏蔽的,需要重新使能(FIQ 中断源可以有多个,但是为了最好的系统性能应该避免 FIQ 中断的嵌套)
绝大多数基于 ARM 的系统有两个以上的中断源,因此需要一个中断控制器 (通常是内存映射编址))来控制中断信号如何进入 ARM 芯片
上一篇:Arm架构异常处理流程之中断
下一篇:ARM异常与中断处理
推荐阅读最新更新时间:2024-11-17 04:46
设计资源 培训 开发板 精华推荐
- DeepLabCut :对执行各种任务的动物进行无标记姿势估计
- LTC3559/LT3559-1 的典型应用 - 具有双降压稳压器的线性 USB 电池充电器
- 51最小系统
- ESP8266继电器开关
- 使用 NXP Semiconductors 的 MC13892VK 的参考设计
- EVB-LAN9730-MIIm,使用 LAN9730 高速 USB 2.0 HSIC 到 10/100 以太网客户的评估板
- 使用 Diodes Incorporated 的 PT8A3519 的参考设计
- MC78M12CTG 12V 电流调节器的典型应用
- 20个墨水屏菊花链玩法
- AP3154AEVM,基于 AP3154A 120mA 高效电荷泵白光 LED 驱动器的评估板