笔者翻译官方教程时发现该教程对应的是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 执行以下任务:
为硬件 XSA 创建platform project。在此platform project中,FSBL(first stage boot loader,第一阶段引导加载程序)和PMU(平台管理单元)的PMU固件将作为该平台项目的引导组件创建。
为应用处理单元(APU)创建裸机应用程序(bare-metal applications)。
为 APU 和实时处理单元(RPU)创建系统项目。
在这个示例中,我们将创建一个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
)
打开Vitis IDE,选择工作区并继续,点击"Create Platform Component"
输入名字"zcu102_edt"并继续
导入上一章中生成的XSA文件
Operating System选择Standalone,Processor选择psu_cortexa53_0,其余默认,完成创建
在本例中,您将基于上一个示例中创建的平台创建一个“Hello World”应用程序。您将学习如何管理板设置,进行电缆连接,通过PC连接到板,并使用Vitis IDE中的系统调试器在JTAG模式下从Arm Cortex-A53处理器运行简单的“Hello World”软件应用程序。
输入:在前面的示例中创建的平台中的独立BSP库
输出:hello.elf
用于Arm Cortex-A53
将目标板接上电源线,用USB JTAG线将目标板和上位机相连,在上位机中确认串口连接成功
新建Application Project,使用Hello World模板
右键单击hello_a53应用程序项目并选择Build来构建应用程序。
右键单击hello_a53,选择“运行为→运行配置”。
右键单击Xilinx Application Debugger,然后单击New Configuration。
Vitis IDE创建新的运行配置,名为Debugger_hello_a53-Default。与应用程序关联的配置在启动配置的主页中预先填充。
单击Target Setup页面查看设置。
点击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”字符串逐字节地传递到主机上运行的串行终端应用程序,该应用程序将其显示为字符串。
为cortexr5_0创建stahdlone BSP域
在当前工作空间内,展开Component Explorer(组件资源管理器)下的平台组件以打开Settings(设置)文件夹并选中 vitis-comp.json 文件。
单击+按钮以Add Domain(添加域)。
指定Name(名称)和Display name(显示名称)。
对于OS(操作系统),请选中“Linux”、“FreeRTOS”或“Standalone”(独立)。
从可用“Processors”(处理器)中选择所需处理器。可选“Processor”随所选OS而变。
单击OK(完成),将域添加到平台。
默认情况下,edt_zcu102_wrapper平台会为 psu_cortexa53_0 分配默认域。您在此平台中为 cortexr5_0 创建了一个新域。
然后在新的域上创建应用程序,流程与案例3相同,运行程序的结果也是和案例3相同的
Vitis IDE 可以在一个系统项目中组织需要同时运行的多个应用项目。这在项目组织中非常有用,并且可以在需要同时运行 Arm Cortex-A53、Arm Cortex-R5F 或 MicroBlaze 软处理器时简化调试。
创建Hello_system系统项目,然后将案例3与案例4的应用程序添加到系统项目中。
当两个应用程序需要同时运行时,它们不能使用冲突的资源。他们不应该占用对方的内存空间。他们应该使用自己的外设,或者按时间共享外设。在此步骤中,通过更新链接器脚本来分配内存空间。
在Explorer视图中,展开testapp_r5项目。
在src目录下,双击lscript.ld以打开此项目的链接器脚本。
在链接器脚本中,在“可用内存区域”中修改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配置中做一个小的修改。
通过双击zcu102_edt→platform.spr打开平台详细信息选项卡。
打开Cortex-R5F的独立域BSP设置详细信息:
导航到psu_cortexr5→standalone_r5→Board Support Package。
单击“修改BSP设置”。
更改standalone_r5的UART设置:
选择Standalone选项卡。
将stdin更改为psu_uart_1。
将标准输出更改为psu_uart_1。
build psu_cortexr5_0域和testapp_r5应用程序。
运行。
上位机需要同时打开两个串口调试窗口,然后可以同时看到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插件快速发布