Zynqmp 裸机核间通信

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

目录

1.APU和APU中断通信

2.APU和RPU中断通信

3.数据交换


1.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的中断,这样就可以完成这个实验。

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

        点击运行

2.APU和RPU中断通信

        好了,上面聊完了APU和APU的事儿,再说说APU和RPU之间怎么中断通信。可能有同学会表示,你上面不是已经说了吗,我照着这个再换成RPU的屏蔽码不就行了?我试了,不行!上面这种中断方式那是给“自家兄弟沟通用的”!!什么意思,106板子上有四个cortexA53核心,两个cortexR5核心,A53和A53是自家兄弟,R5和R5是自家兄弟,A53和R5不是自家兄弟,长得都不一样能说是自家兄弟吗?虽说不是亲兄弟,但也有那么点关系,具体啥关系,看这篇文章(点我 传送门)。人家文章中解释的很清楚,inter-processer interrup内部处理器中断。openAMP就是在这套硬件框架基础上搭建的,感兴趣的可以参考文档UG1186来尝尝鲜。OK,传送门里的文章详细的介绍了zynqMP的中断架构,以及用SDK的demo来演示如何进行APU和RPU的核间通讯,照着他的方法完成实验不难。

3.数据交换

        现在核间通讯应该是没有问题的,那怎么实现数据传递呢,共享内存呗。106板子硬核有256KB的片上RAM,拿来用吧,把片上RAM分出6个不同的区域,用于四个APU两个RPU的数据交换区,可以一试。全文完

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页