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

sgu*_*pta 5 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
Run Code Online (Sandbox Code Playgroud)

uni*_*urf 10

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

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并继续执行.这通常是您想要的系统启动操作.