异常向量的种类
arm异常向量的种类共有8种,如下:
偏移地址 | 异常名称 | 常用代表符号 | 触发条件 |
---|
0x0000 0000 | 复位异常 | Reset | 触发复位(如按下硬件复位按键)时进入的异常 | 0x0000 0004 | 未定义指令异常 | Undefined Instruction | 系统运行过程,调用到未定义的指令 | 0x0000 0008 | SVC 异常 | Supervisor Call | 假如修改底层寄存器的值是特权级操作,而用户想要修改其数值,这时就可以通过SVC 异常。OS会提供一些系统服务函数,用户调用这些服务函数,触发SVC异常,从而进入异常服务函数里面, 再调用相关函数对寄存器进行 修改。 | 0x0000 000C | 预取指令终止异常 | PreAbort | 当一条指令进入取指阶段,且该地址并未分配,或无法访问,就会出现这个异常. 最直观的例子是: 未赋值指针变量 | 0x0000 0010 | 数据终止异常 | DataAbort | 当指针数据操作不当,越界,溢出等情况 | 0x0000 0014 | 保留 | Not Used | 保留,无作用 | 0x0000 0018 | 中断异常 | IRQ | 当系统发生中断时 | 0x0000 001C | 快速中断异常 | FIQ | 当系统发生快速中断时 |
关于异常向量表,需要注意以下几点:
- 异常向量表的顺序是有规定的,按照上表的顺序建立。从
复位异常 开始,到快速中断 异常结束。 - 异常向量表的
地址是在汇编的_start地址 的位置开始 - 8个异常向量的偏移地址为
0x0000 0000 ~ 0x0000 001C ,每个异常占1个的地址,每个地址为32位,也就4字节,所以需要偏移0x04 。 - 假设程序入口地址位
0x8000 0000 ,那么复位异常向量 的地址为 0x8000 0000 + 0x00 = 0x8000 0000 。所以当触发复位时,就会跳到0x8000 0000位置,执行该地址的汇编指令。
示例代码
_start:
ldr pc, = Reset_Handler
ldr pc, = Undefine_Handler
ldr pc, = SVC_Handler
ldr pc, = PreAbort_Handler
ldr pc, = DataAbort_Handler
ldr pc, = NotUsed_Handler
ldr pc, = IRQ_Handler
ldr pc, = FIRQ_Handler
Reset_Handler:
ldr r0, =Reset_Handler
bx r0
可以看到,实际上就是写好8条汇编指令,每条汇编指令,对应一个异常向量的地址。 当发生Reset异常时,就会跳到 ldr pc, = Reset_Handler ,执行该命令,将Reset_Handler函数的地址装进pc,系统就会跳转到Reset_Handler中执行相关的命令。
总结
- 异常向量表的顺序不能错。
- 每个异常向量的触发条件。
- 异常向量的地址在_start的入口地址开始,每个异常占用4字节偏移
- 每当系统发生异常时,会程序会到对应的异常向量表地址,执行汇编指令。
- FIQ 与 IRQ的区别,需要了解。
|