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文件步骤要对;

谢谢~

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值