1)摘自【正点原子】领航者 ZYNQ 之嵌入式开发指南
2)实验平台:正点原子领航者ZYNQ开发板
3)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761
4)全套实验源码 手册 视频下载:http://www.openedv.com/docs/boards/fpga/zdyz_linhanz.html
5)对正点原子FPGA感兴趣的同学可以加群讨论:876744900
6)关注正点原子公众号,获取最新资料
第十三章双核AMP实验
在前面的例程中,实现的都是基于单核CPU的实验,在很多应用场景中,往往只需要使用其中的一个CPU即可实现相应的功能。然而对于复杂的设计,如多任务处理、并行控制等,单个CPU将难以胜任。ZYNQ 7000 SOC芯片内部集成了两个独立的Cortex-A9内核处理器,即两个CPU,可以很好的应对各种复杂的设计。本章我们来学习下基于双核AMP的实验。
本章包括以下几个部分:
1313.1简介
13.2实验任务
13.3硬件设计
13.4软件设计
13.5下载验证
13.1简介
多核处理器从多核的结构上是否一致,分为两种基本架构:同构多核架构和异构多核架构。同构多核处理器是指系统中的处理器在结构上是相同的;而异构处理器是指系统中的处理器在结构上是不同的,这些处理器可以是通用处理器,也可以是解决某些特定应用的专用硬核。同构多核架构相比于异构多核架构,在硬件和软件设计上较为简单,通用性较高。但在某些特定应用场合下,如异构多核架构专用的硬件加速硬核,异构多核架构的性能会更高。
Xilinx的ZYNQ SOC融合了这两种架构,ZYNQ SOC芯片包含两个独立的Cortex-A9处理器,这两个处理器核在结构上是相同的,同时又包括了可编程的逻辑单元(PL),使得ZYNQ整体系统成为了一个异构多核系统,同时具有较高的通用性和性能。
从软件的角度看,多核处理器的运行模式有AMP(非对称多处理)、SMP(对称多处理)和BMP(受约束多处理)三种运行模式。
AMP运行模式指多个内核相对独立的运行不同的任务,每个内核相互隔离,可以运行不同的操作系统(OS)或裸机应用程序。
SMP运行模式指多个处理器运行一个操作系统,这个操作系统同等的管理多个内核,如PC电脑。
BMP运行模式与SMP类似,但开发者可以指定将某个任务仅在某个指定内核上执行。
一般来说,SMP为较高级的应用提供统一的OS平台,开发者在OS之上构建应用时,无需考虑两个内核之间的资源共享和进程间通信。除此之外,对SMP而言存在性能开销,这会对实时性要求较高的应用,其性能造成较大影响。如PC机电脑的多核处理器一般运行在SMP模式,实现的功能较为复杂,但对实时性的要求不高。
而AMP的运行模式基本没有开销问题,在运行裸机应用程序时,甚至完全没有开销,比较适合实时性要求较高的应用,但需要精心定制的软件设计来实现处理器资源共享和处理器间通信。如电力控制保护设备通常需要与人机接口实现复杂的通信和高实时性的计算能力,一般采用AMP运行模式,一个处理器运行Linux操作系统,另一个处理器运行裸机应用程序,从而兼顾了电力系统控制设备需要的复杂功能和实时性。
AMP和SMP运行模式的框图如图 13.1.1所示。
图 13.1.1 AMP与SMP运行模式的框图
AMP运行模式给开发者提供了一个与传统单核CPU系统相类似的运行环境,使得开发者已有的经验和知识可以继续加以利用;同时,也为程序的移植提供了很大的便利性。本次试验采用的是双核AMP的运行模式,两个CPU分别运行不同的裸机应用程序。
ZYNQ SOC提供的两个Cortex-A9处理器,都具有各自私有的资源,同时也有一些共享的资源。私有资源有L1指令缓存、L1数据缓存、私有定时器等。共享的资源有L2 Cache、DDR存储器、外设和OCM(On Chip Memory)等。在AMP运行模式下,这两个处理器彼此隔离、分别运行。但在访问共享资源或者外设时,要注意避免冲突,否则程序在运行时可能会出现问题。
我们可以通过类似互斥的方式来实现裸机情况下简单的双核使用,在ZYNQ系统中,可以利用软件产生中断(SGI,Software Generated Interrupts)来避免访问的冲突。ZYNQ系统中的每个CPU都能用SGI来中断自己、另一个CPU或同时中断两个CPU。向软件产生的中断寄存器(ICDSGIR)写入中断编号并指向目标CPU,就产生了一个SGI。每个CPU各自有一组SGI寄存器,可以产生16个软件产生中断中的一个或多个。图 13.1.2列出了SGI的中断ID号,范围是0~15。
图 13.1.2 软件中断
SGI可以触发CPU产生中断,但是如果想要传递数据的话,需要利用共享的内存实现数据的交互。共享内存指CPU0和CPU1在内存中约定一块地址及长度已知的内存区域,两个CPU通过读写共享内存中的数据来实现互相通信,而利用CPU产生的软件中断可以避免对共享内存的同时访问。
ZYNQ中的OCM共有256KB,分为4个64KB,而外置的DDR3存储器一般存储空间较大。当两个CPU需要进行大量数据交互的时候,可以使用DDR3存储器作为共享内存;而当交互的数据较少时,既可以使用OCM作为共享内存,也可以使用DDR3存储器作为共享内存。值得一提的是,当交互的数据量较少时,OCM作为共享内存有着独特的优势,与DDR内存相比,OCM提供了非常高的性能和来自两个处理器的低延迟访问。
需要注意的是,无论是OCM还是DDR3存储器作为共享内存,在访问之前,需要禁止存储空间的Cache(缓存)功能,这样CPU能够及时读到该地址内存中变化的数据,以避免两个CPU访问共享内存的一致性问题。通过Xil_SetTlbAttributes(INTPTR Addr, u32 attrib)函数禁用Cache属性,第一个参数为共享内存的基地址,第二个参数为设置内存的参数,包括是否禁用Cache等。
Xilinx官方提供了两个双核AMP的应用文档,“XAPP1078” 是基于两个Linux操作系统的双核AMP应用文档,“XAPP1079”是基于两个裸机应用程序的双核AMP应用文档,感兴趣的朋友可以参考下。
13.2实验任务
本章的实验任务是通过领航者ZYNQ开发板完成双核AMP的实验。CPU0接收串口的数据,并写入OCM中,然后利用软件产生中断触发CPU1;CPU1接收到中断后,根据从OCM中读出的数据控制呼吸灯的频率,并在控制结束后触发CPU0中断,实现了双核CPU通信的功能。
13.3硬件设计
根据实验任务我们可以画出本次实验的系统框图,如下图所示: