【问题标题】:Send Inter-Processor Interrupts in Zynq (arm-v7 / cortex-a9)在 Zynq (arm-v7 / cortex-a9) 中发送处理器间中断
【发布时间】:2014-06-26 15:19:01
【问题描述】:

我正在尝试在 ZedBoard 的 Zynq 平台上为嵌入式操作系统 (DNA-OS) 添加多处理器支持。 该操作系统实际上与 CPU_0 单独完美运行。操作系统架构需要实现一个 cpu_send_ipi 函数来激活多处理支持:基本上,这个函数会中断一个处理器并给他一个新的线程来处理。

我在ug585(Zynq 技术参考手册)中查找了 IPI 寄存器,但没有找到。

我尝试在 Cortex-A9 规范中进一步挖掘 IPI 寄存器,发现软件生成的中断可以用作 IPI。

给我的操作系统添加软件中断支持后,问题是CPU_0可以自己中断,但不能中断CPU_1!

PS:为了让我的操作系统处理 SGI,我使用了第 1486 页中 ug585 中的寄存器规范:

那么有没有其他特殊的配置可以让 CPU 互相中断呢?或任何其他实现 IPI 的方式?

问候,

【问题讨论】:

  • 查看类似ARM bring up other CPU cores的问题。不清楚第二个 CPU 是否正常工作?我假设你在我的回答中做到了。
  • How to write a Linux SGI handler 有一些指向不同 Linux 源代码的指针,您可以查看它们。
  • 我没有放置任何代码来启动任何一个 CPU。我实际上编译了操作系统以及应用程序,以获得一个 ~0.5MB 的 elf 文件;我使用 bootgen 从 FSBL、我的 ELF 文件和我的比特流生成一个 bin 文件。我想 FSBL 将我的比特流加载到 FPGA 中,我的精灵加载到内存中,然后将 CPU_0 的 PC 指向我的操作系统入口点。现在,在阅读了您的 cmets 和您的答案之后,我之前不理解的一些代码部分变得有意义。我将尝试调整 FSBL 代码以在两个 CPU 上加载操作系统
  • 在 OS kickstart 模块中有一个控制测试,可以让 CPU_0 继续加载 OS 内核,同时阻止任何其他 CPU 等待中断。感谢您的提示,一旦我做出这些更改,我会及时通知您

标签: arm interrupt cpu-registers armv7 cortex-a


【解决方案1】:

您的参考文档是 GIC(全局中断控制器)的一种形式。 Cortex-A9 MP 内核包括一个集成的 GIC 控制器。每个 CPU 都包含一个中断接口。此外,还有一个系统范围的分销商。为了接收 IPI(也称为 SGI 或 软件生成中断),您需要启用 CPU 接口以接收第二个 CPU 上的 SGI 中断。这需要几个步骤,

  1. 在 CPU2 上配置 GIC 中断接口寄存器
  2. 为 CPU2 设置 CP15 向量表。
  3. 在 CPU2 上启用 CPSR I 位
  4. 可能设置了一些存储的 PPI 分发器寄存器。 注意1

注 1:虽然大多数分发器寄存器是系统全局的,但也有一些是按 CPU 存储的。例如,参见第 3.3.8 节。 Cortex-A9 MPcore TRM 中的 PPI 状态寄存器。我没有从粗略的调查中看到任何东西,但我不会排除它。

通过在 CPU1 上设置 GIC 分发器 GICD_ISPEND 寄存器来处理 CPU2 上的向量,以测试未使用的 SPI(共享外设中断)是否工作。这应该验证您是否涵盖了第 2 步和第 3 步。您可能还需要设置 type 以确保它们是 interrupts 而不是 FIQ;特别是如果您有安全支持。您需要使用 GICD_ITARGETSR 寄存器来包含 CPU2。

GIC 参考列表

在通用 GIC 手册的附录 B 中特别有用。出于某种原因,ARM 喜欢在他们发布的每个文档中不断更改寄存器名称。

【讨论】:

  • 我没有使用 Zynq CPU 的经验。 Zync GIC 可能不符合 ARM 文档,但我猜这不太可能;他们必须对 Cortex-A9 MPCore 进行定制设计。
猜你喜欢
  • 2013-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多