ZYNQ-Double-CPU

ZYNQ-Double-CPU

一.简介

多核处理器基本分为两种结构:同构多核架构和异构多核架构,同构多核处理器是指处理器在结构上是相同的,而异构处理器是指在结构上不相同。同构多核架构相比异构多核架构在硬件核软件上设计较为简单,通用性高,在某些特定场合下使用异构架构专用硬件加速硬核性能会更高,ZYNQ则是将同构核异构两种架构融合在一起,可以是同构也可以是异构,同构是因为两颗Cortex-A9处理器结构上相同,异构则是ZYNQ芯片包含可编程逻辑单元(PL)让ZYNQ变成异构多核系统,同时有较高的通用性能。
多核处理器运行模式有AMP(非对称处理),SMP(对称处理)和BMP(受约束多处理)三种模式。
AMP模式:多个内核相对独立运行不同的任务,可以运行不同的操作系统或者裸机程序
SMP模式:多个处理器运行一个操作系统,这个操作系统可以管理多个内核例如Win系统
BMP模式:开发者可以将某个任务指定在某个内核上运行。
ZYNQ提供两个Cortex-A9处理器,都有各自私有的资源,同时也有共享资源,私有资源有L1指令缓存,L1数据缓存,私有定时。共享资源有L2,Cache,DDR存储器,外设和OCM(On chip Menmory)等,AMP模式下两个处理器分别运行,可以访问共享资源,但是在访问共享资源时要注意‘彼此之间是否会产生冲突’,否则可能会出现十分严重的后果。
在这里插入图片描述

二.硬件搭建

硬件搭建和上一章一样只需要打开SD0和Uart0两个端口

三.软件设计

首先创建FSBL(First Stage Bootloader)文件,在FSBL找到main.c文件添加启动程序,程序添加在main函数上面,startCpu1函数添加在load boot image 是因为要等CPU0加载玩以后才能启动CPU1
//启动CPU1使用代码,
//把CPU1的应用程序写到0xFFFFFFF0地址中
//CPU1将从0x2000000启动
#define sev() asm(“sev”)
#define CPU1STARTADR 0xFFFFFFF0
#define CPU1STARTMEM 0x2000000
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
}
CPU0程序设计
创建CPU0工程要选择ps7-Cortexa9-0也就是核0
在这里插入图片描述
CPU0和CPU1是通过COM_VAL变量通信的,当然也能通过软件中断的方式通信
在这里插入图片描述
设置CPU0应用程序执行内存区域,打开Iscript.ld文件,点左下角Source,ZYNQ有512M内存,可以平分给CPU0和CPU1各256M,前面是起始地址,后面是地址长度,这里有个小细节要注意,如果设置一个变量过大,程序运行的过程中跑飞可以修改Stack_size和Heap_size的大小即可解决。
在这里插入图片描述
CPU1程序设计
创建CPU1工程要选择ps7-Cortexa9-1也就是核1
在这里插入图片描述
程序方面和CPU0没太大的区别
在这里插入图片描述
CPU1的应用运行内存需要设置,内存划分不允许和CPU0内存区域有交集,否则会出错
在这里插入图片描述
还需要设置编译器,右键CPU1的bsp文件下面有个seting的选项,将编译模式设置为AMP模式
在这里插入图片描述
下载板卡验证信息,选择CPU0 Debug,application需要把Cortexa9-1勾选上
在这里插入图片描述
结果
在这里插入图片描述
创建bin文件步骤:

  1. xilinx -> greate boot image
  2. 设置存放路径
  3. 依次顺序添加FSBL.elf文件,desinged.Bit文件,CPU0.elf文件,CPU1.elf文件
  4. Greate Image

四. 总结

本次实验是通过共享内存的方式建立双CPU通信,方式较为简单,也可以通过这种方式进行互传数据,传输一些较小的数据非常方便,如果要传输一些图像之类的建议还是通过DDR的方式进行互传,On chip memory内存容量比较小仅有256K。
这里为什么要关闭Cache?首先CPU会把数据先给Cache,然后Cache再把数据写入OCM写入的速度跟Cache內部的算法和CPU的速度有关,延时是一定会有的,会导致出现CPU0已经把COM_VAL = 0值改变了但是CPU1那边读OCM得到的数据确是COM_VAL = 1,这就会出现数据不是一致性,所以关闭Cache是想然CPU直接把数据写到OCM中,这样才能同步。
需要注意的地方:

  1. 核0和核1内存区域的划分,一定不允许有交集,建议是两边的大小都为256M,也可根据实际情况而定;
  2. 设置FSBL启动核1的启动程序,函数必须放在BOOT Image的后面
  3. 设置核1的编译模式-DUSE_AMP=1必须设置的步骤,否则核1无法运行;
  4. 下载程序也要勾选Cortexa9-1;
  5. 创建bin文件步骤要对;

谢谢~

文档共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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值