6

这个问题已经在 x86 上得到了回答,但是我找不到很多关于 ARM MP cpu 的信息,比如 Cortex-A9、Cortex-A15 等......

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

我正在开发一个只处理主 cpu 的软件,因此我将其余部分置于 WFI 状态,但是我不知道中断如何在 MP arm cpu 上工作,主 cpu 是否有可能继续执行代码和一个辅助 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
4

1 回答 1

10

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

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ihi0048b/index.html中描述了中断控制器架构(非常详细)

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

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

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

于 2012-08-05T12:10:15.327 回答