Arm 软复位(cortexa9)后,使CPU回到WFE模式

Arm 软复位(cortexa9)后,使CPU回到WFE模式,arm,multicore,zynq,Arm,Multicore,Zynq,我和zynq SoC合作。它包含2个CPU cortex-a9。 我的目标是使用AMP(不对称多处理),能够将软复位从一个CPU应用到另一个CPU,然后在合适的时候重新启动CPU 根据报告: CPU0负责启动CPU 1上的代码执行。BootROM 将CPU 1置于等待事件模式。未启用任何功能,并且 只有少数通用寄存器被修改以将其置于 它在WFE指令处等待的状态。有一个小房间 CPU 0在CPU 1上启动应用程序所需的协议量。 当CPU 1接收到系统事件时,它立即读取内容 并跳转到该地址。如果发出

我和zynq SoC合作。它包含2个CPU cortex-a9。
我的目标是使用AMP(不对称多处理),能够将软复位从一个CPU应用到另一个CPU,然后在合适的时候重新启动CPU

根据报告:

CPU0负责启动CPU 1上的代码执行。BootROM 将CPU 1置于等待事件模式。未启用任何功能,并且 只有少数通用寄存器被修改以将其置于 它在WFE指令处等待的状态。有一个小房间 CPU 0在CPU 1上启动应用程序所需的协议量。 当CPU 1接收到系统事件时,它立即读取内容 并跳转到该地址。如果发出SEV 在更新目标地址位置(0xFFFFF0)之前,CPU 1 在WFE状态下继续,因为0xFFFFF0具有 作为安全网的WFE说明。如果写入的软件 地址0xFFFFF0无效或指向未初始化的内存, 结果是不可预测的

CPU 0在CPU 1上启动应用程序的步骤如下:
1.将CPU 1的应用程序地址写入0xFFFFF0。
2.执行SEV指令,使CPU 1唤醒并跳转到应用程序。
地址范围0xFFFFFE00到0xFFFFF0是保留的,在第1阶段或更高阶段之前不可使用 应用程序功能齐全。在此之前,是否可以进入这些区域 第二个CPU的成功启动会导致不可预测的错误 结果

到目前为止,当系统从bootRom引导时,我能够从CPU0启动CPU1。 我将CPU1应用程序地址写入0xFFFFF0,然后发送一个事件

void startCPU1()
{
    Xil_Out32(0xFFFFFFF0, 0x02000000);  // write CPU1 application address 
    dmb(); // waits until write has finished
    sev(); // send the SEV to wake up CPU1
}
这很有效

然后,按下一个按钮调用一个函数,将软复位从CPU0应用到CPU1。 我可以观察到CPU1停止(CPU1对应的led停止)

现在我们进入我不完全理解的部分

根据ARM文档:

当发出“CPU 1软件复位控制”时,CPU 1将跳转到 地址0x0

只有SRST将强制执行引导ROM,从而将CPU置于 0xFFFF00区域,并因此连接到WFE

因此,软件复位后,CPU1转到地址0x00000000。我想,根据这个地址上的内容,我可能会有不可预测的结果。 如果尝试从CPU0重新启动CPU1,则不会发生任何情况,因为CPU1未处于WFE模式

我的问题是,在软件重置后,如何在WFE中恢复CPU1

如果有人能向我解释如何做到这一点,我将不胜感激
如果需要,请随时询问更多细节

谢谢大家!

实际上,如果您看到ARM说明手册,您会发现WFE实际上是一种说明。简单地说,在从core0进行软件重置之前,只需从core0和软重置CORE1复制0x0上WFE指令的操作码。Core1将立即执行WFE指令并进入WFE状态