RISC-V怎么实现核间中断?核心本地中断控制器(CLINT)深度解析

全称为 Core Local Interruptor(核心本地中断控制器),是 RISC-V 特权架构规范(Privileged Architecture Specification)中明确定义的内建于每个核心 / 硬件线程(hart)的中断控制器,专门处理「核心本地、非共享」的中断类型,区别于处理外设共享中断的 PLIC(Platform-Level Interrupt Controller,平台级中断控制器)。

1、为什么需要 CLINT?

RISC-V 核心在运行时,需要处理两类截然不同的中断需求:

一类是全局共享中断(如 UART 收发、GPIO 电平变化、SPI 通信完成等),这类中断来自外部外设,需多个核心共享处理;

另一类是核心本地中断(如定时任务、核心间通信),这类中断仅属于单个核心,要求极低的响应延迟,无需总线仲裁。

CLINT 的设计初衷正是为了解决第二类需求 ------ 通过将中断控制器 "内嵌" 到每个 hart 中,避免总线传输带来的延迟,确保核心对本地关键事件(如定时器到期、核心间唤醒)的快速响应,这也是其 "Core Local"(核心本地)命名的由来。

CLINT 模块产生 CSR 寄存器的定时器中断、软件中断和计时器。

CLINT的系统架构示意图

2、CLINT 功能说明

CLINT 由软件中断触发器、定时器中断触发器、计数器组成。 软件中断触发器由一个寄存器构成,直连 CPU 的机器级软件中断。 计数器负责提供 CPU 的 TIME 与 TIMEH,并参与定时器中断的触发。 定时器中断触发器用于定时器中断 的触发,当计数器值大于配置的值时会触发定时器中断,定时器中断是嵌入式系统中最常用的中断类型,几乎所有 RTOS(如 FreeRTOS、RT-Thread)的任务调度都依赖定时器中断提供的 "时钟节拍"。

2.1 CLINT初始化

2.2 软件中断:

写 0 则清除中断挂起状态

2.3定时器中断:

中断处理函数中,更新比较阈值(实现周期性触发),并执行调度逻辑(如 RTOS 的任务切换)。

2.3读取CLINT计数器:

2.4延时函数通过计数器功能计算延时时间

CLINT 的 64 位全局计数器time/timeh提供了高精度的时间基准,可直接用于实现微秒级 / 毫秒级精准延时,无需依赖外部定时器。

延时函数实现原理:

进入延时函数时,读取当前计数器值told;

计算需要的总时钟节拍数(ticks = 延时时间(us) × 时钟频率(MHz));

循环读取当前计数器值tnow,计算累计节拍数tcnt;

当tcnt >= ticks时,延时结束。

3、CLINT 的常见应用场景

① RTOS 时钟节拍生成

FreeRTOS 等 RTOS 的任务调度依赖固定周期的时钟节拍,通常将 CLINT 定时器中断配置为 1ms 触发一次,在中断处理函数中调用vTaskIncrementTick(),实现任务就绪状态更新和调度器切换。

② 多核系统启动

在 RISC-V 多核芯片中,主核心启动后,通过向从核心的SOFTICR寄存器写 1,触发从核心的软件中断,从核心在中断处理函数中完成栈初始化、应用加载,实现多核心协同工作。

③ 精准数据采样

在工业控制、传感器采集等场景中,需按固定时间间隔(如 100us)采集数据,通过 CLINT 定时器中断触发采样函数,确保采样周期的稳定性和精准度。

相关推荐
2501_938810112 小时前
为什么要用住宅IP
网络·网络协议·tcp/ip
周杰伦_Jay2 小时前
【JVM深度解析】运行时数据区+类加载+GC+调优实战(附参数示例)
java·jvm·spring boot·分布式·架构·java-ee
bai5459362 小时前
STM32 CubeIDE(1.18.0) LED闪烁
stm32·单片机·嵌入式硬件
Mintopia2 小时前
⚙️ 模型接口与微调兼容性:AIGC系统整合的底层心脏跳动
人工智能·架构·rust
真正的醒悟2 小时前
远程控制监控工具
网络
明月心9522 小时前
suse11 sp3的防火墙设置
网络·防火墙
我送炭你添花2 小时前
OpenWrt 22.03.5 命令行配置详解(TP-LINK WDR4320)
服务器·网络·windows
M158227690553 小时前
无线组网新突破!SG-Lora-TCP 模块,7 公里 TCP 信号无线透传更自由
服务器·网络·tcp/ip
SoleMotive.3 小时前
sse和websocket的区别
网络·websocket·网络协议