异常种类

  •         中断             IRQ FIQ                          外部硬件触发
  •         软中断          Soft interrupt                  系统调用
  •        复位               Reset                             如手机死机了,按power键
  •        未定义指令    Undefined instruction   
  •        数据异常        Data abort                    数据越界

   中断异常

       ARM有俩级外部中断 FIQ ,IRQ

      大多数基于ARM的系统有 > 2个中断源,因此需要一个中断控制器

      Note:  通常中断处理程序总是包含清除中断源的代码

异常处理过程 

 异常向量表

 异常与工作模式关系

          复位,软中断                                             -->  SVC

         Prefetch(预取),Data Abort                   --> Abort

         user system 模式不是异常触发切换的·,是程序员修改CPSR,实现切换的

    软中断程序:

    .text
    @异常向量表
    b     reset            @0x00    reset
    ldr   pc,_udef         @0x04    udef
    ldr   pc,_swi_handler  @0x08    swi   软中断程序的入口  突破32m空间的限制
    ldr   pc,_prefech      @0x0c    prefetch abort
    ldr   pc,_data_abort   @0x10    data  abort
    nop                    @0x14    reserved
    ldr   pc,_irq          @0x18    irq
    ldr   pc,_fig          @0x1c    fig

_udef:
    .word _udef
_swi_handler:
    .word swi_handler
_prefech:
    .word _prefech
_data_abort:
    .word _data_abort
_irq:
    .word _irq
_fig:
    .word _fig


swi_handler:
    stmfd sp!,{r0,lr}    @进栈保护现场
    sub ro,lr,#4
    ldr r0,[r0]
    bic r0,#0xff000000
    bl swi_num_handler
    ldmfd sp!,{r0,pc}^    @出栈恢复现场

swi_num_handler:

    @switch(num)
    @{
    @    case 2:
    @    ...
    @    case 4:
    @    ...

    cmp r0,#2
    moveq r7,#2
    cmp r0,#4
    moveq r7,#4
    mov pc,lr

reset:
    ldr sp,=stack_base

    @切换到应用程序

    msr cpsr,#0x10
    mov r0,#3

    @    open    read    write    ioctl    ...通过系统调用访问内核数据
    @      2      4         6       7

    swi 2     @跳转到异常向量表软中断的入口位置
              @保存返回地址到LR
              @切换到SVC工作模式
    mov r1,r0
    swi 4
    mov r6,#3
    nop
    nop
    swi 7
    mov r8,#0
    b reset

    .data
buf:
    .space 32
stack_base:


    .end