Zynqmp 裸机核间通信

关键字:Xilinx  FPGA  、Zynq UltraScale+ MPSoC、核间通讯、裸机、AMP、zcu106开发板

  1. APU和APU

        无所谓CPU0 是裸机还是uco还是Linux,核间通讯的本质是软中断。什么是软中断?由软件触发的中断就叫软中断。由于我在实际项目中使用的CPU0、CPU1都是裸机,因此就以裸机为例子来说明核间通讯测试。

        Xilinx vivado SDK的各种例子是我的第一手资料。手上有FPGA工程师提供的HDF(您应该知道我说的是哪个文件)文件的,用这个HDF建一个SDK;手上没有HDF文件的,也不是什么难事,打开vivado2018.3,这是我用的版本,其他版本类似,以106开发板为模板创建一个工程,怎么选?看图:

Zynqmp 裸机核间通信

Zynqmp 裸机核间通信

Zynqmp 裸机核间通信

Zynqmp 裸机核间通信

Zynqmp 裸机核间通信

        以上步骤完成后,new一个block design,新加一个zynq的IP核。

Zynqmp 裸机核间通信

        双击这个IP,好像也没啥需要配置的,以开发板建立的工程有个好处就是,不需要对它做过多配置,我们直接生成文件,创建顶层文件,综合就完了。一会儿完事儿后,export hardware,就得到了HDF文件

Zynqmp 裸机核间通信

创建顶层文件

Zynqmp 裸机核间通信

综合

Zynqmp 裸机核间通信

导出HDF

Zynqmp 裸机核间通信

然后就运行SDK吧,也别单独自己建SDK了。

Zynqmp 裸机核间通信

        SDK启动后,新建两个工程,注意在建立工程的时候,a53-cpu0对应CPU核心0,a53-cpu1对应CPU核心1,别选错了

Zynqmp 裸机核间通信

下图演示了导入中断demo的过程

Zynqmp 裸机核间通信

        俩核的设置软中断的中断号是0xe,也就是14,CPU0中断CPU1用XSCUGIC_SPI_CPU1_MASK,   CPU1中断CPU0 用XSCUGIC_SPI_CPU0_MASK

        打开例子代码,在最上面可以看到核间通信的软中断号,这个中断号是四个a53 CPU共享的,任何一个核心通过这个中断号可以触发软中断,这个中断信号的接收者是其他三个核心,也包括它自己,到底是中断自己还是中断别的核心,看代码设置

Zynqmp 裸机核间通信

Zynqmp 裸机核间通信

        OK,上面是CPU0的中断demo,CPU1的中断demo和它一样,唯一不同就是软件触发中断的屏蔽码不一样

Zynqmp 裸机核间通信

        有这两个demo后就行了吗,别急,我们还需做两件事:

1.     在106板中,如果要APU和APU之间通过软中断通信,首先对两个核的程序设置DDR运行位置,分别修改SDK的连接脚本,CPU0: 0~0x3ff00000      CPU1: 0x40000000~0x7fffffff

Zynqmp 裸机核间通信

Zynqmp 裸机核间通信

        做这一步的目的是加载不同的ELF到不同的DDR位置,否则CPU1 的程序加载后把CPU0的程序给覆盖了,还怎么玩儿?

2.        调试运行的时候CPU0先加载,CPU1后加载,原有demo的代码是初始化完成后就开始出发软中断,CPU0不能这么干,因为CPU1 还没加载程序呢,谁响应这个中断?所以,应该是CPU0运行demo后等待CPU1的中断信号,说明CPU1已经ready,收到CPU1的中断后,再触发对CPU1的中断,这样就可以完成这个实验。

Zynqmp 裸机核间通信

Zynqmp 裸机核间通信

最后我们调试运行,先看一下调试配置选项

Zynqmp 裸机核间通信Zynqmp 裸机核间通信

点击运行