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

在Zynq(arm-v7/cortex-a9)中发送处理器间中断,arm,interrupt,cpu-registers,armv7,cortex-a,Arm,Interrupt,Cpu Registers,Armv7,Cortex A,我试图在ZedBoard的Zynq平台上添加对嵌入式操作系统(DNA-OS)的多处理器支持。 该操作系统实际上是完美的功能与CPU_0单独。操作系统体系结构需要实现cpu_send_ipi功能,以激活多处理支持:基本上,该功能会中断处理器,并为其提供一个新线程来处理 我在(Zynq技术参考手册)中查找了IPI寄存器,但没有找到 我试图在Cortex-A9规范中进一步挖掘IPI寄存器,发现软件生成的中断可以用作IPI 在向我的操作系统添加软件中断支持后,问题是CPU_0可以中断自身,但不能中断CP

我试图在ZedBoard的Zynq平台上添加对嵌入式操作系统(DNA-OS)的多处理器支持。 该操作系统实际上是完美的功能与CPU_0单独。操作系统体系结构需要实现cpu_send_ipi功能,以激活多处理支持:基本上,该功能会中断处理器,并为其提供一个新线程来处理

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

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

在向我的操作系统添加软件中断支持后,问题是CPU_0可以中断自身,但不能中断CPU_1! PS:为了让我的操作系统处理SGIs,我使用了第1486页ug585中的寄存器规范:

那么,是否有其他特殊配置允许CPU相互中断?或者其他实现IPI的方法


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

  • 在CPU2上配置GIC中断接口寄存器
  • 为CPU2设置CP15向量表
  • 在CPU2上启用CPSR I位
  • 可能会设置一些存储PPI分发服务器寄存器。注1
  • 注1:虽然大多数分发服务器寄存器都是系统全局的,但也有一些是按CPU存储的。例如,见第3.3.8节。Cortex-A9 MPcore TRM中的PPI状态寄存器。我没有从粗略的调查中看到任何证据,但我不排除这种可能性

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

    GIC参考列表
    • -需要注册,GICv1(忽略GICv2信息)
    • -第3章,具体信息
    • -没有详细说明,但我认为这是综合GIC。如果您使用更深奥的功能,可能值得一看

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

    请参见以下问题。不清楚第二个CPU是否正常工作?我想你在我的回答中是这样的。有一些指向不同Linux源代码的指针,您可以检查一下。我没有编写任何代码来启动这两个CPU。实际上,我编译了操作系统和应用程序,以获得~0.5MB elf文件;我使用bootgen从FSBL、我的ELF文件和我的比特流生成bin文件。我假设FSBL将我的比特流加载到FPGA中,将我的elf加载到内存中,然后将CPU_0的PC指向我的操作系统入口点。现在,在阅读了您的评论和答案之后,我之前不理解的一些代码部分是有意义的。我将尝试调整FSBL代码以在两个CPU上加载操作系统。OS kickstart模块中有一个控制测试,使CPU_0能够继续加载操作系统内核,同时阻止任何其他CPU等待中断。谢谢你的提示,一旦我做了这些更改,我会让你保持更新。我没有使用Zynq CPU的经验。Zync GIC可能不符合ARM文件,但我猜不太可能;他们必须对Cortex-A9 MPCore进行定制设计。