在Zynq上使用多核

时间:2014-11-13 09:22:09

标签: arm multicore zynq

直到今天我才在单核上进行编程,现在我需要在多核上运行我的代码。 我正在研究大约一周,并对此有一些疑问。

我正在使用Zynq 702,Arm DS-5和Dstream。我正在尝试使用我在Core0上运行的现有代码时实现此目的。


我在core1上什么都没做,只是连接到它,只是想观察它跳转到0xFFFFFFF0和这个地址的值。我没有设置任何针对core1的中断处理程序。我唯一的“观察”情况可以吗?或者我真的需要设置一些配置?我怎样才能以最简单的方式实现这一目标?


我连接到core1并观察其状态,而我的程序继续在core0上。顺便说一句,core1上没有应用程序运行..它上升到地址0x300,在这个地址有一个WFE命令就在它之后有一个B(牧场)命令再次分支到0x300 。这就像一个循环,我的代码在WFE命令上保持大约0.5秒,跳转到下一条指令B并再次分支到WFE ......

我认为在执行WFE命令之后,core1应该保持在那里,除非我发送一个EVENT,而不是执行下面的B(牧场)命令吧?如果是这样,是否意味着core1会从某个地方定期获得evets? 将电路板与Dstream Debugger连接会导致EVENT吗?


如果我设置地址0xFFFFFFF0的值,是什么让core1跳转到0xFFFFFFF0的地址,当core1处于WFE / WFI状态时,是一个简单的SEV命令吗? 如果0xFFFFFFF0的值为0x00000000,那么会发生什么? Core1会再次回到WFE / WFI吗?或其他什么?

2 个答案:

答案 0 :(得分:7)

如果core1处于WFE循环(状态),则core0上的SEV cmd唤醒core1。如果输入WFE,则进入待机模式并且SEV是一个唤醒模式,SCU的请求也可以进行唤醒(对于MP系统中的缓存一致性操作)。

请注意: APU复位后,core1处于WFE状态,执行代码从0xFFFFFE00到0xFFFFFFF0

启动后,core1处于WFE状态。如果core1获得SEV,它将跳转到存储在0xFFFFFFF0的地址。如果在SEV之后更新目标地址,则core1将返回WFE状态。这是因为0xFFFFFFF0具有WFE指令的地址。

正确的“启动顺序”是:

  1. 将core1应用程序的地址写入0xFFFFFFF0
  2. 执行SEV指令
  3. (请参阅Zynq-7000 All Programmable SoC技术参考手册中的第158页(6.1.10))

    如果0xFFFFFFF0的值为0x00000000,您将得到不可预测的结果。 (取决于你的cpu状态)。

答案 1 :(得分:0)

在我的情况下(Cyclone V SoC)冷复位之后CPU1有'#34;保持复位"州。 为了从CPU0启动CPU1,我将代码添加到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 cpu1