l ARM有3种控制程序流程:
1. 正常执行过程,每执行一条ARM指令,PC增加4字节;每执行一条THUMB指令,PC增加2字节;
2. 跳转指令,B执行跳转操作,BL执行跳转操作,保存子程序返回地址,BX执行跳转,根据目标地址最低位可以切换到THUMB状态;BLX执行以上3种,跳转,保存,切换。
3. 异常中断发生。执行完当前指令,跳转到相应的异常中断处理程序,同时保存当前执行现场,中断执行完成,返回执行现场的下条指令。
各种异常对应不同寄存器,当多个异常发生时,由优先级响应处理
异常类型 | 具体含义 |
复位 | 当处理器的复位电平有效时,产生复位异常,程序跳转到复位异常处理程序处执行。 |
未定义指令 | 当ARM处理器或协处理器遇到不能处理的指令时,产生未定义指令异常。可使用该异常机制进行软件仿真。 |
软件中断 | 该异常由执行SWI指令产生,可用于用户模式下的程序调用特权操作指令。可使用该异常机制实现系统功能调用。 |
指令预取中止 | 若处理器预取指令的地址不存在,或该地址不允许当前指令访问,存储器会向处理器发出中止信号,但当预取的指令被执行时,才会产生指令预取中止异常。 |
数据中止 | 若处理器数据访问指令的地址不存在,或该地址不允许当前指令访问时,产生数据中止异常。 |
IRQ(外部中断请求) | 当处理器的外部中断请求引脚有效,且CPSR中的I位为0时,产生IRQ异常。系统的外设可通过该异常请求中断服务。 |
FIQ(快速中断请求) | 当处理器的快速中断请求引脚有效,且CPSR中的F位为0时,产生FIQ异常。 |
优先级 | 异 常 |
1(最高) | 复位 |
2 | 数据中止 |
3 | FIQ |
4 | IRQ |
5 | 预取指令中止 |
6(最低) | 未定义指令、SWI |
当系统运行时,异常可能会随时发生,为保证在ARM处理器发生异常时不至于处于未知状态,在应用程序的设计中,首先要进行异常处理,采用的方式是在异常向量表中的特定位置放置一条跳转指令,跳转到异常处理程序,当ARM处理器发生异常时,程序计数器PC会被强制设置为对应的异常向量,从而跳转到异常处理程序,当异常处理完成以后,返回到主程序继续执行
异常向量地址显示如表2.9。
表2.9 异常向量表
地 址 | 异 常 | 进入模式 |
0x0000,0000 | 复位 | 管理模式 |
0x0000,0004 | 未定义指令 | 未定义模式 |
0x0000,0008 | 软件中断 | 管理模式 |
0x0000,000C | 中止(预取指令) | 中止模式 |
0x0000,0010 | 中止(数据) | 中止模式 |
0x0000,0014 | 保留 | 保留 |
0x0000,0018 | IRQ | IRQ |
0x0000,001C | FIQ | FIQ |