当前位置: 首页 > news >正文

RISC-V CLINT、PLIC及芯来ECLIC中断机制分析 —— RISC-V中断机制(一)

在长期的嵌入式开发实践中,对中断机制的理解始终停留在表面层次,特别当开发者长期局限于纯软件抽象层面时,对中断机制的理解极易陷入"知其然而不知其所以然"的困境,这种认知的局限更为明显;随着工作需要不断深入底层技术,对硬件机制的了解逐渐加深,并积累了大量的学习笔记。借此机会,我将这些零散的知识进行系统化梳理,既是对自身知识的复盘,也希望能为相关领域的开发者提供些许帮助和参考。关于RISC-V中断机制的分析,本文将从硬件实现原理和软件应用以下两个方面来展开介绍:

RISC-V CLINT、PLIC及芯来ECLIC中断机制分析 —— RISC-V中断机制(一)
ECLIC中断流程及实际应用 —— RISCV中断机制(二)

背景

RISC-V 的中断控制器(CLINT+PLIC)以 简洁模块化 为核心,CLINT 负责本地定时器/软件中断,PLIC 管理外部设备优先级,逻辑清晰易实现。相比之下,ARM GIC 为满足复杂场景迭代多年,功能完备但配置繁琐,历史兼容性导致接口臃肿。RISC-V 通过标准化接口降低开发门槛,但其设计合理性仍需市场长期验证;ARM 则凭借成熟生态在工业级应用中占据优势。下面就来一起学习下RISCV的中断机制。

RISC-V把中断类型分为内部和外部中断,其中内部中断包括:软件中断和定时器中断;外部中断则是由外设触发的中断。
在这里插入图片描述
在RISC-V架构中,CLINT(Core-Local Interruptor)和PLIC(Platform-Level Interrupt Controller)是两类功能互补的中断控制器,分别负责本地中断和全局中断的管理。
在这里插入图片描述
CLINT只负责处理软件中断和时钟中断,因为这两个中断是RISC-V架构中定义的。经过CLINT不需要进行任何的仲裁,直接将中断(Software与Timer)送入RISC-V核中。

1 CLINT(Core-Local Interruptor)

CLINT并未未被单独列为RISC-V特权架构的独立章节,但其功能通过机器模式(M-mode)的CSR寄存器间接定义

1.1 核心功能

CLINT专用于管理本地中断,包括两类:

  • 软件中断(Software Interrupt):通过写特定寄存器(MSIP/SSIP)触发,常用于多核系统中的核间通信(IPI)。
  • 定时器中断(Timer Interrupt):通过mtime(mtime_hi, mtime_lo)(计时器)和mtimecmp(mtimecmp_hi, mtimecmp_lo)(比较器)触发周期性中断。

1.2 设计特点

  • 无优先级仲裁:所有中断直接触发,响应速度快,但无法处理优先级冲突。
  • 与CPU核心绑定:CLINT直接关联到单个CPU核心(Hart),适用于单核或轻量级多核系统。
  • 操作模式:
    • 直接模式:所有中断和异常跳转到固定入口地址(mtvec.BASE),需软件判断中断源。
    • 向量模式:中断跳转到向量表索引对应的地址,硬件自动处理中断号,减少软件开销。

1.3 相关寄存器

  • MSIP寄存器:用于生成软件中断,通过写最低有效位触发。
  • mtime/mtimecmp:64位寄存器,控制定时器中断的触发时机。

1.4 标准化状态

由于CLINT无优先级仲裁、多核支持不足、扩展性不好等等,实际上各架构设计公司并未直接使用,而是对其做了改进,比如sifive的ACLINT(Advanced CLINT)

  1. 模块化设计:
    • 将CLINT拆分为MTIMER(机器级定时器)和MSWI(机器级软件中断)模块,支持独立配置和扩展。
    • 新增SSWI(监管者级软件中断),为Supervisor模式提供中断支持。
  2. 多核优化:
    • 为每个CPU核心(Hart)分配独立的定时器和软件中断寄存器,避免资源竞争。
    • 支持高效的核间通信(IPI),通过写目标Hart的MSWI寄存器触发中断。
  3. 向后兼容:
    • ACLINT的寄存器布局与SiFive早期CLINT实现完全兼容,原有代码无需修改即可运行。
    • mtime和mtimecmp寄存器地址与传统CLINT一致。

这里只是简单概括下ACLINT,感兴趣移步https://github.com/riscvarchive/riscv-aclint学习,另ACLINT已成为RISC-V官方标准化模块。
另外后续回详细介绍芯来科技的ECLIC,所以这里对CLINT也不做很过多说明。

2 PLIC(Platform-Level Interrupt Controller)

PLIC(platform-level interrupt controller),平台级中断控制器。用来将外部的全局中断请求处理后转至中断目标。PLIC理论上支持1023个外部中断源和15872个上下文,但真实设计实现时一般不需要这么多。

我们可以把PLIC看做医院的分诊台护士,把中断目标看做值班医生,而外部中断请求就像前来就诊的病人。

如果所有病人一窝蜂挤进诊室,医生会手忙脚乱无法高效诊断。因此,医院设置了分诊台:

  • 分诊规则:护士(PLIC)根据病人(中断)的紧急程度(优先级)、科室开放状态(中断使能)和医生接诊能力(阈值),动态安排就诊顺序。
  • 智能调度:护士只放行最危急的病人(如心脏病突发)进入诊室,普通感冒患者需排队等待。
  • 资源隔离:不同医生(多核处理器)可独立配置接诊规则(如外科医生不处理眼科患者),避免任务冲突。

2.1 基本介绍

  1. 核心功能
    PLIC负责管理全局外部中断,如GPIO、UART等外设中断,支持多核系统的优先级仲裁。

  2. 设计特点

    • 优先级仲裁:支持中断优先级配置、阈值设置和Claim/Complete机制,确保高优先级中断优先响应。
    • 多核支持:可为每个Hart的不同特权模式(如M-mode、S-mode)分配独立的中断上下文。
    • 内存映射寄存器:通过基地址访问中断优先级(priority)、使能(enable)、挂起(pending)等寄存器。
  3. 中断处理流程

    • 中断触发:外设向PLIC发送中断信号。
    • 优先级仲裁:PLIC根据优先级和阈值选择最高优先级中断。
    • 中断响应:Hart读取claim寄存器获取中断ID,处理完成后写入complete寄存器。
  4. 标准化状态

    • PLIC已从RISC-V特权文档中分离,成为独立规范,托管于GitHub仓库https://github.com/riscv/riscv-plic-spec。
    • 支持最多1023个中断源和15872个上下文(Hart+特权模式组合)
      在这里插入图片描述

2.2 PLIC原理

在这里插入图片描述
通用PLIC操作参数寄存器块,具体包括:

  • Interrupt Priorities registers:
    中断优先级寄存器,每个中断源的中断优先级。
  • Interrupt Pending Bits registers:
    中断待处理位寄存器:每个中断源的中断等待状态。
  • Interrupt Enables registers:
    中断使能寄存器:每个上下文的中断源使能。
  • Priority Thresholds registers:
    优先级阈值寄存器:每个上下文的中断优先级阈值。
  • Interrupt Claim registers:
    中断请求寄存器:用于获取每个上下文的中断源ID的寄存器。
  • Interrupt Completion registers:
    中断完成寄存器:用于向门控关发送中断完成消息的寄存器。
  1. 中断汇聚与标准化接口

    • 统一接入:所有外设中断(如UART、GPIO、DMA等)均接入PLIC,形成全局中断池,而非直接连接处理器核心。
    • 标准化管理:PLIC为每个中断源分配唯一ID,并通过内存映射寄存器提供统一配置接口(优先级、使能、目标核心等)。
  2. 可编程优先级仲裁

    • 动态配置:用户可通过寄存器配置以下参数:
      • 中断优先级(Priority):数值越大优先级越高(如0为禁用,1~7为可配置等级)。
      • 目标核心阈值(Threshold):每个处理器核心(Hart)仅响应优先级高于阈值的中断。
      • 中断使能(Enable):按需开启/屏蔽特定中断源。
    • 仲裁规则:
      • 筛选所有已使能且优先级高于目标阈值的中断。
      • 选择优先级最高的中断(若优先级相同,按中断ID升序裁决)。
      • 将胜出中断路由至目标核心,触发中断服务程序(ISR)。
  3. 中断处理与状态维护

    • Claim/Complete机制:
      • Claim阶段:目标核心读取PLIC的claim寄存器获取中断ID,PLIC自动标记该中断为“处理中”,防止重复触发。
      • Complete阶段:核心处理完成后,向complete寄存器写入同一中断ID,PLIC清除挂起状态,允许后续中断触发。
    • 多核支持:支持为每个核心分配独立的中断上下文(Context),实现多核系统的负载均衡与中断隔离。

2.3 中断流程

在这里插入图片描述
相关名词:

  • 外部中断源:如UART、GPIO等外设,产生中断请求。
  • 中断Gateway:外设与PLIC之间的接口模块,负责初步处理中断信号。
  • PLIC内核:全局中断控制器,执行优先级仲裁与路由。
  • 中断目标:处理器核心(Hart),负责执行中断服务程序(ISR)。
  1. 步骤1:中断触发与Gateway处理

    • 中断触发:外设(如UART接收完成)产生中断信号,向与其绑定的中断Gateway发送请求。
    • Gateway响应:Gateway接收请求后,执行以下操作:
      • 设置Pending位:将对应外设的中断挂起标志(Pending Bit)置位,标记该中断等待处理。
      • 转发至PLIC:将中断请求提交给PLIC内核,等待仲裁。
  2. 步骤2:PLIC仲裁与中断通知

    • PLIC仲裁:PLIC根据以下配置参数筛选并裁决中断:
      • 优先级(Priority):数值越高中断越优先。
      • 使能状态(Enable):仅处理已使能的中断源。
      • 目标阈值(Threshold):仅转发优先级高于目标核心阈值的中断。
      • 仲裁规则:优先级最高者胜出(优先级相同则中断ID较小者优先)。
    • 通知中断目标:PLIC将仲裁胜出的中断请求发送至目标处理器核心,触发核心进入中断处理流程。
  3. 步骤3:中断认领与处理

    • Claim操作:
      目标核心通过读取PLIC的claim寄存器获取中断ID,触发以下行为:
      • 清除Pending位:PLIC自动清除该中断在全局队列中的挂起状态(不涉及外设自身的Pending位)。
      • 锁定Gateway:Gateway暂时禁止同一外设的新中断进入PLIC(防止重复仲裁),直到收到完成通知。
    • 执行中断服务程序(ISR):核心根据中断ID跳转至对应的ISR,完成外设请求的具体处理(如读取UART数据)。
  4. 步骤4:中断完成与资源释放

    • Complete操作:ISR执行完毕后,核心向PLIC的complete寄存器写入中断ID,触发以下操作:
      • 释放Gateway:Gateway收到完成信号后,重新允许该外设的新中断请求进入PLIC。
      • 更新PLIC状态:PLIC标记该中断处理完成,可参与后续仲裁。

2.4 PLIC寄存器

不同的处理器会给PLIC不同的基址(base),程序访问的地址采用base+offset的方式访问。

2.4.1. 中断源优先级寄存器

地址偏移(Hex)中断源(ID)功能描述
0x000000无(保留)中断源0不存在,保留空间
0x0000041中断源1的优先级配置
0x0000082中断源2的优先级配置
0x000FFC1023中断源1023的优先级配置
  • 功能:标记中断请求的等待处理状态。
    • 置位条件:外设触发中断时自动置1。
    • 清除条件:读claim寄存器会清除pending位

2.4.3. 中断使能位(Enable Bits)

地址偏移(Hex)上下文(Context)中断源范围功能描述
0x00200000–31上下文0的中断源0~31使能位
0x002004032–63上下文0的中断源32~63使能位
0x00207C0992–1023上下文0的中断源992~1023使能位
0x00208010–31上下文1的中断源0~31使能位
0x002084132–63上下文1的中断源32~63使能位
0x1F1FFC15871992–1023上下文15871的中断源992~1023使能位

PLIC 通过连续32位使能寄存器组管理全局中断的启用状态,每个寄存器对应32个中断源,排列方式与挂起位一致

2.4.4. 优先级阈值、声明、完成寄存器

地址偏移(Hex)上下文(Context)功能描述
0x2000000上下文0的优先级阈值配置
0x2000040上下文0的中断声明(Claim)与完成(Complete)
0x2010001上下文1的优先级阈值配置
0x2010041上下文1的中断声明与完成
0x3FFF00015871上下文15871的优先级阈值配置
0x3FFF00415871上下文15871的中断声明与完成
  1. 优先级阈值寄存器
    PLIC为每个上下文(Hart+特权模式)提供优先级阈值寄存器(WARL字段),用于设定最低响应优先级。所有优先级≤阈值的中断将被屏蔽。例如:

    • 阈值为0时,允许所有非零优先级中断通过。
    • 阈值设为最大值时,完全禁止中断通知,核心可通过轮询claim寄存器主动查询中断。
      阈值机制平衡了实时性与中断负载,优先级范围由具体实现决定。
  2. 声明寄存器(Claim)
    核心通过读取claim寄存器触发中断认领操作,流程如下:

    • PLIC原子性确定目标上下文中最高优先级的中断ID,并清除其全局挂起位(Pending Bit)。
    • 若无待处理中断则返回ID=0。
    • 即使核心未收到中断通知(EIP未置位),仍可主动发起认领,实现灵活轮询。
      此操作不受阈值限制,但优先级≤阈值的中断不会参与仲裁。
  3. 完成寄存器(Complete)
    核心处理完中断后,向complete寄存器写入中断ID,触发以下行为:

    1. PLIC不校验ID是否匹配或有效,若ID无效则静默忽略。
    2. 网关收到完成信号后,允许对应中断源提交新请求。
    3. 若未完成操作,网关将阻塞同一中断源的新请求,确保原子性。

完成机制与声明操作协同,形成“认领-处理-释放”闭环。

3 芯来ECLIC

3.1 蜂鸟E200处理器的中断接口

我们先来看下蜂鸟E200处理器的中断接口
在这里插入图片描述

  • 在处理器顶层接口中有 根中断输入信号,分别是软件中断、计时器 中断、外部中断和调试中断。
  • Soc 的 CLINT 模块产生 根软件中断信号和 根计时器中断信号,通给蜂鸟 E200 处理器核
  • soc 的PLIC 接入 个外部中断源将其仲裁后生成 根外部中断信号,通给蜂鸟 E200 处理器核
  • Soc 层面的调试模块生成 根调试中断,通给蜂鸟 E200 处理器核
  • 所有的中断信号均由蜂鸟 E200 处理器核的交付模块进行处理

硬件源码感兴趣的同学移步:https://github.com/SI-RISCV/e200_opensource

3.2 ECLIC

ECLIC(Enhanced Core-Local Interrupt Controller)是芯来科技(Nuclei)基于 RISC-V 社区提出的 CLIC(Core-Local Interrupt Controller)扩展提案 设计的增强型中断控制器,后续ECLIC也是芯来商用的内核的核心中断控制器架构。

另外CLIC 目前是 RISC-V 社区提出的 扩展提案,尚未正式纳入 RISC-V 特权架构规范(Privileged Specification)感兴趣可以参考:https://github.com/riscv/riscv-fast-interrupt。这里不做具体介绍

相较于标准 CLIC,ECLIC 在以下方面进行了增强:

  1. 中断咬尾(Tail-Chaining)技术:
    • 通过硬件指令(如 JALMNXTI)实现零延迟中断切换,减少上下文保存与恢复的开销。
    • 示例场景:当低优先级中断 B 在中断 A 处理时触发,处理完A的服务程序后,直接跳转至 B 的服务程序,无需退出 A 的上下文。
  2. 扩展中断号与优先级范围:
    • 支持更多中断源(如外部中断号扩展至 19~4095),适配复杂外设场景。
    • 优先级阈值与动态调整机制,优化实时任务响应。
  3. 硬件加速指令集成:
    • 自定义指令优化中断处理流程,例如单指令完成中断挂起位清除与优先级更新。
  4. 低功耗设计:
    • 在中断空闲时自动进入低功耗状态,减少嵌入式设备的能耗。

优点
避免传统多控制器(CLINT+PLIC)的复杂协同问题,简化芯片设计。

3.2.1 中断接口连线

在这里插入图片描述
0-18中断号用于内部中断,19~4095中断号用于外部中断,注意中断的编号与中断的优先级是没有关系的。

其中:

  • 1、3号中断是内核TIMER单元生成的软件中断。
  • 5、7号中断是内核TIMER单元生成的计时器中断。

uCore在M模式下处理mtime_irq和msip,在S模式下处理stime_irq和ssip。

3.2.2 ECLIC逻辑结构

在这里插入图片描述
有几点需要注意的是:

  • 1、ECLIC单元只服务于一个core,且在核心内部是私有的
  • 2、需要通过将CSR寄存器mtvec的LSB位设置为ECLIC模式来启用ECLIC(MTVEC寄存器配置)
  • 3、ECLIC在功能上与PLIC互斥。

ECLIC单元用于仲裁多个内部和外部中断,向核心发送中断请求,并支持中断抢占。

3.2.3 ECLIC相关概念

和通用中断设计一样也有一系列的概念描述,下面简单说明下

  1. 中断目标
    如3.2.2中图所示ECLIC单元通过一条线路将中断源仲裁给处理器核心(作为中断目标)

  2. 中断源
    ECLIC单元最多可支持4096个中断源。

  3. 中断源ID
    ECLIC单元为每个中断源分配了一个唯一的ID。例如,如果ECLIC单元的硬件实现确实配置为支持4096个中断,则该ID应为0到4095。
    **NOTE:**在Nuclei处理器核心中,0到18的中断ID预留用于核心指定的内部中断。3和7在所有Nuclei处理器核心中固定为软件中断和定时器中断。某些Nuclei核心可能有更多内部中断。

3.2.4 ECLIC寄存器

eclic相对core的基址是0x20000
在这里插入图片描述
ECLIC中的寄存器和相应的偏移量

偏移量 (Offset)权限 (Permission)寄存器名称 (Register)位宽 (Width)说明
0x0000MRW/SROcliccfg8-bit配置寄存器,控制ECLIC全局行为(优先级位宽)。
0x0004SROclicinfo32-bit只读信息寄存器,包含ECLIC硬件实现信息(优先级位宽、实际中断源数量)。
0x000BMRWmth8-bit机器模式阈值寄存器,设置当前上下文的中断响应优先级阈值。
0x1000 + 4*iMRWclicintip[i]8-bit中断挂起寄存器组,标记中断源 i 的挂起状态(Pending Bit)。
0x1001 + 4*iMRWclicintie[i]8-bit中断使能寄存器组,控制中断源 i 是否启用。
0x1002 + 4*iMRWclicintattr[i]8-bit中断属性寄存器组,配置中断源 i 的触发方式(边沿/电平)和模式(向量/非向量)。
0x1003 + 4*iMRWclicintctl[i]8-bit中断控制寄存器组,设置中断源 i 的优先级(Priority Level)。

上述“i”表示中断ID、ECLIC注册仅支持对齐访问、ECLIC寄存器的地址空间为0x0000到0x FFFF的范围

  • MRW:机器模式可读写(Machine Read-Write)。
  • SRO:监管者模式只读(Supervisor Read-Only)。
  1. cliccfg
    cliccfg寄存器是一个全局配置寄存器,用来控制中断级别和优先级。芯来官方spec有具体说明,感兴趣可以自行学习。

  2. clicinfo
    clicinfo寄存器是一个全局信息寄存器,软件通过读取该寄存器查询全局参数。
    一般cliccfg配置会基于从clicinfo获取到的信息。

  3. mth
    mth寄存器用于设置目标中断阈值水平。

    • 作用:mth(Machine Threshold Register)寄存器用于设置当前上下文(Context)的中断响应优先级阈值,仅允许优先级高于该阈值的中断触发处理器响应。
    • 例如:设置 mth = 3:仅优先级 ≥4 的中断会触发处理器处理。
  4. clicintip[i]
    用于标记 中断源的挂起状态,即记录哪些中断请求已触发但尚未被处理器响应或处理。

    • 如果一个中断源的IP位为1,则表示触发了该中断。
    • 对于边沿触发中断源,硬件本身可以清除IP位。
    • 如果中断源设置为电平触发,IP位实时反映中断源的电平,
  5. clicintie[i]
    用来控制对应中断号的使用,
    如果clicintie[i]寄存器被编程为0,则表示该中断源被屏蔽。反之表示中断被使能

  6. clicintattr[i]
    用于设置1、中断源的电平或边沿触发属性 2、中断是向量型还是非向量型

  7. clicintctl[i]
    ECLIC中断级别和优先级,受cliccfg的影响。

    • 级别值(Level)越大,优先级越高
    • 优先级值(Priority)越大,优先级越高
    • 中断ID越大,优先级越高

芯来官方ISA spec有具体说明,感兴趣可以自行找来深入学习

3.2.5 ECLIC中断仲裁机制

  1. 中断参与仲裁的前提是:

    • 1、对应中断使能打开
    • 2、对应penging位置起(中断触发)
  2. 仲裁原则是:

    • 1、检查中断Level,中断源的Level越大,仲裁优先级越高。
    • 2、如果Level相同,则检查Priority,优先级值较大的中断源具有更高的仲裁优先级。
    • 3、如果电平和优先级都相等,则考虑ID。中断ID较大的中断源具有更高的仲裁优先级。

3.2.6 向量(Vectored)和非向量(Non-Vectored)中断

在CLIC模式下,每个中断源可以配置为向量处理模式或非向量处理模式(通过ECLIC寄存器clicintattr[i]的shv字段)。

  1. 向量中断(Vectored Interrupts)

    • 定义:每个中断源拥有独立的中断服务程序(ISR)入口地址,硬件根据中断 ID 直接跳转至对应入口,无需软件判断中断源。
    • 核心特性:
      • 硬件自动跳转:中断触发后,ECLIC 根据中断源 ID 直接定位 ISR 入口地址。
      • 低延迟:省去软件查询中断源的时间,显著提升实时性。
      • 向量表配置:需预先在内存中定义中断向量表,存储各中断源的 ISR 地址。
  2. 非向量中断(Non-Vectored Interrupts)
    定义与机制
    • 定义:所有中断共享一个公共入口地址,软件需读取中断挂起寄存器(Pending Bits)判断具体中断源,再分派至对应 ISR。
    • 核心特性:
    ○ 统一入口:所有中断触发后均跳转至同一入口地址。
    ○ 软件分派:通过读取 CLICINTIP 或 CLICCLAIM 寄存器确定中断源。
    ○ 灵活性高:适合中断源动态变化或资源受限的系统。

对于具体的实现可以参考 ECLIC中断流程及实际应用 —— RISCV中断机制(二)。

3.2.7 中断抢占(Preemption)和中断咬尾(Tail-Chaining)

CLINT模式下,core不支持中断抢占和中断咬尾的。芯来科技设计的增强型中断控制器,在 RISC-V 标准 CLIC 基础上优化了中断响应效率,二者协同工作以实现低延迟和高实时性的中断处理

1. 中断抢占(Preemption)
如果处于CLIC模式,当核心正在处理一个中断时,可能会有更高优先级的新中断请求,此时核心可以停止当前的中断服务例程,开始处理新的中断并执行其“中断服务例程”。因此,形成了中断抢占(即前一个中断尚未返回,而新中断已被抢占),并且可能存在多层嵌套。

定义与机制:

  • 定义:高优先级中断可抢占当前正在处理的低优先级中断,立即获得处理器执行权。
  • 触发条件,新到达的中断满足以下条件:
    1. 优先级更高:新中断的 Level + Priority 组合高于当前中断。
    2. 阈值允许:新中断的优先级高于当前上下文的阈值(mth 寄存器配置)。
    3. 中断使能:新中断在 CLICINTIE[i] 中被启用。

抢占流程:

  1. 抢占检测:ECLIC 硬件实时监控中断队列,发现更高优先级中断时触发抢占。
  2. 上下文保存:当前中断的上下文(如寄存器状态)被压栈保护。
  3. 执行新中断:处理器跳转至新中断的服务程序(ISR)入口。
  4. 恢复原中断:新 ISR 执行完成后,恢复原中断的上下文并继续执行。

NOTE:向量中断和非向量中断的中断抢占是有区别的,具体参考 ECLIC中断流程及实际应用 —— RISCV中断机制(二)。

  1. 中断咬尾
    如果在CLIC模式下,核心正在处理一个中断时,启动一个新的中断请求,但是新请求的级别不高于处理的请求,因此新的中断请求不能抢占处理的请求。在处理完当前中断后,理论上需要恢复上下文,然后退出中断服务例程,返回主程序,然后处理新的中断。“尾链”可以节省这种背靠背的“上下文保存”和“上下文恢复”的成本。

定义与机制:

  • 定义:当新中断到达时,若其优先级 不高于当前中断,但当前中断已处理完成,ECLIC 硬件直接跳转至新中断的 ISR,跳过上下文恢复与再保存的开销。
  • 触发条件:
    1. 新中断优先级 ≤ 当前中断优先级。
    2. 当前中断的 ISR 已执行完毕(ECLIC_CLAIM 完成操作)。

咬尾流程:

  1. 中断完成:当前 ISR 执行 ECLIC_CLAIM 完成操作,释放中断源。
  2. 检测新中断:ECLIC 检测到挂起的新中断,优先级 ≤ 当前中断。
  3. 直接跳转:硬件直接加载新 ISR 的入口地址,不恢复原上下文(因原上下文已处理完毕)。

NOTE:只有非向量中断才支持中断咬尾功能,具体参考 ECLIC中断流程及实际应用 —— RISCV中断机制(二)。

  1. 抢占与咬尾的协同作用
场景抢占机制咬尾机制
高优先级中断到达立即抢占当前中断不触发
同优先级中断连续到达不触发直接跳转至下一个中断
低优先级中断到达不触发等待当前中断完成后触发咬尾

协同流程示例:

  1. 中断 A(Level=2)正在执行。
  2. 中断 B(Level=3)到达 → 触发抢占,保存 A 的上下文,执行 B。
  3. 中断 C(Level=2)在 B 执行期间到达 → 不满足抢占条件,挂起等待。
  4. B 执行完成 → 检测到挂起的 C,触发咬尾,直接跳转至 C 的 ISR。
  5. C 执行完成 → 恢复 A 的上下文,继续执行。

ECLIC 通过 中断抢占 和 中断咬尾 机制,显著优化了中断响应效率

  • 抢占 确保高优先级任务即时响应,适合安全关键型应用。
  • 咬尾 减少冗余的上下文操作,适合高频、连续中断场景。

开发者需结合具体需求,合理配置 Level、Priority 和阈值,并利用芯来提供的自定义指令( jalmnxti)和特权寄存器CSR_JALMNXTI最大化硬件加速潜力,具体参考 ECLIC中断流程及实际应用 —— RISCV中断机制(二)。

4 CLINT、PLIC、ECLIC区别总结

这里总结不是简单罗列,也是尽量补充些前面没提到的。

CLINT其实没什么可以多总结的,就是负责管理内部中断(软件中断和定时器中断),ECLIC是相当于对本地和全局中断上做了整合,相当于CLINT+PLIC的结合;在单core下确实可以这么认为,但现在大多数的芯片都是多个core,所以ECLIC并不能直接替代CLINT+PLIC。

实际上ECLIC也只是本地中断管理,也就是说在多core的情况下,每个core都有一个ECLIC,此时外部来了一个中断要分给哪个core呢?

4.1 单core下的中断接线架构

  • 单核下仅配置了PLIC和CLINT
    在这里插入图片描述
  • 单核下仅配置了ECLIC
    在这里插入图片描述
    可以看到单核下eclic确实可以直接完成PLIC+CLINT的工作

4.2 多核(SMP)中断接线图

在这里插入图片描述
图示为多核情况下为配置了PLIC和ECLIC,外部进来的中断可以通过PLIC直接分发给各个core,而ECLIC则需要一个CIDU(Cluster Interrupt Distribution Unit )分发给特定core内部的ECLIC,仲裁后再给core处理

ECLIC没有PLIC的门控或者说路由功能,需要CIDU协助,理论上SMP多核可以完全通过CIDU+ECLIC来取代PLIC+CLINT,AMP多核则可以在CLUSTER外部在加一级soc平台级别IDU来完成;但实际上是还要看芯片的复杂程度和最终的应用。这可能也是芯来科技做ECLIC方案的原因之一吧。

简单总结一下:

特性PLICECLIC
中断类型仅外部中断本地中断 + 外部中断
优先级机制单一优先级(0~7)Level + Priority 分层仲裁
延迟优化中等(需仲裁和 Claim 操作)极低(抢占 + 咬尾机制)
多核协同依赖核间中断(IPI)CIDU 来支持中断分发
适用场景通用多核系统(服务器、网关)实时嵌入式系统(工业控制、自动驾驶)

问题

最后这里留个问题:为什么多核服务器和网关推荐使用PLIC呢?

我认为原因有二:

  • 1、当前linux操作系统不支持中断抢占,PLIC的Claim/Complete 机制,确保PLIC中断处理的原子性,而ECLIC的中断抢占和咬尾正是其优势所在。
  • 2、linux对PLIC驱动做了适配,无需重复造轮子(可以通过idu+eclic配合保证中断处理的原子性,linux已经做了PLIC的驱动的适配,所以也没必要再折腾)

有问题及不足之处,还请各位大佬补充。

参考:
RISV ISA spec
riscv-plic-spec
riscv-fast-interrupt
Sive ACLINT spec
芯来科技N级别指令集架构
RISC-V SiFive U54内核——中断和异常详解

相关文章:

RISC-V CLINT、PLIC及芯来ECLIC中断机制分析 —— RISC-V中断机制(一)

在长期的嵌入式开发实践中,对中断机制的理解始终停留在表面层次,特别当开发者长期局限于纯软件抽象层面时,对中断机制的理解极易陷入"知其然而不知其所以然"的困境,这种认知的局限更为明显;随着工作需要不断…...

Idea Code Templates配置

Templates配置 配置位置模板案例 配置位置 Settings->Editor->File and Code Templates模板案例 #if (${PACKAGE_NAME} && ${PACKAGE_NAME} ! "")package ${PACKAGE_NAME};#endimport com.ktools.common.dataprocess.DataProcess; import com.ktools…...

fakebook

解题方法&#xff1a; 一.用御剑扫描后台&#xff0c;查看robot.txt文件&#xff0c;发现是一个/user.php.bak,备份文件&#xff0c;我们访问这个文件 <?phpclass UserInfo {public $name "";public $age 0;public $blog "";public function __co…...

英伟达Blackwell架构重构未来:AI算力革命背后的技术逻辑与产业变革

——从芯片暴力美学到分布式智能体网络&#xff0c;解析英伟达如何定义AI基础设施新范式 开篇&#xff1a;当算力成为“新石油”&#xff0c;英伟达的“炼油厂”如何升级&#xff1f; 2025年3月&#xff0c;英伟达GTC大会上&#xff0c;黄仁勋身披标志性皮衣&#xff0c;宣布了…...

用 Rust 搭建一个优雅的多线程服务器:从零开始的详细指南

嘿&#xff0c;小伙伴们&#xff01;今天咱们来聊聊怎么用 Rust 搭建一个牛气哄哄的多线程服务器&#xff0c;还能在需要的时候优雅地关机。为啥要用 Rust 呢&#xff1f;因为 Rust 是个超级靠谱的语言&#xff0c;它能保证内存安全&#xff0c;写并发代码的时候不用担心那些让…...

今日行情明日机会——20250509

上证指数今天缩量&#xff0c;整体跌多涨少&#xff0c;走势处于日线短期的高位~ 深证指数今天缩量小级别震荡&#xff0c;大盘股表现更好~ 2025年5月9日涨停股主要行业方向分析 一、核心主线方向 服装家纺&#xff08;消费复苏出口链驱动&#xff09; • 涨停家数&#xf…...

ESP32开发入门(七):HTTP开发实践

一、HTTP协议基础 1.1 什么是HTTP&#xff1f; HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;是互联网上应用最为广泛的一种网络协议&#xff0c;用于从服务器传输超文本到本地浏览器。它是一种无状态的请求/响应协议&#xff0c;工作…...

【强化学习】强化学习算法 - 马尔可夫决策过程

马尔可夫决策过程 (Markov Decision Process, MDP) 1. MDP 原理介绍 马尔可夫决策过程 (MDP) 是强化学习 (Reinforcement Learning, RL) 中用于对序贯决策 (Sequential Decision Making) 问题进行数学建模的标准框架。它描述了一个智能体 (Agent) 与环境 (Environment) 交互的…...

数据结构【二叉搜索树(BST)】

二叉搜索树 1. 二叉搜索树的概念2. 二叉搜索树的性能分析3.二叉搜索树的插入4. 二叉搜索树的查找5. 二叉搜索树的删除6.二叉搜索树的实现代码7. 二叉搜索树key和key/value使用场景7.1 key搜索场景&#xff1a;7.2 key/value搜索场景&#xff1a; 1. 二叉搜索树的概念 二叉搜索…...

振动临近失效状态,怎么频谱会是梳子?

这是一个破坏性试验的终末期振动波形。左边时域&#xff0c;右边频域。这是咋回事&#xff0c;时域看起来原本很正常的冲击信号&#xff0c;怎么频域是那个鬼样子。 同一组波形&#xff0c;放大后的频域 - 低频部分&#xff1a; 一个解释&#xff1a;...

橡胶制品行业质检管理的痛点 质检LIMS如何重构橡胶制品质检价值链

橡胶制品广泛应用于汽车、医疗、航空等领域&#xff0c;其性能稳定性直接关联终端产品的安全性。从轮胎耐磨性测试到密封件耐腐蚀性验证&#xff0c;每一项检测数据都是企业参与市场竞争的核心筹码。然而&#xff0c;传统实验室管理模式普遍面临设备调度混乱、检测流程追溯断层…...

【CTFSHOW_Web入门】命令执行

文章目录 命令执行web29web30web31web32web33web34web35web36web37web38web39web40web41web42web43web44web45web46web47web48web49web50web51web52web53web54web55web56web57web58web59web60web61web62web63web64web65web66web67web68web69web70web71web72web73web74web75web7…...

三维底座+智能应用,重构城市治理未来

在“数字中国”战略的引领下&#xff0c;住房和城乡建设领域正迎来一场深刻的数字化转型浪潮。2024年《“数字住建”建设整体布局规划》的发布&#xff0c;明确提出以“CIM”&#xff08;城市信息模型&#xff09;为核心&#xff0c;构建城市三维数字底座&#xff0c;推动住建行…...

养生:塑造健康生活的良方

养生是一场贯穿生活的自我关爱行动&#xff0c;从饮食、运动、睡眠到心态调节&#xff0c;每一个环节都对健康有着深远影响。以下为你带来全面且实用的养生策略。 饮食养生&#xff1a;科学搭配&#xff0c;呵护肠胃 合理规划三餐&#xff0c;遵循 “早营养、午均衡、晚清淡”…...

docker 镜像的导出和导入(导出完整镜像和导出容器快照)

一、导出原始镜像 1. 使用 docker save 导出完整镜像 适用场景&#xff1a;保留镜像的所有层、元数据、标签和历史记录&#xff0c;适合迁移或备份完整镜像环境。 操作命令 docker save -o <导出文件名.tar> <镜像名:标签>示例&#xff1a;docker save -o milvu…...

NestJS 框架深度解析

框架功能分析 NestJS 是一个基于 Node.js 的渐进式框架&#xff0c;专为构建高效、可扩展的服务器端应用程序而设计。其核心理念结合了 面向对象编程&#xff08;OOP&#xff09;、函数式编程&#xff08;FP&#xff09; 和 函数式响应式编程&#xff08;FRP&#xff09;&…...

游戏引擎学习第267天:为每个元素添加裁剪矩形

仓库已满:https://gitee.com/mrxiao_com/2d_game_6 新仓库:https://gitee.com/mrxiao_com/2d_game_7 回顾并为今天的内容定下基调 我们今天的主要目标是对游戏的调试“Top List”进行改进&#xff0c;也就是用来显示游戏中耗时最多的函数或模块的性能分析列表。昨天我们已经实…...

基于阿里云DataWorks的物流履约时效离线分析

基于阿里云DataWorks的物流履约时效离线分析2. 数仓模型构建 ORC和Parquet区别&#xff1a; 压缩率与查询性能 压缩率 ORC通常压缩率更高&#xff0c;文件体积更小&#xff0c;适合存储成本敏感的场景。 Parquet因支持更灵活的嵌套结构&#xff0c;压缩率略…...

web 自动化之 selenium 元素四大操作三大切换等待

文章目录 一、元素的四大操作二、三大切换&等待1、切换窗口:当定位的元素不在当前窗口&#xff0c;则需要切换窗口2、切换iframe&#xff1a;当定位的元素在frame/iframe&#xff0c;则需要切换 一、元素的四大操作 1、输入 2、点击 3、获取文本 4、获取属性 import time…...

前端取经路——性能优化:唐僧的九道心经

大家好&#xff0c;我是老十三&#xff0c;一名前端开发工程师。性能优化如同唐僧的九道心经&#xff0c;是前端修行的精髓所在。在本文中&#xff0c;我将为你揭示从网络传输到渲染优化的九大关键技术&#xff0c;涵盖HTTP协议、资源加载策略、缓存控制等核心难题。通过这些实…...

前端工程化和性能优化问题详解

选自己熟悉的内容当作重难点&#xff0c;最好是前端相关的 以下是面向前端面试官介绍前端工程化和性能优化问题的结构化回答框架&#xff0c;结合行业标准和实战经验进行整合&#xff1a; 一、前端工程化核心解析 定义与目标 前端工程化是通过工具链和规范化流程&#xff0c;将…...

【应急响应】- 日志流量如何分析?

【应急响应】- 日志流量如何下手&#xff1f;https://mp.weixin.qq.com/s/dKl8ZLZ0wjuqUezKo4eUSQ...

8b10b编解码仿真

一、基本概念 8B/10B编码&#xff08;8-bit to 10-bit encoding&#xff09;是一种将8位数据&#xff08;包括数据字符和控制字符&#xff09;转换为10位符号&#xff08;Symbol&#xff09;的编码技术&#xff0c;由IBM工程师Al Widmer和Peter Franaszek于1983年提出。其核心思…...

软件工程之面向对象分析深度解析

前文基础&#xff1a; 1.软件工程学概述&#xff1a;软件工程学概述-CSDN博客 2.软件过程深度解析&#xff1a;软件过程深度解析-CSDN博客 3.软件工程之需求分析涉及的图与工具&#xff1a;软件工程之需求分析涉及的图与工具-CSDN博客 4.软件工程之形式化说明技术深度解…...

常见标签语言的对比

XML、JSON 和 YAML 是常见的数据序列化格式 相同点 结构化数据表示 三者均支持嵌套结构&#xff0c;能描述复杂的数据层级关系&#xff08;如对象、数组、键值对&#xff09;。跨平台兼容性 均为纯文本格式&#xff0c;可被多种编程语言解析&#xff0c;适用于跨系统数据交换…...

【Linux】环境变量(图文)

目录 一、main函数的参数解释&#xff1a; 1、argc和argc的解释 2、为什么要这样设置&#xff1f; 3、注意&#xff1a; 4、命令行计算器&#xff1a; 二、认识环境变量 三、见见环境变量 1、执行一个程序的前提 2、指令&#xff1a;echo $PATH 3、为什么系统自带的指令…...

基于OpenCV的人脸识别:EigenFaces算法

文章目录 引言一、概述二、代码解析1. 准备工作2. 加载训练图像3. 设置标签4. 准备测试图像5. 创建和训练识别器6. 进行预测7. 显示结果 三、代码要点总结 引言 人脸识别是计算机视觉领域的一个重要应用&#xff0c;今天我将通过一个实际案例来展示如何使用OpenCV中的EigenFac…...

跟我学C++中级篇——STL容器的查找对比

一、C标准库的查找 在C的STL中&#xff0c;对容器或相关序列的查找中&#xff0c;有两种方式&#xff0c;一种是std::find&#xff0c;另外一种是std::search。而且在它们的基础上&#xff0c;还衍生出std::find_if、std::find_if_not、std::find_end等和std::search_n、range…...

解构C++高级命名空间:构建空间作用域·控制兼容

前引&#xff1a;C作为C语言的继承者&#xff0c;也是其掘墓人。在编程语言的演化长河中&#xff0c;C始终游走在【兼容】与【革新】的路上。C程序员眼中&#xff08;高效直接&#xff09;的全局函数&#xff0c;对于C开发者来说是【命名空间污染的炸弹】&#xff0c;如果C未发…...

怎么判断是不是公网IP?如何查看自己本地路由器是内网ip还是公网?

在网络世界中&#xff0c;IP 地址如同每台设备的 “门牌号”&#xff0c;起着至关重要的标识作用。而 IP 地址又分为公网 IP 和私网 IP&#xff0c;准确判断一个 IP 属于哪一类&#xff0c;对于网络管理、网络应用开发以及理解网络架构等都有着重要意义。接下来&#xff0c;我们…...

微服务中 本地启动 springboot 无法找到nacos配置 启动报错

1. 此处的环境变量需要匹配nacos中yml配置文件名的后缀 对于粗心的小伙伴在切换【测试】【开发】环境的nacos使用时会因为这里导致项目总是无法启动成功...

android-ndk开发(11): 安装 repo 命令

1. 长话短说 mkdir ~/soft/bin curl -L https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repo chmod x repo~/.pathrc 添加: export PATH$PATH:~/soft/bin2. 短话长说 repo 的官方介绍页面&#xff1a; https://gerrit.googlesource.com/git-repo/ repo 的官方下载地…...

【设计模式】GoF设计模式之策略模式(Strategy Pattern)

设计模式之策略模式 Strategy Pattern V1.0核心概念角色代码示例程序运行结果代码讲解 适用范围 V1.0 核心概念 策略模式是一种行为型设计模式&#xff0c;其核心思想是业务类执行某个动作时&#xff0c;可以使用该动作的不同的实现&#xff0c;并在程序运行中可以切换使用该…...

QT6(35)4.8定时器QTimer 与QElapsedTimer:理论,例题的界面搭建,与功能的代码实现。

&#xff08;112&#xff09; &#xff08;113&#xff09;模仿随书老师给的源代码搭建的&#xff0c; LCD 显示的部分不一样 &#xff1a; &#xff08;114&#xff09;以下开始代码完善&#xff1a; 关联定时器的信号与槽函数 &#xff1a; &#xff08;115&#xff09;…...

用Python监控金价并实现自动提醒!附完整源码

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【星海网址导航】&#x1f4bb;香港大宽带-4H4G 20M只要36/月&#x1f449; 点此查看详情 在日常投资中&#xff0c;很多朋友喜欢在一些平台买点黄金&#xff0c;低买高卖赚点小差价。但黄金价格实时波动频繁&#xf…...

加密领域 AI Agent 的崛起:DeFAI 如何重塑金融

原文&#xff1a;https://polkadot.com/blog/defai-crypto-ai-agents-explained/ 编译&#xff1a;OneBlock 一些创新大肆宣扬&#xff0c;另一些则在后台默默酝酿&#xff0c;不断迭代&#xff0c;直到它们突然无处不在&#xff0c;去中心化的金融系统也不例外。DeFi 解锁了…...

电位器如何接入西门子PLC的模拟量输入

1.设计思考 我现在手上有一个三线10kΩ的滑动变阻器&#xff0c;想让其当作模拟量接入西门子PLC中&#xff0c;外部改变电阻&#xff0c;PLC程序中能看到对应的阻值或电压&#xff0c;这样可以练习模拟量输入这个知识点&#xff01; 2.了解模拟量的种类 模拟量一般有电压型和…...

发那科机器人5(异常事件和程序备份加载+ROBOGUIDE离线仿真)

发那科机器人5(异常事件和程序备份加载+ROBOGUIDE离线仿真) 一,异常事件和程序备份加载1,常见异常事件2,零点复归介绍3,程序备份-加载(未整理)二,`ROBOGUIDE`离线仿真1,仿真软件简介及安装步骤(未整理)2,机器人==导入与工具==与==工件添加==2.1,机器人导入(未整…...

第二章 如何安装KEIL5和新建工程

单芯片解决方案&#xff0c;开启全新体验——W55MH32 高性能以太网单片机 W55MH32是WIZnet重磅推出的高性能以太网单片机&#xff0c;它为用户带来前所未有的集成化体验。这颗芯片将强大的组件集于一身&#xff0c;具体来说&#xff0c;一颗W55MH32内置高性能Arm Cortex-M3核心…...

【Lattice FPGA 开发】Diamond在线调试Reveal逻辑乱跳的解决

在Vivado中在always块中写逻辑时如果出现always块中的异步复位敏感词在块内部未使用的情况&#xff0c;如下例的rst&#xff1a; always (posedge clk or posedge rst) begin if(~tx_sense_flag)o_rd_adr < d1;else if((o_rd_adr d94) & (bit_cnt d7))o_rd_adr <…...

跨浏览器自动化测试的智能生成方法

一、背景与挑战&#xff1a;跨浏览器测试为什么“难”&#xff1f; 在现代Web应用开发中&#xff0c;跨浏览器兼容性是用户体验的底线保障。面对Chrome、Firefox、Safari、Edge乃至IE、移动浏览器等多种运行环境&#xff0c;开发者与测试人员常面临&#xff1a; 相同DOM在不同…...

docker操作镜像-以mysql为例

Docker安装使用-CSDN博客 docker操作镜像-以mysql为例 当安装一个新的镜像时可以登录https://hub.docker.com/直接搜索想要安装的镜像&#xff0c;查看文档 1&#xff09;拉取镜像 docker pull mysql 或者 docker pull mysql:版本号 然后直接跳到第4&#xff09;步即可 2…...

【Yolo精读+实践+魔改系列】Yolov3论文超详细精讲(翻译+笔记)

前言 前面咱们已经把 YOLOv1 和 YOLOv2 的老底都给掀了&#xff0c;今天轮到 YOLOv3 登场&#xff0c;这可是 Joseph Redmon 的“封神之作”。讲真&#xff0c;这哥们本来是搞学术的&#xff0c;结果研究的模型被某些军方拿去“整点活”——不是做人是做武器的那种活。于是他一…...

【Python从入门到精通】--‘@‘符号的作用

在Python中&#xff0c;符号主要有三种用途&#xff1a;装饰器&#xff08;Decorator&#xff09;、矩阵乘法运算符&#xff08;Python 3.5&#xff09;以及类型提示中的修饰符&#xff08;如typing&#xff09;。 目录 1.--装饰器&#xff08;Decorator&#xff09; 2.--矩…...

git命令积累(个人学习)

如何将docx文件不上传&#xff1f; 创建或编辑 .gitignore 文件 打开 .gitignore 文件&#xff0c;添加以下内容来忽略所有 .docx 文件&#xff1a; *.docx清除已追踪的 .docx 文件 git rm --cached "*.docx"这将从 Git 仓库中删除 .docx 文件&#xff0c;但不会删…...

【人工智能核心技术全景解读】从机器学习到深度学习实战

目录 &#x1f30d; 前言&#x1f3db;️ 技术背景与价值&#x1f494; 当前技术痛点&#x1f6e0;️ 解决方案概述&#x1f465; 目标读者说明 &#x1f9e0; 一、技术原理剖析&#x1f4ca; 核心概念图解&#x1f4a1; 核心作用讲解&#x1f527; 关键技术模块说明⚖️ 技术选…...

android-ndk开发(10): use of undeclared identifier ‘pthread_getname_np‘

1. 报错描述 使用 pthread 获取线程名字&#xff0c; 用到 pthread_getname_np 函数。 交叉编译到 Android NDK 时链接报错 test_pthread.cpp:19:5: error: use of undeclared identifier pthread_getname_np19 | pthread_getname_np(thread_id, thread_name, sizeof(thr…...

CAP理论:分布式系统的权衡

CAP理论&#xff1a;分布式系统的权衡 引言一、CAP理论的核心定义二、CAP的权衡逻辑&#xff1a;如何选择&#xff1f;三、CAP的常见误区与澄清四、CAP的实际应用场景与技术实现五、现代分布式系统对CAP的突破与演进六、CAP理论的设计建议总结 引言 在分布式系统的设计与实践中…...

【软件设计师:软件工程】11.项目管理

一、项目管理内容 项目管理是通过规划、组织、协调资源,在有限时间与预算内实现特定目标的过程,核心是平衡范围、时间、成本、质量四大要素,确保项目成功交付。 1.核心内容 项目启动目标定义:明确项目范围、交付成果及成功标准。可行性分析:评估技术、经济与风险可行性…...

遗传算法求解异构车队VRPTW问题

这里写目录标题 染色体编码设计&#xff1a;两种染色体编码方式一、客户排列 分割点&#xff08;Giant Tour Split&#xff09;1. 示例编码与解码2. 采用 客户排列 分割点 设计的特点3. 编码实现&#xff08;基于Python&#xff09; 二、使用整体聚类局部路由&#xff08;cl…...