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(通用中断控制器),而是把中断控制分成了两个部分:CLINTPLIC

中断在RISC-V中的作用,我总结为三点:

  1. 提高CPU利用率:没有中断,CPU就得轮询(Polling)检查设备状态,白白浪费时钟周期。有了中断,CPU可以安心干别的活,设备有需要了再喊它。
  2. 实现实时响应:比如你做一个电机控制,传感器检测到过流,必须微秒级响应。中断机制能保证CPU第一时间处理。
  3. 支持多任务调度:操作系统的任务切换,本质上就是利用定时器中断来“抢断”当前任务。

我记得有一次做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代码来讲解,保证干货满满。