第 2 章 嵌入式处理器
2.7 异常和中断处理机制
2.7.2 异常处理过程
异常处理过程如图2.8 所示,它有以下三个步骤。
(1) 处理器将状态寄存器(PSR)和程序计数器(PC)复制到相应的屏蔽寄存器里。对快速 中断异常,PSR 和 PC 被保存到 FPSR 和 FPC 控制寄存器里。对其他的所有异常,它们则 被置于 EPSR 和 EPC 屏蔽寄存器中。当 PSR(EE)被清为零时,异常(除了快速中断异常)不 管是什么类型,都将导致一个不可恢复的错误异常。在PSR 和 PC 被保存到适当的屏蔽寄 存器之后,PSR(EE)位被清为零,防止出现不可恢复的错误异常逻辑。
在出现一个不可恢复的错误异常时,EPSR 和 EPC 仍然被更新。如果该不可恢复的错 误异常是由于在异常处理过程中提取异常向量表产生的,则 EPSR 和 EPC 中的值是无定 义的,另外装载进PSR(AF)位的值也无定义。
接下来,通过设定 PSR(S)位,处理器进入超级用户模式并通过清空 PSR 的 TM 域禁
止跟踪异常处理程序。中断使能标志(IE)也被清空禁止响应常规中断。快速中断异常和复 位把快速中断使能(FE)位清零,FE 位不受其他异常的影响。
图2.8 异常处理过程
PSR 中的 TE(转换控制)被清零,使得外部的存储控制单元在接下来的异常处理过程 中不能控制地址的转换,这样就使接下来执行的访问不会被转换。异常处理程序可以在适 当的时候重新将转换设为有效。
(2) 处理器确定异常向量号。对向量中断,处理器直接锁存中断控制器的向量号并通 过接口提交给 C310。对所有其他的异常,由内部逻辑提供向量号。在最后一步里将要使 用该向量号,方法是用 4 乘以该向量号使之成为一个向量偏移,然后计算出异常向量地
址。与异常相关的向量号被载入PSR 的 VEC 域,以帮助共享异常处理程序。
(3) 处理器决定异常处理程序的第一个指令的地址,然后把控制权交给处理程序。处 理器把向量偏移和向量基地址寄存器里的值组合在一起,以获取异常向量的存储器地址。
之后,处理器从向量表单元取回一个字,将向量表中异常处理程序第一条指令的地址载入 PC,并且将该向量表单元的低位装进 PSR(AF)控制位,以决定在进入异常处理程序时使 用哪个寄存器文件。这样处理器就从新的PC 值开始执行。
C310 支持一个包含 128 个异常向量(参见表 2.6)的 512 字节的向量表。一切异常向量 位于超级用户地址区,并且都通过相对地址引用,只有复位向量的地址在处理器存储器映 射表中是固定的。初始化完成后,通过编程 VBR 的方式可以在复位后将异常向量表的基 地址重定位。
表2.6 异常向量表
向 量 号 向量偏移地址 赋 值
0 0x000 复位
1 0x004 不对齐存取
2 0x008 存取错误
3 0x00C 除数为零
4 0x010 非法指令
5 0x014 权限冲突
6 0x018 跟踪异常
7 0x01C 断点异常
8 0x020 不可恢复错误
9 0x024 保留
10 0x028 普通中断自动向量
11 0x2C 快速中断自动向量
12 0x030 保留
13 0x034 保留
14 0x038 保留
15 0x03C 保留
16 0x040 trap#0
17 0x044 trap#1
18 0x048 trap#2
19 0x04C trap#3
20~31 0x050~07C 保留
32~127 0x080~0x1FC 留给中断控制器
向量表中的前 32 个向量所对应的向量号是由 C310 内部逻辑提供的固定向量号,供 内部异常使用。其余的 96 个向量号用于外部设备产生的中断,为中断控制器所用。外部 设备将一个 7 位的向量号和一个中断请求发给 C310,在中断请求被接受后,C310 锁定中
断向量号,并指向相应的位置。对不能提供一个向量号的外部设备,C310 提供了自动向 量的能力。常规中断(p_int_b)和快速中断(p_fint_b)拥有各自的自动向量。