RISC-V AIA学习3---APLIC第三部分

1. Reset

APLIC复位后,其所有状态都变得有效且一致,但以下情况除外:

a. 每个中断域的domaincfg寄存器;

b. 可能是machine-level interrupt domain的MSI地址配置寄存器;

c. 每个中断域的genmsi寄存器的Busy位(如果存在)。

以上这几种情况,在APLIC复位后,需要根据这些寄存器的具体定义来确定。不管 APLIC 其他部分的状态怎么变,这几个特定的寄存器或寄存器中的某些位的状态是有明确规定的,不会因为复位操作而变得不确定。这样可以保证在系统复位后,这些关键的配置信息和状态标志能够保持稳定,以便系统能够正确地重新启动和运行中断相关的功能。

2. Precise effects on interrupt-pending bits

3. APLIC的直接传递模式

当 APLIC 的中断域配置为直接传递模式domaincfg.DM = 0)时,APLIC 会通过专用线路向每个处理器核心(hart)直接发送中断信号。这种模式下,APLIC 作为平台级控制器,负责管理中断到各 hart 的路由和优先级处理。

3.1 IDC(中断传递控制)结构

每个中断域的内存映射控制区域末尾包含一个IDC 结构体数组,每个 hart 对应一个IDC结构体(32 字节,32 字节对齐)。第一个IDC结构,是该中断域内索引为0的hart;第二个是该中断域索引为1的hart;依次类推。结构体包含以下寄存器:

注意:若 hart 索引无效(如系统中不存在该核心),这些寄存器可能全为只读 0。

3.1.1 中断传递使能(idelivery)

  • 功能 :控制中断是否传递到目标 hart。
    • 0:禁用中断传递(hart 不会收到该域的中断)。
    • 1:启用传递(hart 会收到符合条件的中断)。
  • 无效 hart :若索引无效,设置idelivery=1也不会传递中断。

3.1.2 中断强制(iforce)

  • 功能 :测试时强制触发中断。
    • 1:当domaincfg.IE=1idelivery=1时,强制向相应的hart发送中断。
    • topi=0时,为hart生成伪中断(无实际中断源)。
  • 自动清零 :当读取寄存器claimi返回 0(伪中断)时,iforce自动清零。

3.1.3 中断优先级阈值(ithreshold)

  • 功能 :设置触发中断的最低优先级(数值越大优先级越低 )。
    • ithreshold = P(非零):仅优先级低于P 的中断会触发。
    • ithreshold = 0:所有启用的中断都会触发。
  • 位数 :支持IPRIOLEN位,优先级范围02^IPRIOLEN-1

3.1.4 top interrupt

  • 功能:只读寄存器,显示当前最高优先级且符合条件的中断。
  • 返回值格式
    • 位 25-16:中断源编号(minor identity)。
    • 位 7-0:中断优先级。
    • 其他位:0。
  • 返回 0 的情况
    • 无有效中断。
    • ithreshold非零且无符合条件的中断。

3.1.5 claimi

  • 功能:读取时清除对应中断的挂起位,并处理伪中断。
  • 规则
    • 若返回非零值:清除对应中断的挂起位。
    • 若返回 0:自动清零iforce,表示伪中断。

3.2 中断投递和处理

当配置中断域,以使APLIC直接向HART传送中断时(domaincfg的字段DM为零),APLIC在对应中断域的特权级别,为该域的所有HART提供外部中断信号,只要以下一个条件满足:

(a) hart没有IMSIC

(b) 相关IMSIC中断文件的eidelivery寄存器设置为0x40000000(spec第3.8.1节)。

对于M level,来自APLIC的中断信号在每个hart的mip CSR中显示为位MEIP(achine External Interrupt-Pending)。

对于S level,中断信号在每个hart的mip和sip CSR中显示为 SEIP 位(supervisor External Interrupt-Pending)。每个中断信号可以任意延迟从APLIC传输到对应的hart。

在APLIC,发送至hart的每个中断信号,均源自寄存器domaincfg的IE字段以及该域的内存映射控制区域中 hart IDC结构的当前状态。

如果domaincfg.IE = 0或通过idelivery寄存器禁用到hart的中断传送(idelivery = 0),则中断信号将保持无效状态。

当domaincfg.IE = 1并且中断投递被使能(idelivery = 1)时,只要寄存器iforce或topi不为零,中断信号就会被置位。

由于APLIC和hart之间的通信可能存在延迟,因此可能会发生外部中断陷阱被捕获(hart侧的MEIP或SEIP置位),但当实际发生对claimi寄存器的读取时,没有该hart中断enable和pending的情况。在这种情况下,claimi返回的中断标识为0,从而导致来自APLIC的表现为虚假中断。

便携式软件,必须做好应对 APLIC 上可能出现的虚假中断的准备,这种情况可以安全地被忽略,而且应该很少见。

出于测试目的,可以通过将IDC结构的iforce寄存器,设置为1来触发Hart的虚假中断。

仅用于通过APLIC,进行外部中断的陷阱处理程序,可大致编写如下:

4 MSI传递模式

在MSI投递模式(domaincfg.DM = 1)下,中断域通过MSI将中断转发到目标hart。

仅当中断源对应的pending位和enable位都为1,并且寄存器domaincfg的IE字段也为1时,才会为特定中断源发送MSI。如果发送MSI,则源的中断pending位将被清除。

相关推荐
西岸行者12 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意12 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码12 天前
嵌入式学习路线
学习
毛小茛13 天前
计算机系统概论——校验码
学习
babe小鑫13 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms13 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下13 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。13 天前
2026.2.25监控学习
学习
im_AMBER13 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J13 天前
从“Hello World“ 开始 C++
c语言·c++·学习