我正在使用zynq SoC。它包含2个CPU cortex-a9 我的目标是使用AMP(不对称多处理),能够将软复位从一个CPU应用到另一个CPU,然后在适当时重新启动CPU。
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?
如果有人能够解释我该怎么做,我将非常感激!
如果需要,请随时询问更多详情!
谢谢!
答案 0 :(得分:2)
实际上,如果您看到ARM指令手册,则可以发现WFE实际上是一条指令。简而言之,在从core0进行软件复位之前,只需将WFE指令的操作码从core0和软复位内核1复制到0x0上即可。Core1将立即执行WFE指令并进入WFE状态。