在Zynq中发送处理器间中断(arm-v7 / cortex-a9)

时间:2014-06-26 15:19:01

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

我正在尝试在ZedBoard的Zynq平台上为嵌入式操作系统(DNA-OS)添加多处理器支持。 操作系统实际上完美无缺,单独使用CPU_0 。操作系统体系结构需要实现 cpu_send_ipi 函数才能激活多处理支持:基本上,此函数会中断处理器并为其提供一个新线程来处理。

我在ug585(Zynq技术参考手册)中寻找了一个IPI注册,但找不到。

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

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

PS:我的操作系统处理SGI,我使用了第1486页的ug585的寄存器规范: SGI Control register http://i57.tinypic.com/4huy5j.jpg

那么是否还有其他特殊配置允许CPU中断对方?或任何其他方式实施IPI?

此致

1 个答案:

答案 0 :(得分:4)

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

  1. 在CPU2上配置GIC 中断接口寄存器
  2. 为CPU2设置CP15矢量表。
  3. 在CPU2上启用CPSR I-bit
  4. 可能设置一些银行PPI分销商登记册。 备注1
  5. 注1:虽然大多数分配器寄存器都是系统全局的,但有些寄存器也是按CPU分配的。例如,见3.3.8节。 PPI状态寄存器在Cortex-A9 MPcore TRM中。我没有看到任何粗略的调查,但我不会排除它。

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

    GIC参考列表

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