修改时间 02-22-2021 08:49 PM
看了很多复位CPU1的帖子,基本都是以下代码:
/* Assert and deassert cpu1 reset and clkstop using above sequence*/
RegVal = Xil_In32(A9_CPU_RST_CTRL);
RegVal |= A9_RST1_MASK;
Xil_Out32(A9_CPU_RST_CTRL, RegVal);
RegVal |= A9_CLKSTOP1_MASK;
Xil_Out32(A9_CPU_RST_CTRL, RegVal);
RegVal &= ~A9_RST1_MASK;
Xil_Out32(A9_CPU_RST_CTRL, RegVal);
RegVal &= ~A9_CLKSTOP1_MASK;
Xil_Out32(A9_CPU_RST_CTRL, RegVal);
/* lock the slcr register access */
Xil_Out32(XSLCR_LOCK_ADDR, XSLCR_LOCK_CODE);
运用了这段代码后,然而并没有达到理想效果,理想效果可以举个例子:应该是在JTAG调试后,
int main()
{
/*在没有复位CPU1前,即没用上面那段代码前*/
这时CPU0翻转LED1;CPU2翻转LED2,并打印hello world。
/*当运用上面那段代码后*/
这时理想效果是CPU0没受影响,一直亮着LED1;CPU1应该重新翻转LED2,并再次打印hello world。
}
问题来了,它并没有达到理想效果,CPU1会卡住了,即停止翻转LED2,且没有打印信息。
在上面那段代码设置断点后它会出现下图所示情况,
可以看到它虽然似乎已经复位了,但是却达不到我说的理想效果,所以我的想法是
希望复位后它进入WFE状态,再通过sev唤醒它,但是我不知道如何在JTAG在线调试下使CPU1进入WFE状态,或者说我的这一系列操作有问题,
请各位坛友指教!
修改时间 02-23-2021 04:28 PM
根据UG585 v1.12.2 table 3-9 里的描述,cpu1复位后处于下面状态。
Kept in a WFE state while executing code located at address 0xFFFFFE00 to 0xFFFFFFF0
0xFFFFFE00 to 0xFFFFFFF0这段代码是循环代码,如果你还想cpu1再次进入WFE状态,就不要破坏掉这段代码。另外cpu1复位后再次启动需要重新执行L1cache和MMU table的初始化,即cpu1 app elf刚开始的那段代码。
修改时间 02-23-2021 05:18 PM
“cpu1 app elf刚开始的那段代码”就是cpu1 app elf在sdk里打开后看到的代码。UG585里关于cpu software reset后的状态描述可能不太确切。参考下面这个article。
https://www.xilinx.com/support/answers/53828.html
如果OCM的地址译码被fsbl变化了,可以参考这个帖子里的方法。