昨天的文章,我们谈了ARM处理器的七种运行模式,分别是:用户模式User(usr),系统模式System(sys),快速中断模式(fiq),管理模式Supervisor(svc),外部中断模式(irq),数据访问中止模式Abort(abt),未定义指令中止模式Undfined(und)。
今天我们来谈谈ARM处理器所支持的七种异常处理。
ARM处理器的异常
当程序在正常执行过程中,出现暂时停止时,我们称之为发生了异常。比如说,在程序执行过程中,接到一个外部的中断申请。
处理器在接到中断申请之后,一般要经过下面的步骤:
- 保留当前处理器状态;
- 处理中断;
- 返回中断前状态,继续执行中断前程序。
当有多个中断同时申请时,处理器将按照优先级,顺次进行处理。
需要指出的是,异常并不完全等同与中断,中断只是ARM所支持异常类型的一种。
ARM所支持的异常类型
ARM体系处理器支持的异常处理有7种,下表列出了ARM体系处理器支持的异常及各异常的含义。
- 复位
在复位电平有效时,就会产生复位异常,程序跳转到复位处理程序处执行。复位向量地址是0x00000000开始连续四个字节。复位异常通常用在:系统加电时,系统复位时,跳转到复位向量地址。
- 未定义指令
当遇到不能处理的指令时,产生未定义指令异常。向量地址为:0x00000004开始连续四个字节。
- 软件中断
执行SWI指令产生,用于用户模式下的程序调用特权操作指令。在实时操作系统(RTOS)中可以通过该机制实现系统功能调用。向量地址为:0x00000008开始连续四个字节。
- 指令预取中止
处理器预取指令的地址不存在,或该地址不允许当前指令访问,产生此类异常。向量地址为:0x0000000C开始连续四个字节。
- 数据中止
处理器数据访问指令的地址不存在,或该地址不允许当前指令访问时,产生数据中止异常。向量地址为:0x00000010开始连续四个字节。
- IRQ
外部中断请求有效,且CPSR中的I位为0时,产生IRQ异常。向量地址为:0x00000018开始连续四个字节。
- FIQ
快速中断请求引脚有效,且CPSR中的F位为0时,产生FIQ异常。向量地址为:0x0000001C开始连续四个字节。
ARM处理器对异常的响应过程
如果一个异常出现,复位异常会立即中止当前指令执行,除此之外的其他异常,处理器会尽可能完成当前指令,然后再去处理异常。对异常的响应一般分为以下几步:
- 保存下一条指令的地址(PC)到相应连接寄存器LR_mode中,当处理完异常返回时,从异常发生前的地址处,重新开始执行。
- 将CPSR的内容复制到,将要执行的异常模式对应的SPSR_中。
- 设置当前状态寄存器CPSR的相关位。
- 强制PC从相关的异常向量地址,取下一条指令执行,从而跳转到相应的异常处理程序处。
ARM处理器从异常处理中返回过程
在处理完异常之后,恢复用户任务的正常执行,即从异常处理中返回。ARM处理器从异常中返回,一般分为以下几步:
- 从处理程序的保护堆栈中,恢复异常处理中用过的用户寄存器。
- 将相应SPSR_内容复制回CPSR中,以恢复异常出现前的程序状态。若在进入异常处理时设置了中断控制位,要在此时清除。
- 将连接寄存器LR_的值减去相应的偏移量后送到PC中。
小结
今天我们谈了ARM处理器的七种异常情况,并介绍了对异常的响应过程,和返回过程。深入了解今天的内容,是使用ARM处理器实现嵌入式系统编程的前提。