Zynqmp 裸机核间通信
关键字:Xilinx FPGA 、Zynq UltraScale+ MPSoC、核间通讯、裸机、AMP、zcu106开发板
- APU和APU
无所谓CPU0 是裸机还是uco还是Linux,核间通讯的本质是软中断。什么是软中断?由软件触发的中断就叫软中断。由于我在实际项目中使用的CPU0、CPU1都是裸机,因此就以裸机为例子来说明核间通讯测试。
Xilinx vivado SDK的各种例子是我的第一手资料。手上有FPGA工程师提供的HDF(您应该知道我说的是哪个文件)文件的,用这个HDF建一个SDK;手上没有HDF文件的,也不是什么难事,打开vivado2018.3,这是我用的版本,其他版本类似,以106开发板为模板创建一个工程,怎么选?看图:
以上步骤完成后,new一个block design,新加一个zynq的IP核。
双击这个IP,好像也没啥需要配置的,以开发板建立的工程有个好处就是,不需要对它做过多配置,我们直接生成文件,创建顶层文件,综合就完了。一会儿完事儿后,export hardware,就得到了HDF文件
创建顶层文件
综合
导出HDF
然后就运行SDK吧,也别单独自己建SDK了。
SDK启动后,新建两个工程,注意在建立工程的时候,a53-cpu0对应CPU核心0,a53-cpu1对应CPU核心1,别选错了
下图演示了导入中断demo的过程
俩核的设置软中断的中断号是0xe,也就是14,CPU0中断CPU1用XSCUGIC_SPI_CPU1_MASK, CPU1中断CPU0 用XSCUGIC_SPI_CPU0_MASK
打开例子代码,在最上面可以看到核间通信的软中断号,这个中断号是四个a53 CPU共享的,任何一个核心通过这个中断号可以触发软中断,这个中断信号的接收者是其他三个核心,也包括它自己,到底是中断自己还是中断别的核心,看代码设置
OK,上面是CPU0的中断demo,CPU1的中断demo和它一样,唯一不同就是软件触发中断的屏蔽码不一样
有这两个demo后就行了吗,别急,我们还需做两件事:
1. 在106板中,如果要APU和APU之间通过软中断通信,首先对两个核的程序设置DDR运行位置,分别修改SDK的连接脚本,CPU0: 0~0x3ff00000 CPU1: 0x40000000~0x7fffffff
做这一步的目的是加载不同的ELF到不同的DDR位置,否则CPU1 的程序加载后把CPU0的程序给覆盖了,还怎么玩儿?
2. 调试运行的时候CPU0先加载,CPU1后加载,原有demo的代码是初始化完成后就开始出发软中断,CPU0不能这么干,因为CPU1 还没加载程序呢,谁响应这个中断?所以,应该是CPU0运行demo后等待CPU1的中断信号,说明CPU1已经ready,收到CPU1的中断后,再触发对CPU1的中断,这样就可以完成这个实验。
最后我们调试运行,先看一下调试配置选项
点击运行