项目简述
我们都知道ZYNQ中有两个ARM核,但是如何使ZYNQ运行这两个ARM核,以及双核之间的数据如何进行交互是非常重要的问题。双核CPU的运行方式主要有两种:1、SMP 对称处理器架构 ,2、 AMP 非对称处理器架构,SMP结构双核之间的关系比较密切,AMP架构双核之间逻辑关系较小,开发难度也比较简单。
工程描述:运行ZYNQ的两个ARM核,同时利用OCM3进行双核之间简单的数据交互。
本次实验所用到的软硬件环境如下:
1、VIVADO 2019.1
2、米联客MZ7015FA开发板
CPU0代码
因为该工程除了在Block Design侧例化一个ZYNQ的IP,其他不需要做任何处理,所以我们将不再进行PL侧的讲解。直接对PS侧的代码进行讲解。PS端地址的分布情况如下:
在没有做其他设置的情况下ZYNQ上电后地址空间分别如上图所示。OCM共256KB按照64KB分为4块,其中前三块在SDK中表述为RAM0占192KB处于地址空间的最开头和DDR共用地址空间,最后一块64KB处于地址空间的最后。ZYNQ的DDR固定占地址空间的最开头1GB字节因而ZYNQ的DDR最大容量就只有1GB。为了避开OCM从上图可知实际使用的DDR只有1023MB(最开头的1MB被保留避开OCM的前三块)。从0x40000000到0xDFFFFFFF的2GB空间留给了自定义IP或者其他IP的寄存器,从BSP的xparameters.h可以看出在PL部分添加的IP其基址都是从0x40000000开始的,而ZYNQ自己的寄存器则从0xE0000000开始编制,具体寄存器内容请查阅UG585的附录B Register Details。其实Standalone作为基础的BSP所作的工作都是在通过指针访问各个寄存器而已,在不考虑安全性的前提下可以完全不用BSP直接操作寄存器对ZYNQ进行操作。所以我们一般使用OCM3作为CPU0与CPU1的共享内存使用。
我们这里给出相应的CPU0的代码;
#include <stdio.h>
#include "xil_mmu.h"
#include "xil_printf.h"
#define COMM_VAL (*(volatile unsigned long *)(0xffff0000)) //OCM3
int main()
{
COMM_VAL =0;
//disable cache on chip mem
Xil_SetTlbAttributes(0xffff0000