系统学习ARM之六 --异常处理

一、简介

异常:
    是一种突发情况。异常发生后,处理器要进行相应的处理(异常处理),切换到对应的异常工作模式。

二、四大步三小步:(异常处理的硬件完成的事项

    (1)拷贝 CPSR 到 SPSR_
    (2)设置适当的 CPSR 位:
        ①改变处理器状态进入 ARM 状态  
        ②改变处理器模式进入相应的异常模式
        ③设置中断禁止位禁止相应中断 (如果需要)
    (3)保存返回地址到 LR_
    (4)设置 PC 为相应的异常向量

三、异常处理的返回: --通过异常返回指令

1. 要做的

  • 从 SPSR_恢复CPSR
  • 从LR_恢复PC

2. 返回的具体实现指令

    ①第一种方式: 指令带 “S” 后缀 + PC做为目的寄存器
          movs  pc,lr
    ②第二种方式: 如果 lr之前被压栈的话使用LDM  +“ ^”
          ldmfd sp!,{ pc }^

注意:有些异常处理返回值需要修正lr寄存器
    所有从异常返回的情况
     a、从SWI 和Undef 异常返回
         movs  pc,lr
      b、从FIQ, IRQ 和 预取异常(Prefect Abort)返回
          SUBS pc,lr,#4      ==       @ pc = lr -4 和 cpsr = spsr 两句
      c、 从数据异常( Data Abort)返回
          SUBS pc,lr,#8
      d、如果LR之前被压栈的话
        MOVS pc,lr

四、异常源处理优先级表

1. 表

    Reset                最高
    Data Abort        //数据存取异常
    FIQ
    IRQ
    Prefetch Abort
    SWI
    Undefined instruction

2. 向量表指令

    ①异常向量表:放的是 不同异常源的处理地址
    ②异常向量表指令:
          LDR PC, [PC, #+0xFF0]      可寻址±4k
          MOV PC, #0x30000000       立即数
          B IRQ_handler            可寻址±32M

五、中断控制器

1. 为什么会有中断控制器?

     ARM内核(小核)只有两个中断源, 用中断控制器来扩展中断源

2. 中断控制器要实现的功能 / 中断控制器的作用

  1. 择优----(优先级)
  2. 跳转到对应的中断处理函数
  3. 选择处理该中断源的cpu

六、FIQ 比 IRQ快的原因

  1. fiq 比 irq 的优先级高
  2. FIQ 向量位于向量表的最末端,异常处理不需要跳转
  3. FIQ 比 IRQ 多5个私有的寄存器(r8-r12),在中断操作时,压栈出栈操作的少。

你可能感兴趣的:(linux,arm的异常处理,fiq,irq,中断处理过程)