参考
1.《DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南》第十七章 双核AMP实验
要点:
1)给每个arm核创建一个domain。
2)多核app用软件中断实现通信。
3)debug时下载多个app的elf文件。
4)固化时把多个app的elf选中做BIN文件。
多核处理器,从硬件上看:
1)同构多核:多个核心的架构一致;ZynqMPSoC是多个A53核,同构。
2)异构多核:多个核心架构不一致。例如手机处理器的大小核。
从软件上看:
1)AMP 非对称处理:(Asymmetric Multi-Processing),多个处理器运行各自的程序,相互之间隔离。
2)SMP 对称处理:Symmetric Multi-Processing。多处理器运行同一个OS,由OS统一调度。
![](https://img.haomeiwen.com/i12646837/99cbcbe974942f51.png)
![](https://img.haomeiwen.com/i12646837/31d71e1ef4023fd8.png)
ZynqMPSoC的EG系列有4核A53,在AMP机制下每个A53运行各自的应用程序。
ZynqMP中多个A53有各自私有的资源(L1指令Cache,L1数据Cache,私有定时器等),也有一些共享的资源(L2 Cache,DDR内存,OCM、外设等)。多处理器访问共享资源时,需要互斥访问,避免冲突。
在MPSoC中可以使用软件中断(SGI,Software Generated Interrupts)来避免访问的冲突。每个CPU可以用SGI中断自己,中断另一个CPU,或同时中断二者(Each CPU can interrupt itself,the other CPU, or both CPUs using a software generated interrupt SGI)。向软件中断寄存器(ICDSGIR)写入中断编号并指向目标CPU,就产生了一个SGI。每个CPU各自有一组SGI寄存器,可以产生16个软件中断。下图是SGI的中断ID号,0~15.
![](https://img.haomeiwen.com/i12646837/a2b7c6f96cb38ff6.png)
SGI实现互斥锁的功能,用共享内存实现数据共享的功能。
无论是用OCM(256kB,On-Chip-Memory)还是用DDR共享内存,在访问之前都需要禁止Cache功能。这样两个CPU看到的都是最新的数据,防止cache的数据不一致性。通过Xil_SetTlbAttributes(INTPTR Addr, u32 attrib)函数禁用Cache属性,第一个参数为共享内存的基地址,第二个参数为设置内存的参数,包括是否禁用Cache等。
Xilinx官方提供了2个例程,XAPP1078是1个linux+1个bare-metal;XAPP1079是2个bare-metal应用。XAPP1079文档是非常值得一看的,里面详细的介绍了ZYNQ芯片中两个CPU的启动顺序和方式、裸机VITIS环境中的配置等。
创建AMP应用的步骤
1)先创建CPU0上的application,步骤和普通单核应用是相同的。
2)给CPU1创建domain,如下图所示。
![](https://img.haomeiwen.com/i12646837/0acc34bac2fee358.png)
![](https://img.haomeiwen.com/i12646837/d2a51ff4f847f63d.png)
![](https://img.haomeiwen.com/i12646837/93d5e04d39c12cf1.png)
![](https://img.haomeiwen.com/i12646837/c5787cd7b7586230.png)
![](https://img.haomeiwen.com/i12646837/5aeeb8e305ec9f22.png)
![](https://img.haomeiwen.com/i12646837/568d9caa5525b9a8.png)
![](https://img.haomeiwen.com/i12646837/1bd1ee8a2cbe9a48.png)
写好2个工程的代码后,设置debug,如下图,勾选cpu0和cpu1,下载2个工程进去。
![](https://img.haomeiwen.com/i12646837/c318fc785dcdbce6.png)
网友评论