这个问题已经针对 x86 得到了解答,但是,我找不到太多关于 ARM MP cpu(如 Cortex-A9、Cortex-A15 等)的信息...
更重要的是我想知道是否可以在非主CPU上引发中断而无需任何配置等。
我正在开发一款仅处理主 cpu 的软件,因此我将其余部分置于 WFI 状态,但是我不知道中断如何在 MP 臂 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
简短且出于实用目的的正确答案是,如果不在辅助核心上执行某些配置,您所要求的就是不可能的......
中断控制器架构(非常详细)描述于http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ihi0048b/index.html 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 中出来并继续执行。这通常是您想要的系统引导操作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)