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

电子说

1.4w人已加入

描述

全称为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 的机器级软件中断。 计数器负责提供 CPUTIMETIMEH ,并参与定时器中断的触发。 定时器中断触发器用于定时器中断 的触发,当计数器值大于配置的值时会触发定时器中断**,**定时器中断是嵌入式系统中最常用的中断类型,几乎所有 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 定时器中断触发采样函数,确保采样周期的稳定性和精准度。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分