Cortex-A8异常处理

1.异常向量和优先级

异常发生时,处理器会将PC设定为一个特定的存储器地址,这些特定的存储器地址称为异常向量。所有的异常向量被集中放在程序存储器的一个连续地址空间中,称为异常向量表。每个异常向量占4字节,异常向量处是一些跳转指令,跳转到相应的异常处理函数。

通常存储器地址映射地址0x00000000是为异常向量表保留的。但某些嵌入式系统配置使能的时候,低端的异常向量可以选择映射到特定的高端地址0xFFFF0000。Cortex-A8处理器支持通过CP15的C12寄存器将异常向量的首地址设置在任意位置。

 

每一种异常都会导致内核进入一种特定的模式。此外,也可以通过编程改变CPSR,进入ARM处理器模式。用户模式和系统模式是仅有的不可通过异常进入的俩种模式,要进入这俩种模式,必须通过编程改变CPSR。

2.异常响应过程

通常异常响应的过程大致分为以下几个步骤:

  1. 保护断点,即保存下一个将要执行的指令的地址,就是把这个地址送入堆栈;
  2. 寻找中断入口,根据不同的中断源产生的中断,查找不同的入口地址;
  3. 执行中断处理程序;
  4. 中断返回,执行完中断指令后,就从中断处返回到主程序继续执行。

在ARM处理器中,当异常发生时,除了复位异常会立即中止当前指令的执行,其他的异常都是在处理器完成当前指令后再执行异常处理程序。ARM处理器对异常的响应过程如下:

  1. 进入与特定的异常响应的运行模式。
  2. 将CPSR寄存器的值保存到将要执行的异常中断对应的SPSR_mode中,以实现对处理器当前状态、中断屏蔽和各标志位的保护
  3. 将引起异常指令的下一条指令的地址存入相应的链接寄存器LR(R14_mode),以便程序在异常处理结束能正确返回到原来的程序继续向下执行。
  4. 设置CPSR寄存器的低5位,使处理器进入相应的工作模式。设置I=1,以禁止IRQ(外部)中断;如果进入复位异常、快速中断异常,还要设置F=1禁止FIQ中断。
  5. 根据异常类型,将向量地址强制复制给程序计数器PC,以便执行相应的异常处理程序。例如,复位异常发生的时候,存储器地址映射地址0x00000000是为异常向量保留的情况下,则PC=0x00000000;如果异常向量表选择映射到特定的高端地址0xFFFF0000处,则PC=0xFFFF0000。

每种异常模式对应的俩个寄存器R13_mode、R14_mode,分别存放堆栈指针和断点的地址。

3.异常返回过程

复位异常发生后,系统自动从0x00000000开始重新执行程序,因此复位异常处理程序执行完后无须返回。其他的异常处理完成后必须返回程序的端点处继续执行。

  1. 恢复原来保存的用户寄存器。
  2. 将SPSR_mode寄存器的值复制到CPSR中,以恢复被中段的程序工作状态。
  3. 根据异常类型将PC寄存器恢复成断点地址,以执行原来被中断打断的程序。
  4. 清除CPSR中的中断屏蔽标志位I和F,开放外部中断和快速中断。

程序状态字和断点地址的恢复必须同时进行。

当返回地址保存在当前模式的R14_mode中时,从不同的模式返回,所用的指令有所不同:

(1)FIQ(快速中断)和IRQ(外部中断)的返回指令

SUB PC, R14_FIQ, #4 SUB PC, R14_IRQ, #4

FIQ和IRQ必须返回前一条指令(R14_mode中存的是被打断的下一条),以便执行因为异常而未执行的指令,所以该返回指令将寄存器R14的值减4后复制到程序计数器PC中,从而实现从异常处理程序中返回,同时将SPSR_fiq/SPSR_irq寄存器的值复制到当前程序状态字寄存器CPSR中。

(2)ABORT(数据访问终止)的返回指令

SUB PC, R14_abt, #4;指令预取中止返回 SUB PC, R14_abt, #8;数据中止返回

(3)SWI(软件中断异常)/未定义指令的返回值指令

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值