1. 中断控制器概述:中断的基本概念、中断在RISC-V中的作用、PLIC与CLINT的区别
各位同学,欢迎来到RISC-V中断控制器的第一课。说实话,中断这个东西,是嵌入式系统里最绕不开的话题。我刚开始做芯片设计那会儿,总觉得中断就是个“打断CPU干活”的信号,后来踩了不少坑才明白——中断控制器的设计,直接决定了你系统的实时性和可靠性。
1.1 中断的基本概念
什么是中断?说白了,就是CPU正在执行主程序,突然来了个紧急事件,CPU得停下手头的活,先去处理这个事件,处理完再回来接着干。你想想看,这就像你正在写代码,领导突然喊你去开会——这就是一个中断。
中断的核心要素有三个:
- 中断源:谁发出的中断?可能是定时器、UART、GPIO,或者外部设备。
- 中断信号:怎么通知CPU?通常是电平触发或边沿触发。
- 中断服务程序(ISR):CPU收到中断后,跳到哪里去执行?
我个人习惯把中断分为两类:
- 同步中断:也叫异常(Exception),是CPU执行指令时自己产生的,比如除零错误、非法指令。这类中断是“可预期的”。
- 异步中断:也叫外部中断(Interrupt),是外部设备或定时器发起的,CPU不知道它什么时候来。这类中断是“不可预期的”。
重要概念:在RISC-V中,异常(Exception)和中断(Interrupt)统称为“陷阱”(Trap)。但设计中断控制器时,我们主要关注的是外部中断。
1.2 中断在RISC-V中的作用
RISC-V架构对中断的处理,其实挺优雅的。它不像ARM那样有复杂的GIC(通用中断控制器),而是把中断控制分成了两个部分:CLINT 和 PLIC。
中断在RISC-V中的作用,我总结为三点:
- 提高CPU利用率:没有中断,CPU就得轮询(Polling)检查设备状态,白白浪费时钟周期。有了中断,CPU可以安心干别的活,设备有需要了再喊它。
- 实现实时响应:比如你做一个电机控制,传感器检测到过流,必须微秒级响应。中断机制能保证CPU第一时间处理。
- 支持多任务调度:操作系统的任务切换,本质上就是利用定时器中断来“抢断”当前任务。
我记得有一次做RISC-V的SoC项目,客户要求中断延迟不超过50个时钟周期。当时我就在想,如果CLINT和PLIC的配置没搞对,这个指标根本达不到。嗯,这里要注意——中断延迟不仅取决于硬件,还取决于你软件里怎么处理中断嵌套和优先级。
1.3 PLIC与CLINT的区别
很多初学者容易把PLIC和CLINT搞混。我刚开始学RISC-V时也犯过这个错。其实它们的职责非常清晰:
| 特性 | CLINT(核心本地中断控制器) | PLIC(平台级中断控制器) |
|---|---|---|
| 管理的中断类型 | 软件中断、定时器中断 | 外部设备中断(GPIO、UART、SPI等) |
| 中断目标 | 直接发给特定HART(硬件线程) | 可以路由到多个HART |
| 优先级控制 | 固定优先级(通常不可编程) | 可编程优先级(支持中断嵌套) |
| 中断数量 | 通常只有2个(MSIP和MTIMECMP) | 支持多达1023个外部中断源 |
| 实现位置 | 每个HART内部 | SoC平台级别,所有HART共享 |
说白了,CLINT是“贴身管家”,只服务一个HART,管的是定时器和软件中断。PLIC是“总调度中心”,管理所有外部设备的中断,还能决定哪个HART去处理。
我的经验:如果你做单核RISC-V设计,CLINT基本不用操心,默认配置就行。但PLIC一定要仔细设计——中断源的编号、优先级阈值、中断使能寄存器,这些配置错了,设备可能根本收不到中断。
1.4 避坑指南:中断号与中断向量
我曾经在一个项目里,把PLIC的中断源编号搞错了。UART的中断号我配成了3,但实际硬件连的是中断源4。结果UART发数据,CPU死活不进中断服务程序。查了两天才发现是中断号映射的问题。
这里给大家一个建议:
- 在RISC-V中,外部中断的中断号(Interrupt ID)是从0开始的。但注意,中断号0通常保留,表示“无中断”。
- PLIC支持的中断源数量,取决于你的SoC设计。比如你接了32个外部设备,那中断号就是1~32。
- 中断向量表(Interrupt Vector Table)的地址,需要在启动代码里设置好。RISC-V的mtvec寄存器就是干这个的。
注意:CLINT和PLIC的中断信号,最终都会汇聚到CPU的核内中断线。RISC-V定义了三种中断线:
- MEI(机器外部中断):由PLIC产生
- MTI(机器定时器中断):由CLINT产生
- MSI(机器软件中断):由CLINT产生
这三种中断线是独立的,可以同时触发。CPU会根据mie寄存器的使能位,决定是否响应。
1.5 小结
这一章我们讲了中断的基本概念,中断在RISC-V中的作用,以及PLIC和CLINT的区别。你想想看,中断控制器其实就是个“交通警察”——它决定哪个设备的中断能通过,哪个得排队,哪个要优先放行。
下一章,我会带大家深入PLIC的内部结构,看看中断优先级是怎么仲裁的,以及如何用寄存器配置中断行为。到时候我会拿一个实际项目的PLIC代码来讲解,保证干货满满。