登录后台

页面导航

注:RISC-V 标准定义了对中断类级别(即每个权限级别的定时器、软件和外部中断)的矢量中断支持,但不支持单个外部中断源的粒度(如本节所述)。这两种机制相互独立,应同时使用以获得最低的中断延迟。有关标准 RISC-V 矢量中断支持的更多信息,请参见 [2] 中的第 3.1.7 节。

SweRV EH2 PIC 实现支持矢量外部中断。meihap 寄存器的内容是一个完整的 32 位指针,指向需要服务的外部中断源处理程序的特定向量。该指针由外部中断向量表的 22 位基地址(base)、8 位请求 ID(claimid)和 2 位 "0 "字段组成。通过对 claimid 字段进行 2 位 0 的调整,可以构建出包含 32 位向量的向量表的偏移量。外部中断向量表位于 DCCM、SoC 内存或内核中的专用触发器阵列中。

描述了从接收外部中断到开始执行中断源特定处理程序的步骤。当内核发生外部中断时,启动的外部中断处理程序会执行以下操作:

  1. 将该处理程序中使用的寄存器保存在堆栈中
  2. 将捕获一致的请求 ID/优先级保存到 meicpct 控制/状态寄存器中
  3. 将 meihap 控制/状态寄存器加载到 regX 中
  4. 将 regX 中地址的内存位置加载到 regY 中
  5. 跳转到 regY 中的地址(即开始执行特定于中断源的处理程序)

注:以上显示的两个寄存器(regX 和 regY)仅供参考。可以使用相同的寄存器。

注意:在执行 mret 指令之前,中断源特定处理程序必须恢复上述步骤 1 中保存的寄存器。

在某些情况下,从 meihap 寄存器读取的捕获请求 ID 可能为 0(即没有中断请求等待处理)。为尽量减少中断延时,上述外部中断处理程序不应检查这种情况。相反,外部中断向量表基址处存储的指针(即指针 0)必须指向 "无中断 "处理程序,如上图 7-5 所示。该处理程序可以像执行中断返回(即 mret)指令一样简单。

请注意,多个中断源可以共享同一个中断处理程序,方法是在各自的中断向量表项中填入指向该处理程序的相同指针。

SweRV EH2 通过硬件中断重定向提供快速中断处理功能。快速中断重定向功能通过内核的构建参数进行配置。

如果该功能被实例化,一旦至少有一个合格的外部中断待处理且外部中断已启用(即 mie 寄存器中的 meie 位和 mstatus 寄存器中的 mie 位被设置),硬件就会自动捕获一致的请求 ID/优先级对。按照图 7-5 所示的概念流程,硬件利用 meihap 寄存器的内容,通过停止解码并在 LSU 流水线中创建一个气泡,来查找相应中断服务例程 (ISR) 的起始地址。该气泡允许内核访问 DCCM 中的外部中断向量表,以获取特定中断源 ISR 的起始地址。一旦知道 ISR 的起始地址,硬件就会创建中断刷新并直接重定向到相应的 ISR。

如果 ISR 的启动地址的硬件查找因故失败,则会发生不可屏蔽中断(NMI,参见第 2.17 节)。mcause 寄存器会报告查找失败的原因(参见表 12-3),以便固件确定发生了哪种错误情况。与快速中断重定向相关的 NMI 故障模式有

  • 访问时出现双位无法纠正的 ECC 错误 (mcause 值:0xF000_1000)
  • 访问不完全包含在 DCCM 中,但在 DCCM 区域内 (mcause 值:0xF000_1001)
  • 访问非 DCCM 区域 (mcause 值:0xF000_1002)

注意:快速中断重定向机制独立于标准 RISC-V 直接中断和向量中断模式。但是,启用快速中断重定向后,外部中断将绕过标准 RISC-V 中断机制。所有其他中断仍遵循标准流程。

注意:快速中断重定向功能与下文第 7.7 节描述的中断链概念不兼容。如果实例化了快速中断重定向机制,则不存在用于捕获最新中断评估结果的 meicpct 寄存器(参见第 7.12.9 节),因为捕获请求 ID/优先级对是由硬件而非固件启动的。

相关操作

  1. 外部中断源 S 通过激活相应的 exintsrc_req[S]信号,向其网关发出中断请求信号。
  2. 网关将中断请求从异步中断源的时钟域同步到 PIC 内核时钟域 (pic_clk)。
  3. 对于边缘触发中断,网关还会通过设置其内部中断待定 (IP) 位,将请求转换为电平触发中断信号
  4. 然后,网关通过发出中断请求信号,向 PIC 内核发出电平触发请求信号。
  5. 在交替阶段,评估针对 hart0(第 0 阶段)和 hart1(第 1 阶段)的待处理中断。
  6. 固件可通过读取 meitpX 或 meipX 寄存器中相应的 intpend 位来查看待处理中断。(所有待处理中断都在 meipX 寄存器中报告,而只有本线程的待处理中断在 meitpX 寄存器中报告)。
  7. 对于待处理中断,源的中断优先级(由 meiplS 寄存器的优先级字段表示)将被转发给相关阶段的评估逻辑(由 meidelS 寄存器的 del 字段选择)。
  8. 如果相应的中断使能(即 meieS 寄存器的 inten 位)被设置,待处理中断的优先级将被发送到第一级 2 输入比较器的输入端。
  9. 对一对中断源的优先级进行比较
    1. 如果两个优先级不同,则将优先级较高的中断源及其相关硬连线中断源 ID 转发至二级比较器。
    2. 如果两个优先级相同,则优先级和较低的硬连接中断源 ID 将被转发到二级比较器。
  10. 随后的每一级比较器都对上一级两个比较器输出的优先级进行比较:
    1. 如果两个优先级不同,则优先级较高者及其相关的中断源 ID 将转发给下一级比较器
    2. 如果两个优先级相同,则优先级和较低的中断源 ID 将转发给下一级比较器。
  11. 末级比较器的输出显示当前所有待处理和已启用中断中针对该线程的最高优先级(最大优先级)和最低中断源 ID(中断 ID)。
  12. 最高优先级与该线程的两个优先级阈值(即 meipt 寄存器的 prithresh 字段和 meicurpl 寄存器的 currpri 字段)中的较高者进行比较:
    1. 如果最大优先级高于该线程的两个优先级阈值,则会断言相应的 mexintirq[0/1] 信号
    2. 如果最大优先级与该线程的两个优先级阈值相同或更低,则相应的 mexintirq[0/1] 信号将被去断。
  13. 然后,mexintirq[0/1] 信号的状态会反映在 RISC-V hart 的 mip 寄存器中线程专用的 meip 位上。
  14. 此外,最大优先级与唤醒优先级相比较:
    1. 如果最大优先级为 15(或优先级顺序颠倒时为 0),则相应的唤醒通知 (WUN0/1) 位被设置。
    2. 如果最大优先级低于 15(或优先级顺序颠倒时为 0),则不设置相应的唤醒通知 (WUN0/1) 位。
  15. 通过 mhwakeup[0/1] 信号向目标机显示 WUN0/1 状态
  16. 当目标硬件接收到外部中断时,它会禁用所有中断(即清除 RISC- V 硬件 mstatus 寄存器的 mie 位),并跳转到外部中断处理程序。
  17. 外部中断处理程序写入 meicpct 寄存器,触发捕获当前最高优先级待处理外部中断的中断源 ID(在 meihap 寄存器中)及其相应的优先级(在 meicidpl 寄存器中)。请注意,meihap 寄存器 claimid 字段的捕获内容及其在 meicidpl 寄存器中的相应优先级既不受优先级阈值(meipt 的 prithresh 字段和 meicurpl 寄存器的 currpri 字段)的影响,也不受内核外部中断使能位(RISC-V hart 的 mie 寄存器的 meie 位)的影响。
  18. 然后,处理程序读取 meihap 寄存器,以获得 claimid 字段中提供的中断源 ID。 根据 meihap 寄存器的内容,外部中断处理程序跳转到该外部中断源的特定处理程序。
  19. 源专用中断处理程序为外部中断提供服务,然后:
    1. 对于电平触发的中断源,中断处理程序会清除启动中断请求的 SoC IP 中的状态。
    2. 对于边缘触发的中断源,中断处理程序通过写入 meigwclrS 寄存器,清除中断源网关中的 IP 位。
  20. 清零后,PIC 内核将取消中断源的中断请求,并停止该外部中断源参与最高优先级评估。
  21. 在后台,PIC 内核持续评估下一个具有最高优先级和最低中断源 ID 的挂起中断:
    1. 如果有其他针对该线程的中断挂起、启用,且优先级高于 meipt 寄存器的 prithresh 字段和 meicurpl 寄存器的 currpri 字段,则相应的 mexintirq[0/1] 保持断言。
    2. 如果没有其他针对该线程的中断挂起、启用,且优先级高于 meipt 寄存器的 prithresh 字段和 meicurpl 寄存器的 currpri 字段,则断言相应的 mexintirq[0/1]。
  22. 固件可通过写入 meicpct 寄存器来更新 meihap 和 meicidpl 寄存器的内容,从而触发新的捕获操作。
博主已关闭本页面的评论功能