中断
中断机制即处理器核在顺序执行程序指令流的过程中突然被别的请求打断而中止 执行当前的程序,转而去处理别的事情,待它处理完了别的事情,然后重新回到之前程序中断的位置,继续执行之前的程序指令流。
中断请求 中断源 中断源来自外围硬件设备。
处理器转而去处理别的事情 便称为中断服务程序。
保存现场 恢复现场
对中断源进行仲裁 中断优先级
当遇到高优先级的中断请求,执行结束再响应,或者终止当前中断服务程序,转而开始响应新的中断,并执行其中断服务程序。
异常
异常机制 即处理器核在顺序执行程序指令流的过程中突然遇到了异常的事情而中止执行当前的程序,转而去处理该异常。
中断往往是外因引起的,异常是处理器内部事件或程序执行中的事件(硬件故障,程序故障等)而引起的。 异常由内因引起。
当中断和异常发生时,处理器将暂停当前正在执行的程序,转而执行中断和异常处理程序,当返回时,处理器恢复执行之前暂停的程序。
1 同步异常
执行程序指令流或者试图 执行程序指令流而造成的异常。
2 异步异常
异步异常是指 那些产生原因不能被精确定位于某条指令的异常。
RISC-V的异常处理机制
狭义的中断和异常都归为广义的 异常。
进入异常
进入异常时,RISC-V规定的硬件行为为:
1 处理器停止执行当前程序流,转而从mtvec寄存器定义的PC地址开始执行。
2 进入异常不仅会让处理器从上述PC地址 开始执行,还会让硬件更新以下4个寄存器。
机器模式异常原因 mcause寄存器
机器模式异常PC mepc寄存器
机器模式异常值 mtval寄存器
机器模式状态 mstatus寄存器
1 从mtvec寄存器 定义的PC地址开始执行。 机器模式异常入口基地址寄存器 mtvec
RISC-V处理器进入异常后跳入的PC地址 由叫做机器模式异常入口基地址寄存器 mtvec的CSR指定。
mtvec寄存器是一个可读可写的CSR。低2位是MODE域,高30位是BASE域。 MODE值为0表示响应所有的异常时处理器均跳转到BASE值指示的PC地址。 MODE的值为1,则狭义的异常发生时,处理器跳转到BASE值指示的PC地址。
当狭义的中断发生时,处理器跳转到BASE+4CAUSE 值指示的PC地址。 CAUSE表示中断对应的异常编号。
ALU中的CSR为读写控制模块。
2 更新mcausse寄存器 机器模式异常原因寄存器。
在进入异常时,mcause寄存器被同时更新,以反映当前的异常种类,软件可以通过读此寄存器,查询造成异常的具体原因。
3 更新mepc 寄存器 机器模式异常pc寄存器
异常返回地址由mepc寄存器保存
4 更新mtval 寄存器 机器模式异常值寄存器
在进入异常时,硬件将自动更新mtval寄存器,以反映引起当前异常的存储器访问地址或者指令编码。
5 更新mstatus寄存器 机器模式状态寄存器
在进入异常时,硬件将自动更新mstatus寄存器的某些域。
退出异常
在程序完成异常处理之后,处理器最终需要从异常服务程序中退出,并返回主程序。
RISC-V架构定义了一组专门的退出异常指令,mret,sret,uret。其中mret指令是必备的,而sret和uret仅在支持监督模式和用户模式的处理器中使用。
在机器模式下退出异常时,必须使用mret指令,处理器执行mret指令后的硬件行为如下:
停止执行当前程序流,转而从mepc寄存器定义的PC地址开始执行。
执行MERT指令不仅让处理器跳转到上述的PC地址并开始执行,还会让硬件同时更新mstatus寄存器。
异常服务程序
当处理器进入异常后,开始从mtvec寄存器定义的PC地址执行新的程序。 该程序通常为异常服务程序,程序通过查询mcause寄存器中的Exception Code域以进一步跳转到具体的异常服务程序。
例如当mcause寄存器的值为0x2,则该异常是非法指令引起的。因此可以进一步跳转到非法指令异常服务子程序中。
RISC-V架构中断定义
RISC-V架构定义的中断类型有四种,外部中断,计时器中断,软件中断,调试中断。
1 外部中断
外部中断是来自处理器核外部的中断,如外部设备UART,GPIO等产生的中断。
机器模式外部中断可以作为处理器核的一个单位输入信号,外部中断的屏蔽由mie寄存器中的 MEIE域控制,等待标志则反映在mip寄存器中的MEIP域中。
RISC-V定义了一个平台级别中断控制器,PLIC可用于多个外部中断源的优先级仲裁和派发。
2 计时器中断
RISC-V架构规定系统平台 必须有一个计时器,并给计时器定义了两个64位 宽的mtime寄存器和mtimecmp寄存器。 mtime反映当前计数器的计数值,mtimecmp寄存器用于设置计时器的比较值。
3 软件中断
软件中断是指软件触发的中断
4 调试中断
此中断专用于实现调试器。
中断屏蔽
狭义的异常不可以屏蔽掉,也就是,一旦发生狭义的异常,处理器一定会停止当前操作转而处理异常。
但是狭义的中断可以屏蔽掉,RISC-V定义了CSR机器模式中断使能 寄存器,用于控制中断的屏蔽。
软件可以通过写mie寄存器中的值达到屏蔽某些中断的效果。假设MTIE域被设置成0,则意味着计数器中断中断屏蔽,处理器无法响应定时器中断。
中断等待
RISC-V定义了 CSR机器模式中断等待寄存器,用于查询中断的等待状态。
中断优先级与仲裁
其响应的中断优先级如下:
外部中断优先级最高
软件中断其次
计时器中断再次
多个中断源的优先级和仲裁可以通过配置 PLIC的寄存器进行管理。
中断嵌套
中断嵌套,需要使用软件,不支持硬件中断嵌套行为。
蜂鸟E203的异常处理硬件实现
异常和中断要点
蜂鸟E203只支持机器模式的架构,且没有实现MPU与MMU。
只实现了三种中断,软件中断,计时器中断,外部中断。
机器模式异常入口基地址寄存器mtvec 的最低位MODE域仅支持模式0,即响应所有的异常时处理器均跳转到 BASE域指示的PC地址。
MPU (Micro Processor Unit),叫微处理器
MMU(Memory Management Unit)内存管理单元
蜂鸟E203对mepc寄存器的处理
RISC-V在中断和异常时的返回地址定义有细微的差别,在出现中断时,中断返回地址指向下一条尚未执行的指令。
在出现异常时,mepc寄存器的值则指向 当前指令。
蜂鸟E203处理器的中断接口
顶层有四个中断输入信号,计时器中断,软件中断,调试中断,外部中断
蜂鸟E203处理器CLINT微架构
CLINT为处理器核 局部中断控制器, CLINT是一个存储器 地址映射的模块。
1 生成软件中断
2 生成计时器中断
蜂鸟E203处理器PLIC微架构
PLIC为 平台级别中断控制器,它是RISC-V架构 标准定义的系统中断控制器。主要用于多个外部中断源的 优先级仲裁和派发。
PLIC是一个存储器地址映射模块,挂载在处理器核 为其实现的专用总线接口上。
蜂鸟E203处理器交付模块中 对异常和中断的处理
交付模块是指令的交付点,一条指令一旦被交付,意味着它真正得到了执行。