基于ZYNQ的双核CPU之间的通信

项目简述

我们都知道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,0x14de2);
	while(1){

		print("Hello World CPU0 \n\r");
		COMM_VAL =1;
		while(COMM_VAL ==1){

		}
	}
    return 0;
}

我们上面的代码唯一看不懂的就是下面这段话:
在这里插入图片描述
这段程序其实就是CPU0中禁止OCM的Cache属性,以为内Cache功能会向OCM3中填入一些缓存数据进而让OCM3中的数据进入不可控的状态。

CPU1代码

上面对工程的原理已经进行了讲解,这里我们直接给出相应的CPU1的代码,如下:

#include <stdio.h>
#include "xil_mmu.h"
#include "xil_printf.h"
#include "sleep.h"

#define COMM_VAL  (*(volatile unsigned long *)(0xffff0000)) //OCM3
int main()
{
	//disable cache on chip mem
		Xil_SetTlbAttributes(0xffff0000,0x14de2);
		while(1){
			while(COMM_VAL ==0){

			}
			print("Hello World CPU1 \n\r");
			usleep(100);
			COMM_VAL =0;
		}

    return 0;
}

但是想要CPU1的代码成功运行起来,我们需要在CPU1的bsp文件中添加如下代码:创建CPU1的应用程序时需要设置CPU1的BSP SETTING extra-compel-flags 设置 -DUSE_AMP=1。
在这里插入图片描述
在这里插入图片描述
因为是AMP架构,所以得编辑lscript.ld文件,使得CPU0与CPU1的内存区间不相互重叠,如下;
CPU0修改:
在这里插入图片描述
CPU1修改:
在这里插入图片描述

运行结果

在进行下板运行的过程中也需要进行相应的设置如下:
在这里插入图片描述
在这里插入图片描述
进行完上面的配置,我们便可以下载相应的代码到ZYNQ中,并且运行结果如下:
在这里插入图片描述

双核CPU的固化SD卡

我们学完了双核CPU如何跑相应的程序,那么也需要进行学习如何固化相应的程序到达SD卡中。
在进行生成的FSBL的main文件中添加如下代码,该代码的意义是启动CPU1的代码:

#define sev() __asm__("sev")
#define CPU1STARTADR 0xFFFFFFF0
#define CPU1STARTMEM 0x02000000
void StartCpu1(void)
{
#if 1
fsbl_printf(DEBUG_GENERAL,"FSBL: Write the address of the application for CPU 1 to 0xFFFFFFF0\n\r");
Xil_Out32(CPU1STARTADR, CPU1STARTMEM);
dmb(); //waits until write has finished
fsbl_printf(DEBUG_GENERAL,"FSBL: Execute the SEV instruction to cause CPU 1 to wake up and jump to the application\n\r");
sev();
#endif
}

找到 Load boot image 的位置,把 CPU1 的启动函数,在此调用:

/*
* Load boot image
*/
HandoffAddress = LoadBootImage();
fsbl_printf(DEBUG_INFO,"Handoff Address: 0x%08lx\r\n",HandoffAddress);
StartCpu1(); /*add starting cpu1*/

然后创建 UBOOT.BIN
在这里插入图片描述
最后将生成的bin文件放到SD卡中即可。

参考文献

[1]、V3学院

总结

创作不易,认为文章有帮助的同学们可以关注、点赞、转发支持。为行业贡献及其微小的一部分。或者对文章有什么看法或者需要更近一步交流的同学,可以加入下面的群:
在这里插入图片描述

  • 9
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
文档共60页。主要向初学者提供了Zynq开发的技术方向,针对不同应用给出了基本的参考文档;同时对Zynq双核AMP加载方式做了详细描述,对Zynq的fsbl启动流程做了简单介绍。章节如下: Zynq User Guide 1 介绍 4 2 快速上手指南 4 3 多核开发教程 4 3.1 AMP开发说明 6 3.1.1 快速生成amp工程 6 3.1.2 Generating Boot File 8 3.1.3 烧写程序 9 3.1.4 启动 10 3.1.5 调试 10 3.1.6 总结 11 3.2 SMP开发说明 11 4 ZC706启动代码分析 11 4.1 启动代码 12 4.2 FSBL流程(FOR AMP) 13 4.3 CPU0启动CPU1流程 14 5 程序在线烧写方案及流程 14 5.1 程序烧写需求 14 5.2 提出该需求的原因 14 5.3 程序烧写方案 14 5.3.1 BOOT.BIN组成 14 5.3.2 BOOT.BIN生成方法 15 5.4 FSBL.BIN和APP.BIN等的生成 15 5.5 制作*BIN及烧写的具体步骤 15 5.5.1 制作*bin流程 15 5.5.2 BOOT.bin制作过程 15 5.5.3 FSBL.bin和APP.bin等的生成过程 22 5.6 烧写BOOT.BIN步骤 26 5.6.1 通过SDK工具烧写步骤 26 5.6.2 通过上位机烧写软件的烧写步骤 29 5.6.3 通过串口调试助手烧写步骤 29 6 Zynq Qspi控制器 30 6.1 基本特性 30 6.2 I/O接口 31 6.3 QSPI控制器模式 33 6.3.1 I/O模式 33 6.3.2 线性地址(linear address)模式 33 6.3.3 传统(legacy)SPI模式 34 6.4 QSPI 例程 34 6.5 QSPI控制器支持访问32MB方法 35 6.5.1 Bank地址寄存器(Bank address register) 35 6.5.2 扩展地址模式(Extended address mode) 35 6.5.3 使用新写命令(New commands) 35 6.6 QSPI FLASH选择 35 6.7 作为BOOT器件考虑 35 7 µC/OS系统启动指南 36 7.1 INTRODUCTION 36 7.1.1 Software Requirements 36 7.1.2 Hardware Requirements 36 7.2 HARDWARE DESIGN 37 7.2.1 Step 1. Invoke the Vivado IDE and Create a project 37 7.2.2 Step 2. Create an IP Integrator Design 39 7.2.3 Step 3. Add and setup the Zynq processor system IP block 39 7.2.4 Step 4. Customize the Zynq block for our design 41 7.2.5 Step 5. Add the soft peripherals 45 7.2.6 Step 6. Generate HDL Design Files 47 7.2.7 Step 7. Synthesis, Implement and Generate Bitstream 48 7.3 SOFTWARE DESIGN 49 7.3.1 Step 1. Installation of the µC/OS Repository 49 7.3.2 Step 2. Generate the µC/OS BSP 50 7.3.3 Step 3. Build and Debug the Demonstration Project 54 7.3.4 Step 4. Program the AXI Timer 0 with the ucos_axitimer Driver 55 7.3.5 Step 5. Program the AXI Timer 1 with the Xilinx tmrctr Driver 58 7.4 CONCLUSION 59 8 Linux系统启动指南 59

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值