Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1495747
  • 博文数量: 218
  • 博客积分: 6394
  • 博客等级: 准将
  • 技术积分: 2563
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-08 15:33
个人简介

持之以恒

文章分类

全部博文(218)

文章存档

2013年(8)

2012年(2)

2011年(21)

2010年(55)

2009年(116)

2008年(16)

分类:

2009-06-07 10:46:48

只要正常的程序流被暂时中止,处理器就进入异常模式。例如响应一个来自外设的中断。在处理异常之前,ARM7TDMI内核保存当前的处理器状态(CPSR->SPSR),这样当处理程序结束时可以恢复执行原来的程序(SPSR->CPSR)。
异常的入口和出口处理
如果异常处理程序已经把返回地址拷贝到堆栈,那么可以使用一条多寄存器传送指令来恢复用户寄存器并实现返回。
中断处理代码的开始部分和退出部分

这里注意:中断返回指令的寄存器列表(其中必须包括PC)后的“^”符号表示这是一条特殊形式的指令。这条指令在从存储器中装载PC的同时(PC是最后恢复的),CPSR也得到恢复。这里使用的堆栈指针SP(R13)是属于异常模式的寄存器,每个异常模式有自己的堆栈指针。这个堆栈指针应必须在系统启动时初始化。

进入异常
注意着不是我们的代码完成的部分
在异常发生后,ARM7TDMI内核会作以下工作:
1.在适当的LR中保存下一条指令的地址,当异常入口来自:
ARM状态,那么ARM7TDMI将当前指令地址加4或加8复制(取决于异常的类型)到LR中;
Thumb状态,那么ARM7TDMI将当前指令地址加2、4或加8 (取决于异常的类型)复制到LR中;异常处理器程序不必确定状态。
2.将CPSR复制到适当的SPSR中;
3. 将CPSR模式位强制设置为与异常类型相对应的值;
4.强制PC从相关的异常向量处取指。
注:异常总是在ARM状态中进行处理。当处理器处于Thumb状态时发生了异常,在异常向量地址装入PC时,会自动切换到ARM状态。
=================================================================================
当异常结束时,异常处理程序必须:(我们自己做的)
1.将LR( R14 )中的值减去偏移量后存入PC,偏移量根据异常的类型而有所不同;
2.将SPSR的值复制回CPSR;
3.清零在入口置位的中断禁止标志。
注:恢复CPSR的动作会将T、F和I位自动恢复为异常发生前的值。(如果使用^,ARM7内核自动帮我们做了,相当于封装了)

快速中断请求(FIQ)适用于对一个突发事件的快速响应(数据传输和通道处理)保护的需要(这可以加速上下文切换的速度)。通过处理器上的FIQ输入引脚,由外部产生FIQ异常。
不管异常入口是来自ARM状态还是Thumb状态,FIQ处理程序都会通过执行下面的指令从中断返回:
   SUBS    PC,R14_fiq,#4
    在一个特权模式中,可以通过置位CPSR中的F位来禁止FIQ异常。若F位清零,则ARM在执行完当前指令后时检查FIQ输入引脚。
 
中断请求(IRQ)异常是一个由nIRQ输入端的低电平所产生的正常中断(在具体的芯片中,nIRQ由片内外设拉低,nIRQ是内核的一个信号,对程序员不可见)。IRQ的优先级低于FIQ。对于FIQ序列它是被屏蔽的。任何时候在一个特权模式下,都可通过置位CPSR中的I 位来禁止IRQ。
        不管异常入口是来自ARM状态还是Thumb状态,IRQ处理程序都会通过执行下面的指令从中断返回:
    SUBS    PC,R14_irq,#4
中止
    中止意味着对当前存储器的访问不能完成,由ABORT输入信号触发(高电平),在存储器访问周期末处理器检查该信号。中止包含两种类型:
预取中止    发生在指令预取过程中
数据中止    发生在对数据访问时
        当发生预取中止时,ARM7TDMI内核将预取的指令标记为无效,但在指令到达流水线的执行阶段时才进入异常。如果指令在流水线中因为发生分支而没有被执行,中止将不会发生。
        在处理中止的原因之后,不管处于哪种处理器操作状态,处理程序都会执行下面的指令恢复PC和CPSR并重试被中止的指令:
 SUBS    PC,R14_abt,#4
软件中断指令
          使用软件中断(SWI)指令可以进入管理模式,通常用于请求一个特定的管理函数。SWI处理程序通过执行下面的指令返回:
MOVS    PC,R14_svc
      这个动作恢复了PC并返回到SWI之后的指令。SWI处理程序读取操作码以提取SWI函数编号。
未定义的指令
          当ARM7TDMI处理器遇到一条自己和系统内任何协处理器都无法处理的指令时,ARM7TDMI内核执行未定义指令陷阱。软件可使用这一机制通过模拟未定义的协处理器指令来扩展ARM指令集。
注:ARM7TDMI处理器完全遵循ARM结构v4T,可以捕获所有分类未被定义的指令位格式。
     在模拟处理了失败的指令后,陷阱程序执行下面的指令:
MOVS    PC,R14_svc
        这个动作恢复了PC、CPSR并返回到未定义指令之后的指令。
异常的优先级

复位
当nRESET信号被拉低时(一般外部复位引脚电平的变化和芯片的其它复位源会改变这个内核信号)ARM7TDMI处理器放弃正在执行的指令。
在复位后,除PC和CPSR之外的所有寄存器的值都不确定。
当nRESET信号再次变为高电平时,ARM处理器执行下列操作:
1.强制CPSR中的M[4:0]变为b10011(管理模式);
2.置位CPSR中的I和F位;
3.清零CPSR中的T位;
4.强制PC从地址0x00开始对下一条指令进行取指;
5.返回到ARM状态并恢复执行 。

阅读(4345) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~