? 处理器处于Thumb状态,则当异常向量地址加载入PC时,处理器自动切换到ARM状态。ARM微处理器对异常的响应过程用伪码可以描述为:
R14_
CPSR[5] = 0 ;在ARM状态下执行 If
;禁止快速中断FIQ
CPSR[7] = 1 ;禁止正常中断IRQ PC = Exception Vector Address ;转入异常入口地址
每个异常模式对应2个寄存器R13_
异常处理完毕之后,应恢复用户任务的正常执行,这就要求异常处理程序能够准确的恢复异常发生时的用户状态,即从异常处理中返回。ARM处理器执行以下几步操作实现从异常返回:
1)异常处理中用过的用户寄存器,须从处理程序的的保护堆栈中恢复;
2)将相应SPSR_
3)将连接寄存器LR_
说明:可以认为应用程序总是从复位异常处理程序开始执行的,因此复位异常处理程序
不需要返回。
异常处理程序中使用的数据堆栈由用户提供,ARM处理器堆栈操作的寄存器保存与恢复指令有:
STMFD SP!,{reglist,lr} ;将寄存器列表和R14存入堆栈
;? ?
LDMFD SP!,{reglist,pc} ;将堆栈内容恢复到寄存器列表和PC 注意:对于不同异常类型,其返回地址处理操作不同 。
36
§2.4.2 ARM异常类型描述 1、复位(Reset)异常
ARM处理器一旦复位电平有效时,产生复位异常,处理器立即停止执行当前指令,进行复位异常处理,进入管理运行模式(SVC),转到复位处理程序处执行。复位向量地址是0x0000 0000开始连续四个字节。复位异常通常用在系统加电时、系统复位时或看门狗强行复位,跳转到复位向量地址。
复位后,ARM处理器自动完成如下操作: R14_
SPSR_
CPSR[4:0] = 10011 ;进入管理运行模式(SVC) CPSR[5] = 0 ;切换到ARM状态下执行 CPSR[6] = 1
;禁止快速中断FIQ
CPSR[7] = 1 ;禁止正常中断IRQ
PC = 0x0000 0000 ;转入复位异常入口地址(低端向量配置)
注:进入复位异常处理程序后永不返回。 2、未定义指令(Undefined Instruction)异常
? 当ARM处理器遇到不能处理的指令时,会产生未定义指令异常,进入未定义指令(UN运行模式(UND), 转到未定义指令异常处理程序处执行。 未定义指令异常向量地址是0x0000 0004开始连续四个字节。采用这种机制,可以通过软件仿真扩展ARM或Thumb指令集。
? 处理器工作状态无论是在ARM状态还是Thumb状态,执行以下指令,从未定义异常模式返回:
MOVS PC, R14_und ;PC<=R14_und,CPSR<=SPSR_und
? 以上指令恢复PC(从R14_und)和CPSR(从SPSR_und)的值,并返回到未定义指令后的下一条指令。(说明:对于MOVS和SUBS指令,当目标寄存器是PC时,该指令除完成将结果送到PC的操作外,还完成将SPSR_
软件中断指令(SWI)用于进入管理模式,常用于请求执行特定的管理功能。软件中断异常向量地址是0x0000 0008开始连续四个字节。软件中断处理程序执行以下指令
37
可以从SWI模式返回(无论是在ARM状态还是Thumb状态):
MOVS PC , R14_svc ;PC<=R14_svc,CPSR<=SPSR_svc
以上指令恢复PC(从R14_svc)和CPSR(从SPSR_svc) 的值,并返回到SWI的下一条指令。
4、中止(ABORT)异常
产生中止异常意味着对存储器的访问失败,ARM处理器进入中止运行模式(ABT)。ARM处理器在存储器访问周期内检查是否发生中止异常。中止异常包括两种类型: ?●指令预取中止异常?
? 当指令预取访问存储器失败时,存储器系统向ARM处理器发出存储器中止(Abort)信号,预取的指令被记为无效,但只有当处理器试图执行无效指令时,指令预取中止异常才会发生,如果指令未被执行,例如在指令流水线中发生了跳转,则预取指令中止不会发生。预取指令中止异常向量地址是0x0000 000c开始连续四个字节。 ●数据访问中止异常
? 当数据访问指令的目标地址不存在,或者该地址不允许当前指令访问时,处理器产生数据访问中止异常。若数据访问中止发生,系统的响应与指令的类型有关,指令执行完后才发生异常。数据访问中止异常向量地址是0x0000 0010开始连续四个字节。 ●中止异常处理返回
当确定了中止的原因后,Abort处理程序均可以执行以下指令从中止模式返回(无论是在ARM状态还是Thumb状态):
SUBS PC, R14_abt, #4 ;指令预取中止异常返回指令。 SUBS PC, R14_abt, #8 ;数据访问中止异常返回指令。 5、IRQ(Interrupt Request)
IRQ异常属于正常的中断请求,在CPSR[I]=0及CPSR[F]=0时,可通过对处理器的nIRQ引脚输入低电平来产生IRQ异常。系统中各外设常通过该异常中断请求处理器服务。IRQ异常向量地址是0x0000 0018开始连续四个字节。IRQ的优先级低于FIQ,当程序执行进入FIQ异常时,IRQ会被屏蔽掉。
? 若将CPSR的I位置为1,则会禁止IRQ中断,若将CPSR[I]=0及CPSR[F]=0,处理器会在指令执行时检查IRQ的输入。注意只有在特权模式下才能改变I位的状态。
38
? 不管是在ARM状态还是在Thumb状态下进入IRQ模式,IRQ处理程序均可以执行以下指令从IRQ模式返回:
SUBS PC, R14_irq, #4 ;PC<=R14_irq-4, CPSR<=SPSR_irq 上面的指令恢复PC和CPSR后,并返回被中断的程序去继续执行。
6、FIQ(Fast Interrupt Request)
FIQ异常是为了支持数据传输或者通道处理而设计的。在FIQ模式下有独立的R8_fiq~R12_fiq寄存器,应用中可以避免对寄存器保存的需求,减少了上下文切换的总开销。
? 若将CPSR的F位置为1,则会禁止FIQ中断,若将CPSR的F位清零,处理器会在指令执行时检查FIQ的输入。注意只有在特权模式下才能改变F位的状态。 ? 可由外部通过对处理器上的nFIQ引脚输入低电平产生FIQ。FIQ异常向量地址是0x0000 001c开始连续四个字节。不管是在ARM状态还是在Thumb状态下进入FIQ模式,FIQ处理程序均可以执行以下指令从FIQ模式返回:
SUBS PC, R14_fiq, #4 ;PC<=R14_fiq-4,CPSR<=SPSR_fiq 上面的指令恢复PC和CPSR后,并返回被中断的程序去继续执行。
§2.4.3 异常向量表(Exception Vectors)与异常优先级(Exception Priorities)
异常向量表中指定了各异常与其处理程序首地址的对应关系。它通常被指定在存储地址的低端。ARM体系结构中,异常向量表的大小为32字节,其中,每种异常向量指定4个字节(即向量地址是字地址),有4个字节用于保留。异常向量地址表如表xxx:
表xxx ARM处理器向量地址表
39
序号 异常类型 1 2 3 4 5 6 7 复位 未定义指令 软件中断 指令预取中止 数据访问中止 保留 IRQ FIQ 异常向量(地址) 0x0000,0000 0x0000,0004 0x0000,0008 0x0000,000c 0x0000,0010 0x0000,0014 0x0000,0018 0x0000,001c 优先级别 异常模式 1 6 6 5 2 4 3 管理模式 未定义模式 管理模式 中止模式 中止模式 保留 IRQ模式 FIQ模式 每种异常对应的异常向量表中的4字节空间,存放一条跳转指令或者一条向PC寄存器赋值的数据访问指令,用来实现由当前程序跳转到异常处理程序处执行。表中异常向量(地址)0x0000,0014是保留地址。
ARM处理器的7种异常的优先级别共有6个级别。在表xxx中级别数值小的异常优先级高,级别数值大的异常优先级低,表中“复位”异常的优先级最高,“未定义指令”和“软件中断”的优先级最低。 §2.4.4 ARM异常处理的应用
当嵌入式系统运行时,异常可能会随时发生,为保证在ARM处理器在发生异常时不至于处于未知状态,在应用程序的设计中,必须要对各个异常向量表进行配置。 1.异常向量表配置
异常向量表配置方法之一是在异常向量表中的相应位置放置一条能跳转到相应异常处理程序的跳转指令(B),当ARM处理器发生异常时,程序计数器PC会被强制设置为对应的异常向量,执行跳转指令(BL),从而跳转到异常处理程序,当异常处理完成以后,返回到主程序继续执行。 这种方法有一个缺陷,即跳转指令只能在±32MB的空间范围内跳转(指令中偏移地址长度24位,表征了26bit,其中最高1位表示符号位)。向量表配置如下。
Vector_Init_Block
B Reset_Handler ;跳转到复位异常处理程序
40