ZYNQ的AMP模式下,一种可以在线调试的重启CPU1的方法
问题背景
ZYNQ的AMP模式开发中,常常会需要对CPU1进行software Reset ,reset之后的引导是一个比较麻烦的问题。
按照官方手册的介绍,software Reset之后,CPU1会跳到0x00地址处执行。正常工作的情况下,0x00处加载的是FSBL的代码,由BSP中的boot.s来实现CPU ID的识别和代码跳转。当需要XSDK通过JTAG在线调试时,FSBL并不会加载,此时0x00处的代码未知,若对CPU1执行Reset,将无法正确实现跳转。
解决思路
按照XAPP1079的处理方式,在POR复位整个系统时,bootrom会使CPU1进入WFE状态,不断检查0xFFFFFFF0处的值是否为0,若不为0则跳转到该值指示的地址执行。所以此时只需向0xFFFFFFF0写入CPU1的代码起始地址并发送sev即可实现CPU1的重新引导。
遗憾的是,Software Reset会使CPU1直接从0x00处执行,并不会走bootrom进入WFE状态。所以思路是模仿bootrom的这一套流程,在Reset CPU1之前,通过用户代码向0x00等区域写入跳转代码,实现重启后进入WFE状态的功能。
具体办法
//重启CPU1之前执行,为进入WFE做准备
void CPU1_WfePre() {
//向0xFFFFFF00起始的地址写入WFE指令
Xil_Out32(0xFFFFFF00, 0xe3e0000f);
Xil_Out32(0xFFFFFF04, 0xe3a01000);
Xil_Out32(0xFFFFFF08, 0xe5801000);
Xil_Out32(0xFFFFFF0C,