我正在尝试在ZedBoard的Zynq平台上为嵌入式操作系统(DNA-OS)添加多处理器支持。 操作系统实际上完美无缺,单独使用CPU_0 。操作系统体系结构需要实现 cpu_send_ipi 函数才能激活多处理支持:基本上,此函数会中断处理器并为其提供一个新线程来处理。
我在ug585(Zynq技术参考手册)中寻找了一个IPI注册,但找不到。
我尝试在Cortex-A9规范中进一步挖掘IPI寄存器,并发现软件生成的中断可以用作IPI。
PS:我的操作系统处理SGI,我使用了第1486页的ug585的寄存器规范: SGI Control register http://i57.tinypic.com/4huy5j.jpg
那么是否还有其他特殊配置允许CPU中断对方?或任何其他方式实施IPI?
此致
答案 0 :(得分:4)
您的参考文档是GIC(全局中断控制器)的一种形式。 Cortex-A9 MP内核包括一个集成的GIC控制器。每个CPU都包含中断接口。此外,还有一个系统范围的分销商。要接收IPI(也称为SGI或软件生成中断),需要启用CPU接口以接收第二个CPU上的SGI中断。这需要几个步骤,
注1:虽然大多数分配器寄存器都是系统全局的,但有些寄存器也是按CPU分配的。例如,见3.3.8节。 PPI状态寄存器在Cortex-A9 MPcore TRM中。我没有看到任何粗略的调查,但我不会排除它。
通过在CPU1上设置GIC分配器 GICD_ISPEND 寄存器来处理CPU2上的向量,从而测试未使用的SPI(共享外设中断)是否正常工作。这应验证您是否涵盖了第2步和第3步。您可能还需要设置类型以确保它们是中断而不是 FIQ ;特别是如果你有安全支持。您需要使用 GICD_ITARGETSR 寄存器来包含CPU2。
在Generic GIC手册的附录B 中特别有用。出于某种原因,ARM喜欢不断更改他们发布的每个文档中的寄存器名称。