在ARM架构中,异常处理是处理器响应内部和外部事件的核心机制。当发生未定义指令、断点触发或系统调用等情况时,处理器会暂停当前执行流,转而执行预定义的异常处理程序。ARM1156T2-S处理器实现了完整的异常处理模型,包括七种标准异常类型和严格的优先级系统。
ARM1156T2-S处理器定义了以下异常类型及其固定优先级顺序(从高到低):
这种优先级设计确保了关键异常能够及时响应。例如,当FIQ和精确数据中止同时发生时,处理器会先处理数据中止,然后再处理FIQ。这种顺序保证了内存访问错误的及时捕获,避免错误传播。
重要提示:FIQ处理程序必须避免访问可能触发数据中止的内存区域,否则初始的数据中止异常状态将会丢失。
异常向量表包含了各种异常处理程序的入口地址。ARM1156T2-S提供了两种向量表基址配置选项:
通过CP15的c1控制寄存器中的V位可以设置向量表位置。表1展示了完整的异常向量偏移量和进入异常时的模式设置:
表1:ARM异常向量表结构
| 异常类型 | 偏移量 | 进入模式 | 中断屏蔽状态 |
|---|---|---|---|
| 复位 | 0x00 | 管理模式 | FIQ/IRQ均禁用 |
| 未定义指令 | 0x04 | 未定义模式 | IRQ禁用,FIQ保持原状态 |
| 软件中断(SVC) | 0x08 | 管理模式 | IRQ禁用,FIQ保持原状态 |
| 预取中止 | 0x0C | 中止模式 | IRQ禁用,FIQ保持原状态 |
| 数据中止 | 0x10 | 中止模式 | IRQ禁用,FIQ保持原状态 |
| 保留 | 0x14 | - | - |
| IRQ | 0x18 | IRQ模式 | IRQ禁用,FIQ保持原状态 |
| FIQ | 0x1C | FIQ模式 | FIQ/IRQ均禁用 |
当处理器遇到无法识别的指令时,会触发未定义指令异常。这一机制常被用于指令集扩展,通过软件模拟实现硬件不支持的功能。处理流程包含以下关键步骤:
对于Thumb-2指令集的未定义指令处理,需要特别注意指令长度的判断。以下伪代码展示了如何正确获取触发异常的指令:
c复制addr = R14_undef - 2; // 获取指令地址
instr = Memory[addr,2]; // 读取前16位
if (instr >> 11) > 28 { // 判断是否为32位指令
instr = (instr << 16) | Memory[addr+2,2]; // 组合完整指令
}
返回地址的处理取决于异常原因:
MOVS PC, R14返回到下一条指令SUBS PC,R14_und,#2重新执行当前指令ARM的IT(If-Then)指令用于条件执行,它会影响后续最多4条指令的执行状态。在异常处理中,处理器会自动调整SPSR中的IT状态位,确保异常返回后条件执行能够正确继续。这意味着SVC处理程序无需特殊处理IT指令块,简化了异常处理逻辑。
以下伪代码展示了如何在未定义指令处理中手动调整IT状态位:
c复制Cond = SPSR[15:12];
Mask = SPSR[11,10,26,25];
if (Mask != 0) {
Mask = Mask << 1;
if (Mask == 0) {
Cond = 0;
}
}
SPSR[15:12] = Cond;
SPSR[11,10,26,25] = Mask;
BKPT指令在ARM架构中用于调试目的,其行为类似于预取中止。关键特性包括:
SUBS PC,R14_abt,#4重新执行断点指令当配置为停止调试模式时,BKPT会使处理器进入调试状态,便于开发者检查系统状态。
CP15是ARM架构中的系统控制协处理器,负责管理处理器的关键系统功能。在ARM1156T2-S中,CP15提供了对缓存、内存保护、性能监控等功能的精细控制。
CP15寄存器通过多级编码进行访问,使用MRC/MCR指令时需要指定四个关键参数:
Thumb-2指令集也支持通过特定编码访问CP15寄存器。图2展示了ARM和Thumb-2指令的编码格式差异。
CP15寄存器按功能分为以下几组:
主ID寄存器提供处理器标识信息,格式如下:
读取示例:
assembly复制MRC p15, 0, <Rd>, c0, c0, 0 ; 读取主ID寄存器
缓存类型寄存器描述缓存体系结构特征,关键字段包括:
典型16KB 4路组相联缓存的值为:Dsize=Isize=101,Dassoc=Iassoc=010
控制寄存器是CP15中最关键的寄存器之一,主要控制位包括:
初始化时典型值为0x00050078,表示:
提供额外的控制功能,在ARM1156T2-S中主要控制:
默认值0x0000018b表示启用了大部分优化功能。
CP15提供丰富的缓存维护指令,主要通过c7寄存器实现:
assembly复制MCR p15, 0, <Rd>, c7, c5, 0 ; 无效化整个指令缓存
MCR p15, 0, <Rd>, c7, c5, 1 ; 按地址无效化指令缓存行
MCR p15, 0, <Rd>, c7, c5, 2 ; 按路无效化指令缓存
MCR p15, 0, <Rd>, c7, c5, 4 ; 刷新预取缓冲区
assembly复制MCR p15, 0, <Rd>, c7, c6, 0 ; 无效化整个数据缓存
MCR p15, 0, <Rd>, c7, c6, 1 ; 按地址无效化数据缓存行
MCR p15, 0, <Rd>, c7, c6, 2 ; 按路无效化数据缓存
MCR p15, 0, <Rd>, c7, c10, 1 ; 按地址清理数据缓存行
MCR p15, 0, <Rd>, c7, c10, 4 ; 排空写缓冲区
对于大范围缓存操作,MCRR指令更高效:
assembly复制MCRR p15, 0, <Rd>, <Rn>, c5 ; 无效化指令缓存范围
MCRR p15, 0, <Rd>, <Rn>, c6 ; 无效化数据缓存范围
MCRR p15, 0, <Rd>, <Rn>, c12 ; 清理数据缓存范围
MCRR p15, 0, <Rd>, <Rn>, c14 ; 清理并无效化数据缓存范围
ARM1156T2-S的MPU通过以下寄存器控制:
典型配置流程:
assembly复制; 设置region 0
MOV r0, #0x20000000 ; 基址
MCR p15, 0, r0, c6, c1, 0 ; 写入基址寄存器
MOV r0, #0x13 ; 64KB region (2^(19+1)=1MB)
MCR p15, 0, r0, c6, c1, 2 ; 写入大小寄存器
MOV r0, #0x0000030 ; 全读写权限,启用region
MCR p15, 0, r0, c6, c1, 4 ; 写入访问控制寄存器
TCM提供可预测的低延迟内存访问,通过以下寄存器配置:
配置示例:
assembly复制; 配置64KB数据TCM
MOV r0, #0x10000000 ; 基址1GB
ORR r0, r0, #0x10 ; 大小64KB (2^(4+2)=64)
MCR p15, 0, r0, c9, c1, 0 ; 写入数据TCM寄存器
重要提示:TCM和缓存使用相同的地址空间,必须确保两者区域不重叠,否则会导致不可预测行为。
CP15提供了直接访问缓存内容的调试接口,主要用于诊断和测试:
assembly复制MCR p15, 3, <Rd>, c15, c2, 0 ; 数据缓存标签读取
MCR p15, 3, <Rd>, c15, c2, 1 ; 指令缓存标签读取
assembly复制MCR p15, 3, <Rd>, c15, c4, 1 ; 指令缓存数据读取
assembly复制MRC p15, 3, <Rd>, c15, c8, 0 ; 读指令缓存主有效位
MCR p15, 3, <Rd>, c15, c8, 0 ; 写指令缓存主有效位
性能监控单元包含以下寄存器:
性能监控控制寄存器(c15):
事件计数器:
assembly复制MRC p15, 3, <Rd>, c15, c12, 1 ; 读取周期计数器
MRC p15, 3, <Rd>, c15, c12, 2 ; 读取计数器0
MRC p15, 3, <Rd>, c15, c12, 3 ; 读取计数器1
可监控的事件包括缓存命中/失效、流水线停顿等微架构事件,是性能优化的关键工具。
SUBS PC,R14_abt,#4SUBS PC,R14_abt,#8MOVS PC, R14或SUBS PC,R14_und,#2assembly复制MCR p15, 0, <Rd>, c7, c10, 5 ; 数据同步屏障
未定义指令异常循环:
缓存数据不一致:
MPU配置无效:
性能计数器不计数: