Zynq系列器件提供双核Cortex-A9 ARM硬核,同时PL还支持MB软核,现在就掰一掰这三核共存怎么用。
多核框架如图1所示,PL内使用MicroBlaze软核,PS内为ARM双硬核,通用外设控制器、DDR挂在PS上,PL和PS共享DDR。PS程序在DDR里运行应用程序,Microblaze在内部BRAM中运行。
图1 多核框架图
在非加密状态下各部分的启动流程如下:
① Stage0:上电复位,CPU0 BootROM根据ModeIO选择的启动设备读取FSBL镜像并在OCM运行(Nor Flash、QSPI Flash可直接在FLASH运行),此时CPU1处于WFE状态;
② Stage1:FSBL执行后,将PL BitStream 、PS应用程序和其它数据到指定位置,并通过DevCfg DMA向0xFFFFFFFF处写Bit文件配置PL,释放PL复位和交付程序指针到ARM应用程序;
③ Stage2:应用程序执行,CPU0向地址0xFFFFFFF0地址处写入CPU1程序执行地址并释放SEV事件唤醒CPU1,CPU在检测到0xFFFFFFF0地址里的数据不为0x0后跳转运行。
按照图1所示的框架在Vivado中搭建好硬件工程并综合实现产生bit文件和其他配置文件导出到SDK。
FSBL必须选择在CPU0下建立,和单核时没有区别。
CPU0 APP在执行过程中需要唤醒CPU0,步骤如下:
① 禁止Cache ToOCM;
② 写CPU1 APP执行首地址到0xFFFFFFF0;
③ 等待写内存完成(dmb())并释放SEV(sev())事件。
CPU0 其他应用程序和单核相同,在处理共享资源时需要通过共享内存传递互斥信号量或使用中断通知。
CPU1 APP在建立应用时CPUCore选择 Ps7_CortexA9_1,将编译器预编译配置项Board Support Package Settings中的extra_compiler_flag选项中添加预编译命令-DUSE_AMP=1使能AMP条件;
由于程序不需要MMU作地址映射,因此需要将CPU1BSP的boot.S代码中以下内容注释掉:
/* In case of AMP, map virtual address 0x20000000 to 0x00000000 and mark it as non-cacheable */
#if USE_AMP==1
ldr r3, =0x1ff /* 512entries to cover 512MB DDR */
ldr r0, =TblBase /* MMUTable address in memory */
add r0, r0, #0x800 /* Addressof entry in MMU table, for 0x20000000 */
ldr r2, =0x0c02 /* S=b0TEX=b000 AP=b11, Domain=b0, C=b0, B=b0 */
mmu_loop:
str r2, [r0] /* writethe entry to MMU table */
add r0, r0, #0x4 /* nextentry in the table */
add r2, r2, #0x100000 /* nextsection */
subs r3, r3, #1
bge mmu_loop /* looptill 512MB is covered */
#endif
除了对共享资源的处理外,和单核应用程序开发相同。
MicroBalze是独立的,与PS内的ARM硬核没有任何关联。
第一级引导文件FSBL、PL Bit文件、CPU0 elf、CPU1 elf和MicroBlazeelf均需固化在ROM中。
因MicroBlaze是独立在BRAM中运行,因此无法将其可执行elf文件上电单独加载到BRAM,因此将elf作为BitStream中的RAM初始化文件写入。所需文件如下:
① MicroBlaze RAM配置文件:xx.bmm;
② MicroBlaze ELF文件:xx.elf;
③ PL Bit文件:xx.bit。
执行命令:
data2mem –bm xx.bmm –p <器件型号> -bt xx.bit –bdxx.elf –o b <目标bit> 生成包含RAM初始化文件的最终Bit文件。
当然,使用SDK图形工具也可生成相关文件。
最终boot.bin文件包含fsbl、bit文件、cpu0 elf、cpu1 elf以及其他数据如操作系统镜像、DeviceTree、文件系统等等。可以通过SDK GUI界面或批处理命令生成,各镜像必须内容的位置必须是:
① fsbl.elf: 属性[bootloader];
② xx.bit:属性[data];
③ cpu0.elf(或u-boot.elf):属性[data];
④ cpu1.elf:属性[data]。
Debug 略。
将最终生成的boot.bin(或BOOT.BIN,名字必须是这两个)拷贝到SD卡中,
重新上电即可加载运行。
在ARM已有双CortexA9Mpcore硬核的情况下添加Microblaze软核的好处是:
① 完全独立且和操作系统无关,可降低开发难度,便于调试时使用,在运行轻量级任务很方便,不需要额外的软件开发团队;
② 符合传统FPGA的开发思维,可移植到任何一款Xilinx FPGA和含FPGA的Soc上。
缺点是:
① 占用额外的逻辑资源且处理能力有限;
② ARM硬核强大的处理能力得不到充分利用,造成固有资源浪费,无法实现系统的最高性能。
注:MicroBlaze代码也可在DDR中运行,Xilinx提供了官方应用XAPP1093,但该应用我尚未跑通。