中断如何在多核ARM cpu上工作

中断如何在多核ARM cpu上工作,arm,multicore,interrupt,Arm,Multicore,Interrupt,这个问题对于x86已经有了答案,但是我找不到很多关于ARM MP CPU的信息,比如Cortex-A9、Cortex-A15等等 更重要的是,我想知道在没有任何配置的情况下,是否可以在非主cpu上引发中断 我正在开发一个只处理主cpu的软件,因此我将其余部分置于WFI状态,但我不知道中断如何在MP arm cpu上工作,是否可能主cpu继续执行代码,而其中一个辅助cpu拾取代码并跳转到向量表中的指令并执行该代码 顺便说一句,这是我用来将它们设置为低功耗模式的代码 uint32_t reg

这个问题对于x86已经有了答案,但是我找不到很多关于ARM MP CPU的信息,比如Cortex-A9、Cortex-A15等等

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

我正在开发一个只处理主cpu的软件,因此我将其余部分置于WFI状态,但我不知道中断如何在MP arm 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
uint32\u t reg;
__asm_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;
reg&=0xF;
如果(注册>0)
转到旋转;

旋转:
对于(;;)
cpu_idle();//cpu_空闲->wfi

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

中断控制器体系结构的描述(相当详细)见

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

  • 启用GIC分配器(一次,用于整个系统)
  • 启用GIC CPU接口(每个核心)
  • 启用要接收的IPI(针对每个核心)
  • 设置要接收的每个IPI的优先级(每个核心)
  • 确保CPU接口中断优先级掩码寄存器(对于每个核心)设置为比您上面设置的中断优先级低(高)的优先级
  • 清除CPSR I位(每个磁芯)

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

您看过mpcore的ARM和TRM了吗?是的,它确实提到了一些关于GIC和IPI如何工作的内容,但没有提到一般中断是如何安排的。至于将中断分配给非主核,中断处理器目标寄存器指定哪些内核接收每个共享外围中断。因此,除非我明确清除辅助内核CPSR中的i位,否则中断将被屏蔽,WFI应将它们永远保持在低功耗模式,对吗?WFE也会在中断时唤醒内核吗?所以,如果一个软件在我自己的靴子之后,它能从WFI唤醒那些核心吗?因此,我考虑使用WFE,但在单处理器上,如果我们在WFE中,我们没有任何其他内核发送信号,所以只想确定中断是否从WFE唤醒内核。I位的作用是防止中断(切换模式/跳到向量)。设置I位后,内核仍将脱离低功耗状态,但它将在程序中WFI之后继续执行指令。是的,中断也会唤醒WFE中的内核。但是如果你想使用SEV/WFE作为IPIs的替代品,你需要考虑非保证传递的事实。嗯,那么你是说如果中断在二级核上被禁用,并且它们在WFI中,他们有可能离开那个状态吗?如何实现?如果GIC中启用了中断,但CPSR中屏蔽了中断,则发出信号的中断仍然是“唤醒事件”——对于WFI和WFE而言。