中断如何在多核ARM cpu上运行

时间:2012-08-04 19:06:30

标签: arm multicore interrupt

这个问题已经回答了x86但是,我找不到很多关于ARM MP cpus如Cortex-A9,Cortex-A15等......

更重要的是,我想知道在没有任何配置等情况下是否可以在非主cpu上引发中断。

我正在开发一个只处理主CPU的软件,因此我将其余部分放在WFI状态但是我不知道中断如何在MP arm cpus上工作,主cpu是否可能继续执行代码和一个辅助cpu的选择并跳转到向量表中的指令并执行该代码?

顺便说一下,这是我用来将它们置于低功耗模式的代码

    uint32_t reg;

    __asm__ volatile("mrc p15, 0, %0, c0, c0, 5" : "=r" (reg));
    reg &= 0xF;

    if(reg > 0)
        goto spin;

<code snipped>

spin:
    for(;;)
        cpu_idle(); // cpu_idle -> wfi

1 个答案:

答案 0 :(得分:9)

简短且实用的目的正确答案是,如果没有在辅助核心上执行某些配置,您所要求的是不可能的......

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ihi0048b/index.html

中(非常详细地)描述了中断控制器架构

要准备辅助核心以接收IPI,您需要:

  • 启用GIC分配器(一次,对整个系统而言)
  • 启用GIC CPU接口(针对每个核心)
  • 启用您希望接收的IPI(针对每个核心)
  • 设置您希望接收的每个IPI的优先级(针对每个核心)
  • 确保CPU接口中断优先级屏蔽寄存器(对于每个内核)设置为比上面设置的中断优先级更低(更高的数字)。
  • 清除CPSR I-bit(针对每个核心)

如果您不打算实现中断处理程序,请跳过清除I位。核心将来自WFI并继续执行。这通常是您想要的系统启动操作。