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

来源:互联网 发布:jboss 1099端口 编辑:程序博客网 时间:2024/05/17 00:56

一、简介

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

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

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

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

1. 要做的

  • 从 SPSR_<mode>恢复CPSR
  • 从LR_<mode>恢复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),在中断操作时,压栈出栈操作的少。

0 0
原创粉丝点击