中断这个东西理论上属于CPU核心的东西。一般来说并不需要重新设计。实际的实现中是比较繁琐的,此处只介绍原理。ARM基本上会用NVIC(Nested Vectored Interrupt Controller) 的东西,RISC-V目前实现了一个比较简单的东西(有人称之为简洁高效),不支持嵌套的中断。
一、RISC V中断架构
RISC V 中断被分为两类中断。局部中断和全局中断。
- 局部中断,算是内部中断,标准是只规定了有两种,即使中断timer和软件中断software。局部中断连接在Core Local Interruptor (CLINT) 上。
- 全局中断,也就是所说的外部中断,其他外设统统都是外部中断。外部中断连接在Platform-Level Interrupt Controller (PLIC)上。
如图所示,CLINT和PLIC最大的区别在于,CLINT没有仲裁,包括software和Timer,一有中断马上响应(software中断怎么产生的:用软件直接写一个寄存器当作软件中断)。PLIC需要一个仲裁决定谁先中断,存在个优先级的问题。
二、一个典型的中断流程
中断流程只要是CPU都大同小异的。对于RISC-V来讲,中断流程是这样的。
- 外设发出中断信号。
- PLIC或者CLINT响应中断,RISC-V核心保存此时的CSR(control and status registers,包括了PC啊,中断原因啊一堆信息)。
- 跳转到中断处理程序(直接换PC值取指令即可)。
- 关闭其他中断响应使能(RISC-V不支持嵌套,所以一个中断要屏蔽其他中断)。
- 软件保存通用的寄存器。
- 然后处理中断(过程中会清掉外设的中断)。
- 软件恢复通用的寄存器。
- 然后回复CSR。
- 然后跳转PC跳回原来位置退出异常。