zynq芯片如何实现cpu0动态加载cpu1程序

通过jtag加载cpu0运行程序,在cpu0程序中将cpu1运行的程序加载到ddr中,然后唤醒cpu1程序,目前问题是已经将cpu1程序写到ddr中,调用唤醒指令后,无法唤醒cpu1程序。
网上查到一些资料,这种方式需要reset cpu1,然后再置cpu1为wfe状态,再去唤醒,可是依然无法实现,求专家帮助

参考链接,希望有帮助

zynq双核,上电后如果不经过配置,代码都是CPU0上执行,并且CPU1同时执行一个等待的命令。如果要在两个核上运行代码,需要人为进行配置。很简单,只要在cpu0中的main函数中执行下面的startcpu1函数。

#define CPU1STARTADR 0xFFFFFFF0
#define CPU1STARTMEM 0x2000000
#define sev() asm(“sev”)
void StartCpu1(void)
{
Xil_Out32(CPU1STARTADR, CPU1STARTMEM);
dmb(); //waits until write has finished
sev();
}

上面的代码中CPU1STARTADR表示的是cpu1的开始地址,这个是固定的,由厂家决定的。 然后CPU1STARTMEM表示的是CPU1程序开始的地址(一般是用户分配给CPU1的DDR内存的基地址的),CPU1STARTMEM是可以根据ddr的地址,看情况给的,也就是由用户设置的,可以改变的。

```c
Xil_Out32(CPU1STARTADR, CPU1STARTMEM);

```   

这个代码表示把CPU1STARTMEM写入地址CPU1STARTADR中去。这样做的目的是:cpu1被唤醒以后,会读取CPU1STARTADR中的值,也就是CPU1STARTMEM,然后跳转到CPU1STARTMEM这个内存地址上去运行应用程序。(提示:Xil_Out32()这个函数被定义在xil_io.h,作用就是把32位的值写入到对应的地址上去。与其对应的还有Xil_In32(),表示从指定的地址读取32的值)。sev()就是唤醒CPU1的指令。

ZYNQ7020--动态加载CPU1程序<1> 详情
https://blog.csdn.net/mengqingbin5219/article/details/126480517

不知道这个对你有没有帮助
参照他人写的成功唤醒cpu1程序实例

#define CPU1STARTADR 0xFFFFFFF0
#define CPU1STARTMEM 0x2000000
#define sev() asm(“sev”)
void StartCpu1(void)
{
    Xil_Out32(CPU1STARTADR, CPU1STARTMEM);
    dmb(); //waits until write has finished
    sev();
}
代码说明:上面的代码中CPU1STARTADR表示的是cpu1的开始地址,这个是固定的,由厂家决定的。
    然后CPU1STARTMEM表示的是CPU1程序开始的地址(一般是用户分配给CPU1的DDR内存的基地址的),CPU1STARTMEM是可以根据ddr的地址,看情况给的,也就是由用户设置的,可以改变的。
    Xil_Out32(CPU1STARTADR, CPU1STARTMEM);这个代码表示把CPU1STARTMEM写入地址CPU1STARTADR中去。这样做的目的是:cpu1被唤醒以后,会读取CPU1STARTADR中的值,也就是CPU1STARTMEM,然后跳转到CPU1STARTMEM这个内存地址上去运行应用程序。(提示:Xil_Out32()这个函数被定义在xil_io.h,作用就是把32位的值写入到对应的地址上去。与其对应的还有Xil_In32(),表示从指定的地址读取32的值)。
    sev()就是唤醒CPU1的指令。

参考下面链接,希望有帮助
https://b23.tv/8bfZTif