软复位后将CPU恢复为WFE模式(cortexa9)

时间:2018-03-27 07:41:11

标签: arm multicore zynq

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

根据zynq documentation

  

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

     

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

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

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才会强制执行将CPU置于其中的bootROM   0xFFFFFF00区域,因此是WFE。

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

我的问题是,如何在软件重置后将CPU1带回WFE?

如果有人能够解释我该怎么做,我将非常感激! 如果需要,请随时询问更多详情!
谢谢!

1 个答案:

答案 0 :(得分:2)

实际上,如果您看到ARM指令手册,则可以发现WFE实际上是一条指令。简而言之,在从core0进行软件复位之前,只需将WFE指令的操作码从core0和软复位内核1复制到0x0上即可。Core1将立即执行WFE指令并进入WFE状态。