sunzl1987

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

-----------------------------------------------------------------------------------------------------------------------------------

ARM 920T     S3C2440A

-----------------------------------------------------------------------------------------------------------------------------------

异常
  异常类型
           7种,分别是RST,UND,SWI,PRE_ABT,DATA_ABT,IRQ,FIQ
  异常模式
       5种,分别是SVC,UND,ABT,IRQ,FIQ
  异常触发
        SWI指令,SWI 0x4
    异常响应
      硬件做4件事情
          1 保存 PC 到 LR_exp
          2 保存 CPSR 到 SPSR_exp
          3 修改 CPSR 到 exp
          4 修改 PC 到 exp->0x??
  异常向量表
      从 0 地址开始
      一共8个表项,其中0x14地方保留
      每个表项是 一条跳转指令 
       B handler  (0xEAxxxxxx)
       ldr pc, =...  
    保存现场
      压栈保存,stmfd sp!, {r0-r12, lr}
  异常处理
      通常用 C 语言实现,通过 r0, r1, r2, r3 传参
   恢复现场
      出栈保存,ldmfd sp!, {r0-r12, lr}
   异常返回
      要点:地址和模式的返回必须同时完成
      movs pc, lr
      ldmfd sp!, {r0-r12, pc}^
   系统调用的实现
      用汇编SWI,通过 mov r0, r1, r2
      用C实现SWI, int __swi(0x4)  syscall(int,...);
--------------------------------------------------------------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------------------------------------

中断 
      中断源
      使能 enable
           触发方式 trigger method  
     中断控制器
      屏蔽位 mask
      悬挂位 pending
      模式选择 IRQ/FIQ
     ARM内核
      IRQ禁止位 CPSR I-bit
    中断的初始化流程
      设置好 0x18 处的跳转指令 b irq_handler
      设置 IRQ 模式下的栈指针 sp
      设置 SVC 模式下的栈指针 sp
      初始化中断源 GPIO
                设置 GPF0 管脚的功能复用模式为 EINT0
                设置 EINT0 功能触发方式为 Falling Edge Trigger
      初始化中断控制器 Interrupt Controller
           设置 INTMSK 屏蔽位 打开unmask
           设置 INTMOD 模式为 触发IRQ异常
           清除 INTPND, SRCPND 已有的bit
      设置CPSR的I-bit ,清除禁止位
           汇编语言,用 MSR 特权指令
      满足中断触发条件,制造出一个下降沿  
     中断处理
      清除 Pending Bit 悬挂位
           1 先清除,再处理(为了防止丢失在处理过程中再来的同源中断)
           2 先清除SRCPND,再清除INTPND(否则就会重复一次中断,来2次)
           3 写1清0,写0则无效 PDN = 1<<0
    中断返回 (IRQ&FIQ)
      subs pc, lr, #4
--------------------------------------------------------------------------------------------------------------------------------------------------------------------- 

posted on 2012-01-15 19:52  Sanz  阅读(606)  评论(0编辑  收藏  举报