二、为PS子系统构建独立软件

前言

笔者翻译官方教程时发现该教程对应的是Vitis经典版本,而目前Vitis最新版本为2023.2 "Vitis Unified IDE",新版和经典版的界面和使用上有较大差异,但整体流程是一致的。

原文:https://xilinx.github.io/Embedded-Design-Tutorials/docs/2023.1/build/html/docs/Introduction/ZynqMPSoC-EDT/4-build-sw-for-ps-subsystems.html

正文

本章列出了配置和构建 PS 子系统软件的步骤

在上一章《一、使用Vivado配置Zynq的PS系统 (limfx.pro)》中,我们创建并从 Vivado 导出了硬件设计文件。导出的 XSA 文件包含hardware handoff、PS初始化(psu_init)以及 PL bitstream(如果导出方式选择post-implementation)。在本章中,将导入 XSA 到 Vitis™ IDE 中,以生成用于处理系统的软件。

将使用 Vitis IDE 执行以下任务:

  1. 为硬件 XSA 创建platform project。在此platform project中,FSBL(first stage boot loader,第一阶段引导加载程序)和PMU(平台管理单元)的PMU固件将作为该平台项目的引导组件创建。

  2. 为应用处理单元(APU)创建裸机应用程序(bare-metal applications)。

  3. 为 APU 和实时处理单元(RPU)创建系统项目。

案例2:使用Vitis IDE创建一个Platform Project

在这个示例中,我们将创建一个Platform Project,以从 Vivado 导出的 XSA 文件中提取信息。

Zynq UltraScale+ 处理系统中的主要处理单元如下所示:

  • 应用处理单元:四核 Arm® Cortex™-A53 MPCore 处理器

  • 实时处理单元:双核 Arm Cortex™-R5F MPCore 处理器

  • 图形处理单元:Arm Mali™ 400 MP2 GPU

  • 平台管理单元(PMU):基于 Xilinx MicroBlaze™ 的平台管理单元

Platform Project从 XSA 文件中读取硬件信息,并包含了上述处理单元的运行时环境。应用软件可以链接到在Platform Project中生成的库。

示例输入和输出文件

输入:硬件交接的 XSA 文件(edt_zcu102_wrapper.xsa

输出:

  • Arm Cortex-A53 的独立 BSP 库

  • 引导组件(FSBL:zynqmp.elf 和 PMUFW:pmufw.elf

创建Platform Project

  1. 打开Vitis IDE,选择工作区并继续,点击"Create Platform Component"

  2. 输入名字"zcu102_edt"并继续

  3. 导入上一章中生成的XSA文件

  4. Operating System选择Standalone,Processor选择psu_cortexa53_0,其余默认,完成创建

案例3:在Arm Cortex-A53上运行“Hello World”应用程序

在本例中,您将基于上一个示例中创建的平台创建一个“Hello World”应用程序。您将学习如何管理板设置,进行电缆连接,通过PC连接到板,并使用Vitis IDE中的系统调试器在JTAG模式下从Arm Cortex-A53处理器运行简单的“Hello World”软件应用程序。

示例输入和输出文件

输入:在前面的示例中创建的平台中的独立BSP库

输出:hello.elf用于Arm Cortex-A53

目标板设定

将目标板接上电源线,用USB JTAG线将目标板和上位机相连,在上位机中确认串口连接成功

创建并运行“Hello World”应用程序

新建Application Project,使用Hello World模板

  1. 右键单击hello_a53应用程序项目并选择Build来构建应用程序。

  2. 右键单击hello_a53,选择“运行为→运行配置”。

  3. 右键单击Xilinx Application Debugger,然后单击New Configuration。

  4. Vitis IDE创建新的运行配置,名为Debugger_hello_a53-Default。与应用程序关联的配置在启动配置的主页中预先填充。

  5. 单击Target Setup页面查看设置。

  6. 点击Run

运行结果将如下所示

Xilinx Zynq MP First Stage Boot loader

Release 2022.2 <build time>
PMU-FW is not running, certain applications may not be supported.

Hello World

Successfully ran Hello World application

注意:在Zynq UltraScale+ evaluation board上执行上述软件应用程序不需要下载比特流。Arm Cortex-A53四核处理器已经出现在PS中。该系统运行简单应用程序的基本初始化是通过设备初始化Tcl脚本完成的。

背后原理

Arm Cortex-A53上的应用程序将“Hello World”字符串发送到PS端的UART0外设。

从UART0开始,“Hello World”字符串逐字节地传递到主机上运行的串行终端应用程序,该应用程序将其显示为字符串。

案例4:在Arm Cortex-R5上运行“Hello World”应用程序

为cortexr5_0创建stahdlone BSP域

  1. 在当前工作空间内,展开Component Explorer(组件资源管理器)下的平台组件以打开Settings(设置)文件夹并选中 vitis-comp.json 文件。

  2. 单击+按钮以Add Domain(添加域)。

  3. 指定Name(名称)和Display name(显示名称)。

  4. 对于OS(操作系统),请选中“Linux”、“FreeRTOS”或“Standalone”(独立)。

  5. 从可用“Processors”(处理器)中选择所需处理器。可选“Processor”随所选OS而变。

  6. 单击OK(完成),将域添加到平台。

默认情况下,edt_zcu102_wrapper平台会为 psu_cortexa53_0 分配默认域。您在此平台中为 cortexr5_0 创建了一个新域。

然后在新的域上创建应用程序,流程与案例3相同,运行程序的结果也是和案例3相同的

案例5:使用System Project管理多个应用程序

Vitis IDE 可以在一个系统项目中组织需要同时运行的多个应用项目。这在项目组织中非常有用,并且可以在需要同时运行 Arm Cortex-A53、Arm Cortex-R5F 或 MicroBlaze 软处理器时简化调试。

创建hello_system系统项目

创建Hello_system系统项目,然后将案例3与案例4的应用程序添加到系统项目中。

当两个应用程序需要同时运行时,它们不能使用冲突的资源。他们不应该占用对方的内存空间。他们应该使用自己的外设,或者按时间共享外设。在此步骤中,通过更新链接器脚本来分配内存空间。

  1. 在Explorer视图中,展开testapp_r5项目。

  2. 在src目录下,双击lscript.ld以打开此项目的链接器脚本。

  3. 在链接器脚本中,在“可用内存区域”中修改psu_r5_ddr_0_MEM_0的属性:

  • Base Address: 0x70000000

  • Size: 0x10000000

链接器脚本中的此修改可确保 RPU 裸机应用程序驻留在 DDR 中的基址之上0x70000000占用的大小不超过 256 MB

ZCU102 Evaluation kit具有来自Silicon Labs (CP2108)的USB-TO-QUAD-UART桥接IC。这使您能够为在Cortex-A53和Cortex-R5F内核上运行的应用程序选择不同的UART端口。在本例中,让Cortex-A53默认使用UART 0,并通过UART 1发送和接收RPU串行数据。这需要在standalone_r5 bsp配置中做一个小的修改。

  1. 通过双击zcu102_edt→platform.spr打开平台详细信息选项卡。

  2. 打开Cortex-R5F的独立域BSP设置详细信息:

  • 导航到psu_cortexr5→standalone_r5→Board Support Package。

  • 单击“修改BSP设置”。

  1. 更改standalone_r5的UART设置:

  • 选择Standalone选项卡。

  • 将stdin更改为psu_uart_1。

  • 将标准输出更改为psu_uart_1。

  1. build psu_cortexr5_0域和testapp_r5应用程序。

  2. 运行。

上位机需要同时打开两个串口调试窗口,然后可以同时看到APU和RPU发送的信息。

背后原理

Vitis 工具使用 JTAG 来控制电路板,并执行以下任务:

  • 使用 FSBL 初始化 MPSoC。

  • 复位系统

  • 在split mode下启用 RPU。

  • 将 ELF 文件下载到 Cortex-A53_0 和 Cortex-R5F_0。将处理器置于suspend mode。

  • 在两个处理器上运行应用程序。

  • APU 上的应用程序打印在 UART-0 上,RPU 上的应用程序打印在 UART-1 上。

默认情况下,平台会创建启动组件。生成的 FSBL 已用于在启动“Hello World”应用程序之前初始化运行环境。您可以查看其设置并根据需要修改配置。


本文章使用limfx的vscode插件快速发布