本文作者:Adam Taylor
为了能够创建更高级的事件驱动型 AMD Zynq UltraScale+ MPSoC 应用,我们需要先深入了解这些器件中更为复杂的要素。具体而言,我们需要了解中断在 Zynq MPSoC PS(处理器系统)内部的运作方式。可以预见,由于 Zynq MPSoC 拥有更多的处理器核,因此它的中断结构要比 Zynq SoC PS 略微复杂一些。
中断系统架构概览
AMD Zynq UltraScale+ MPSoC 的中断架构包含四个主要部分:
1. RPU 通用中断控制器 V1 (GIC) - 用于管理 RPU(实时处理单元)内的中断
2. APU 通用中断控制器 V2 (GIC) - 用于管理 APU(应用处理单元)内的中断,并支持虚拟化
3. 处理器间中断 (IPI) - 启用不同处理单元之间的中断
4. GIC 代理 - 用于汇总中断,并充当 PMU(性能监控单元)的 GIC
我们可以在最高层面上将这些中断分为若干组,分别提供给架构的各个部分:
共享外设中断 - 160 个中断源。可由 PS 内部的外设(例如 IOU 外设、PCIe 等)以及设计中的 PL(可编程逻辑)生成
私有外设中断 - 这些中断是特定处理器核的私有中断
软件生成的中断 - 此类中断由软件生成
共享外设中断也可以由 PL 生成,更多乐趣由此而来。在 Zynq MPSoC 自定义 GUI 的“PS-PL configuration”(PS-PL 配置)选项卡中可以启用 PS 与 PL 之间的任一方向的中断。
对于 RPU,为每个处理器核都提供了一个 IRQ 和一个 FIQ。要快速获取低时延响应,应使用 FIQ。对于典型的中断源,应使用 IRQ。
针对 MPSoC 上每个核启用 RPU IRQ 中断和 FIQ 中断
对于 APU,有两个选项可用于连接中断。第一个选项是使用传统 IRQ 中断和 FIQ 中断。APU 内的每个处理器核都有一个 IRQ 和一个 FIQ。在 Zynq MPSoC IP 块的顶层启用此选项后,即可得到两个 4 位端口:一个用于 IRQ,另一个用于 FIQ。同样,FIQ 输入可提供最低时延的中断响应。
针对 MPSoC 上每个核启用 APU IRQ 中断和 FIQ 中断
第二种中断方法是使用中断组。APU 的 GICv2 支持两个中断组:组 0 和组 1。组 0 内的中断可以分配给 IRQ 或 FIQ,而组 1 内的中断只能分配给 IRQ。这种分配是在 GICv2 内部完成的。在实现安全环境时,也可以使用这些中断组,其中组 0 用于安全中断,组 1 用于非安全中断。
针对 MPSoC 上每个核启用 APU IRQ 组
处理器间中断 (IPI) 可用于启用 APU、RPU 和 PMU 之间的中断。通过 IPI,APU、RPU 和 PMU 内的处理器可以相互中断。此外,IPI 还可以中断 Zynq MPSoC PL 内实现的一个或多个软核处理器。
SPI 中的 IPI 中断编号
除了提供中断外,IPI 还为每个通信方向提供了一个 32 字节的 IPI 有效载荷缓冲器,可用于受限的通信。IPI 提供了 8 个主接口:APU、RPU0、RPU1、PMU,以及 LPD 和 FPD S AXI 接口。可以通过在 MPSoC 重新自定义 GUI 中选择“Advanced”(高级)来更改这些主接口的默认分配。
中断结构的最后一个部分是“Proxy GIC”(代理 GIC),它用于汇总连接到 LPU GIC 的共享中断,并提供一系列中断状态寄存器供 PMU 使用。
现在我们对 Zynq UltraScale+ MPSoC 中断有了进一步的了解,接下来我们将探索如何在后续设计中应用这些中断。一如既往,代码可从 GitHub 上获取:
GitHub - ATaylorCEngFIET/MicroZed-Chronicles: Source code from the MicroZed Chronicles blog hosted by Xcell Daily Blog · GitHub
https://github.com/ATaylorCEngFIET/MicroZed-Chronicles