直到今天,我还在一个核上编程,现在我需要在多个核上运行我的代码。我研究了大约一个星期,并对此有一些疑问。
顺便说一下,我用的是Zynq 702,Arm DS-5和Dstream。当我使用我已经在Core0上运行的代码时,我正在尝试实现这个目标。
我真的没有在core1上做任何事情,只是连接到它,只想观察它跳到0xFFFFFFFF0和这个地址的值。我没有设置任何针对core1的中断处理程序。我唯一的“观察”情况可以吗?还是我真的需要设置一些配置?我怎样才能用最简单的方法实现这一点呢?
我连接到core1并观察它的状态,而我的程序在core0上继续运行。顺便说一下,没有在core1上运行的应用程序。它上升到地址0x300,在这个地址上有一个WFE命令和,就在它后面有一个B(ranch)命令,它再次分支到0x300 。这就像一个循环,我的代码在WFE命令上停留在0.5秒左右,跳到下一个指令B并再次分支到WFE .
我认为core1应该在执行WFE命令之后留在那里,除非我发送了一个事件,而不是执行B(ranch)命令,对吗?如果是这样的话,这是否意味着core1定期从某个地方接收evets?将板与Dstream调试器连接是否会导致事件?
如果我设置了地址0xFFFFFFFF0的值,是什么使core1跳转到0xFFFFFF0的地址,在core1处于WFE/WFI状态时,是一个简单的SEV命令吗?如果0xFFFF0的值为0x00000000,那么会发生什么?Core1是否会再次回到呼叫WFE/WFI?还是别的什么?
发布于 2014-12-17 08:47:19
如果core1处于WFE循环(状态),则core0上的SEV唤醒core1。如果进入WFE,进入备用状态,SEV是唤醒,来自SCU的请求也可以进行唤醒(用于MP系统中的缓存一致性操作)。
注意:在APU重置后,core1处于WFE状态,执行从0xFFFFE00到0xFFFFFF0的代码。
启动后,core1处于WFE状态。如果core1获得SEV,它会跳转到存储在0xFFFFFFF0的地址。如果在SEV之后更新目标地址,则core1返回到WFE状态。这是因为0xFFFFF0具有WFE指令的地址。
正确的“启动顺序”是:
(请看Zynq-7000全可编程SoC技术参考手册第158页(6.1.10) )
如果0xFFFFF0的值为0x00000000,您将得到不可预测的结果。(取决于cpu状态)。
发布于 2016-04-15 08:37:14
在我的例子(旋风V SoC)后,冷复位CPU1有“保持在复位”状态。为了从CPU1中启动CPU0,我向Reset_Handler添加了代码:
;System Manager addr is 0xFFD08000
LDR r0, =0xFFD080C4 ;cpu1startaddr
MOV r1, #0x02000000 ;start addr from linker script
STR r1, [r0]
;Reset Manager add is 0xFFD05000
LDR r0, =0xFFD05010 ;MPU Module Reset Register
MOV r1, #0
STR r1, [r0] ; write 0 to power_on cpu1https://stackoverflow.com/questions/26905258
复制相似问题