首页 > 技术知识 > 正文

之前章节中涉及到PS端的裸机程序都是在CPU0上运行的,弄的差点就忘了ZYNQ是拥有两个A9硬核的强劲芯片,所以我们必须要学会怎么让两个CPU核心同时运行,不然就和之前开发单片机有什么区别呢?本章我们就来探索如何实现双核的AMP启动(PS:博主以前是开发单片机和FPGA过来的)。

ZYNQ双核启动方式简介

非对称多处理器启动(AMP启动)

这个模式启动可以用语使用多个CPU核的系统上,比如像ZYNQ这样的多核芯片上,在这种模式下,每个CPU核可以运行自己的操作系统,比如可以CPU0跑裸机而CPU1跑FreeRTOS系统,再比如CPU0跑FreeRTOS系统而CPU1跑LINUX系统;而CPU之间的通讯是通过共享内存的方式进行的。

对称多处理器启动(SMP启动)

在该启动模式下所有的CPU必须是完全相同的构架,并且所有CPU必须运行单个操作系统一起运行,这个操作系统把进程任务分派到各个CPU上,并且加以协调。和AMP一样,CPU之间是通过共享内存来做通信,以及任务执行的协调。所以SMP的启动方式不适合在裸机以及RTOS环境下实现。

两种启动方式的比较

下图描述了AMP和SMP的不同,以及他们在ZYNQ平台上的对应关系:如何实现双核的AMP启动-双核cpu怎么变成四核其性能的不同如下所示:如何实现双核的AMP启动-双核cpu怎么变成四核1

AMP启动的实现

我们本节工程是基于 ZYNQ进阶之路7 章节的内容实现的,在ZYNQ进阶之路7 章节中我们输出了两路PWM波实现呼吸灯的功能,在本章节中我们分别使用CPU0和CPU1控制两个LED等实现两个呼吸灯的功能,我们再通过逻辑在PL端增加两个端口输出PWM控制LED,这两个LED实现和前面两个LED同步呼吸的功能。首先打开 ZYNQ进阶之路7 中的工程如下所示:如何实现双核的AMP启动-双核cpu怎么变成四核2新建verliog文件输入以下代码,代码中的50M时钟我们使用PL端的50M晶振提供,所以和PS端属于异步时钟,因为PS端提供给PL端的时钟也为50M,所以这里我们对其进行简单的跨时钟域处理,多周期同步,对两个PWM信号进行打两个时钟节拍的方式实现同步,这种方式能解决一些简单的异步时钟域问题:如何实现双核的AMP启动-双核cpu怎么变成四核3将PWM.v文件加入Diagram窗口中:

如何实现双核的AMP启动-双核cpu怎么变成四核4将信号线引出到指定接线上:如何实现双核的AMP启动-双核cpu怎么变成四核5对引脚进行绑定:如何实现双核的AMP启动-双核cpu怎么变成四核6然后生成硬件bit文件,导出硬件,打开SDK进行软件编程:如何实现双核的AMP启动-双核cpu怎么变成四核7然后分别创建CPU0和CPU1的两个工程,在下图中选择:如何实现双核的AMP启动-双核cpu怎么变成四核8创建后如下图所示,其中1为CPU0的工程,2为CPU2的工程:如何实现双核的AMP启动-双核cpu怎么变成四核9在CPU0的工程中输入如下代码:如何实现双核的AMP启动-双核cpu怎么变成四核10在CPU1工程中输入如下代码:如何实现双核的AMP启动-双核cpu怎么变成四核11修改CPU0的DDR3基地址:如何实现双核的AMP启动-双核cpu怎么变成四核12修改CPU1的DDR3基地址(注意两个CPU的地址不能发生冲突):如何实现双核的AMP启动-双核cpu怎么变成四核13右键点击CPU1工程,选择BSP setting选项:如何实现双核的AMP启动-双核cpu怎么变成四核14在此处添加如下附加信息:如何实现双核的AMP启动-双核cpu怎么变成四核15然后就可以将两个工程编译后,在run config中设置如下选项:如何实现双核的AMP启动-双核cpu怎么变成四核16然后点击run即可将程序下载到芯片中了,这是可以看到4个LED一两个一对的方式实现呼吸灯功能了。在下一章节我们将讲解如何将双核程序固化到SPI flash中。

审核编辑:彭静

猜你喜欢