1. ARM926EJ-S异常处理机制解析
在嵌入式系统开发中,异常处理是确保系统可靠性的基石。ARM926EJ-S作为经典的嵌入式处理器核,其异常处理机制体现了ARMv5架构的精妙设计。当程序正常执行流程被打断时,处理器会自动跳转到预定义的异常向量地址,这种硬件级响应机制为实时系统提供了确定性的行为保障。
1.1 异常类型与优先级体系
ARM926EJ-S定义了七种基本异常类型,每种异常都有明确的触发条件:
-
复位异常(Reset):处理器上电或硬件复位时触发,优先级最高。在DM355芯片中需特别注意VINTH信号控制——当VINTH=0时向量表位于0x00000000,而VINTH=1时理论上应映射到0xFFFF0000,但DM355的硬件设计在该区域未实现物理内存,因此必须保持VINTH=0。
-
数据中止(Data Abort):访问非法内存地址时触发,优先级仅次于复位。开发者需区分预取中止(指令获取失败)与数据中止(数据访问失败),前者不会立即触发异常而是等到指令执行时。
-
快速中断(FIQ):低延迟中断通道,通过专属寄存器(R8-R14_fiq)实现快速上下文切换。典型应用场景包括高速数据采集、电机控制等实时性要求高的任务。
-
普通中断(IRQ):通用中断通道,与FIQ共享优先级时仲裁取决于中断控制器设置。在Linux等操作系统中,IRQ通常用于设备驱动中断处理。
-
软件中断(SWI):通过SWI指令主动触发,用于实现系统调用。与undefined instruction同属最低优先级,在发生冲突时实际响应顺序取决于处理器实现。
关键提示:在编写中断服务程序时,必须严格遵守ATPCS调用规范保存寄存器状态。对于FIQ处理程序,建议使用汇编语言实现以优化性能,通常可控制在20个时钟周期内完成响应。
1.2 异常向量表精解
ARM926EJ-S的异常向量表采用固定偏移设计,每个异常占据4字节空间。下表展示了完整的向量表结构:
| 偏移地址 | 异常类型 | 进入模式 | I/F位状态 |
|---|---|---|---|
| 0x00 | Reset | Supervisor | I=1, F=1 |
| 0x04 | Undefined Inst | Undefined | I=1, F=unchanged |
| 0x08 | SWI | Supervisor | I=1, F=unchanged |
| 0x0C | Prefetch Abort | Abort | I=1, F=unchanged |
| 0x10 | Data Abort | Abort | I=1, F=unchanged |
| 0x14 | Reserved | - | - |
