Xilinx Vitis 2020工程源目录修改

1 背景

  Xilinx Vitis可以做standalone程序开发,不过其工程中使用的路径为绝对路径。工程更换位置后编译将会显示错误。例如:源目录为D:/work,复制到同事电脑上放到C:/work(同事电脑只有一个C盘)。利用Vitis打开工程编译会有一堆错误,提示文件找不到。

2 分析

通过分析Vitis工程中有三个工程文件于路径相关:

  • xxx_system.sprj 其格式是一个xml文件,其中字段:
    • platform 存放.xpfm文件
  • xxx.prj 其格式是一个xml文件,其中字段:
    • platform 存放.xpfm文件
    • location 存放xxx.prj文件路径
  • platform.spr 平台文件,其格式是json文件,其中字段:
    • platHandOff 存放xsa文件路径
    • qemuArgs 存放qemu_args.txt文件全路径,是Vitis配置文件,与Vitis安装位置有关。
    • qemuData 存放qemu Data文件路径,与Vitis安装位置有关。

修改说明:

  • 将以上文件路径根据新路径(C:/work)替换旧路径(D:/work)即可。
  • 如果Vitis安装路径不同,需要更新qemuArgs和qemuData字段对应路径。

3 解决

可以通过手动修改以上文件是可以解决问题,不过手动修改容易出错误。更好的方式是写一脚本来做文件路径替换,这个脚本需要处理xml和json文件。Python语言内置xml和json库,是理想语言选择。
Python脚本如下:

import os
import json
import xml.etree.ElementTree as ET

def get_project_files(path):
    sprjfile = ""
    prjfile = ""
    sprfile = ""
    for root, _, files in os.walk(path):
        for file in files:
            _, ext = os.path.splitext(file)
            if ext == ".sprj":
                sprjfile = os.path.join(root, file)
            if ext == ".prj":
                prjfile = os.path.join(root, file)
            if ext == ".spr":
                sprfile = os.path.join(root, file)
    return (sprjfile, prjfile, sprfile)

def get_file(path, filename):
    fullfilename = ""
    for root, _, files in os.walk(path):
        for file in files:
            if file == filename:
                fullfilename = os.path.join(root, file)
                break
    return fullfilename

def update_file(filename, value1, newvalue1, value2 = None, newvalue2 = None):
    file = open(filename, "r", encoding="ascii")
    fileData = file.read()
    file.close()
    fileData = fileData.replace(value1, newvalue1)
    print(value1, " => ", newvalue1)
    if value2 != None and newvalue2 != None:
        fileData = fileData.replace(value2, newvalue2)
        print(value2, " => ", newvalue2)
    file = open(filename, "w", encoding="ascii")
    file.write(fileData)
    file.close()

def update_sprj(sprjfile, path):
    tree = ET.parse(sprjfile)
    attrib = tree.getroot().attrib
    platform = attrib.get("platform", "")
    filename = get_file(path, os.path.basename(platform))
    filename = filename.replace("\\", "/")
    update_file(sprjfile, platform, filename)

def update_prj(prjfile, path):
    tree = ET.parse(prjfile)
    attrib = tree.getroot().attrib
    platform = attrib.get("platform", "")
    location = attrib.get("location", "")
    platform_filename = get_file(path, os.path.basename(platform))
    location_dirname = os.path.dirname(prjfile)
    platform_filename = platform_filename.replace("\\", "/")
    location_dirname = location_dirname.replace("\\", "/")
    update_file(prjfile, platform, platform_filename, location, location_dirname)

def update_spr(sprfile, path, xilinx_qemu_path):
    file = open(sprfile, "r", encoding='utf-8')
    spr_data = json.load(file)
    file.close()
    platHandOff = spr_data.get("platHandOff", "")
    systems = spr_data.get("systems", {})
   
    platHandOff_filename = get_file(path + "\\board", os.path.basename(platHandOff))
    platHandOff_filename = platHandOff_filename.replace("\\", "/")
    update_file(sprfile, platHandOff, platHandOff_filename)
    if len(systems) == 1:
        domains = systems[0].get("domains", [])
        if len(domains) >= 2:
                qemuArgs = domains[1].get("qemuArgs", "")
                qemuData = domains[1].get("qemuData", "")
                update_file(sprfile, qemuData, xilinx_qemu_path)

path = 'E:\\g\\work'
xilinx_qemu_path='D:/Xilinx/Vitis/2020.1/data/emulation/platforms/zynq/qemu/'
sprjfile, prjfile, sprfile = get_project_files(path)

print("update file: ", sprjfile) # xml file
update_sprj(sprjfile, path)
print()

print("update file: ", prjfile) # xml file
update_prj(prjfile, path)
print()

print("update file: ", sprfile) # xml json
update_spr(sprfile, path, xilinx_qemu_path)

说明:

  • 脚本需要两个参数:
    • 工程所在路径的上一路径
    • Xilinx的qemu路径
  • get_project_files 函数根据工程路径查找三个工程文件。
  • update_sprj 更新sprj文件
  • update_prj 更新prj文件
  • update_spr 更新platform.spr文件

4 使用

4.1 修改路径

E:/g/work路径如下:

.
├── board
└── workspace
    ├── app_platform
    ├── app
    └── app_system

说明:

  • board 文件夹存放xsa文件
  • workspace 为工程路径:
    • app_platform 为平台路径
    • app_system 为系统路径
    • app 为应用路径

运行Python脚本

python3 patch.py
update file:  E:\g\work\workspace\app_system\app_system.sprj
X:/work/workspace/app_platform/export/app_platform/app_platform.xpfm  =>  E:/g/work/workspace/app_platform/export/app_platform/app_platform.xpfm

update file:  E:\g\work\workspace\app\app.prj
X:/work/workspace/app_platform/export/app_platform/app_platform.xpfm  =>  E:/g/work/workspace/app_platform/export/app_platform/app_platform.xpfm
X:/work/workspace/app  =>  E:/g/work/workspace/app

update file:  E:\g\work\workspace\app_platform\platform.spr
X:/work/board/app_platform_v1.0.xsa  =>  E:/g/work/board/app_platform_v1.0.xsa
C:/Xilinx/Vitis/2020.1/data/emulation/platforms/zynq/qemu/  =>  D:/Xilinx/Vitis/2020.1/data/emulation/platforms/zynq/qemu/

4.2 编译工程

4.2.1 清理工程

在这里插入图片描述

在上图中选择Clean菜单项,清理工程
在这里插入图片描述

如上图所示全部清理

buildplatform.bat 50156 app_platform clean 
XSDB Server Channel: tcfchan#10
Cleaning the zynq_fsbl application.
rm -rf  sd.o  nand.o  image_mover.o  md5.o  fsbl_hooks.o  main.o  nor.o  qspi.o  rsa.o  ps7_init.o  pcap.o  fsbl_handoff.o zynq
_fsbl_bsp/ps7_cortexa9_0/lib/libxil.a executable.elf *.o

Cleaning the zynq_fsbl application, bsp
make -C ps7_cortexa9_0/libsrc/bram_v4_4/src -s clean 

make -C ps7_cortexa9_0/libsrc/coresightps_dcc_v1_7/src -s clean 

make -C ps7_cortexa9_0/libsrc/cpu_cortexa9_v2_9/src -s clean 

make -C ps7_cortexa9_0/libsrc/ddrps_v1_1/src -s clean 

rm -f ps7_cortexa9_0/lib/libxil.a

Cleaning the BSP for domain  - domain_ps7_cortexa9_0
make -C ps7_cortexa9_0/libsrc/bram_v4_4/src -s clean 

make -C ps7_cortexa9_0/libsrc/uartps_v3_9/src -s clean 

make -C ps7_cortexa9_0/libsrc/xadcps_v2_4/src -s clean 

make -C ps7_cortexa9_0/libsrc/xilffs_v4_3/src -s clean 

rm -f ps7_cortexa9_0/lib/libxil.a


16:22:11 Build Finished (took 2s.891ms)

4.2.2 编译工程

在这里插入图片描述
在上图选择Build All菜单项编译工程

Generating bif file for the system project
generate_system_bif.bat 50156 E:/g/work/workspace/app_platform/export/app_platform/app_platform.xpfm domain_ps7_cortexa9_0 E:/g/work/workspace/app_system/Debug/system.bif
sdcard_gen --xpfm E:/g/work/workspace/app_platform/export/app_platform/app_platform.xpfm --sys_config app_platform --bif E:/g/work/workspace/app_system/Debug/system.bif --bitstream E:/g/work/workspace/app/_ide/bitstream/app_loadboardNI_v1.0.bit --elf E:/g/work/workspace/app/Debug/app.elf,ps7_cortexa9_0
creating BOOT.BIN using E:/g/work/workspace/app/_ide/bitstream/app_loadboardNI_v1.0.bit 
Running D:/Xilinx/Vitis/2020.1/bin/bootgen  -image E:/g/work/workspace/app_system/Debug/sd_card_temp/boot.bif -w -o i BOOT.BIN

16:25:54 Build Finished (took 5s.226ms)

编译成功!

<think>好的,我现在需要帮助用户解决如何在Vitis 2020.2中配置项目以创建Linux应用程序的问题。首先,我需要回顾用户提供的引用内容,看看有没有相关的信息可以直接应用。根据引用[1],用户提到了如何将Vitis AI Library应用加入Vitis进行编译,生成可执行文件。这可能涉及到Vitis中的项目设置和编译流程。另外,引用[2]和[3]讨论了使用Petalinux定制Linux系统,特别是针对ZC702和AXU2CGB开发板。这可能意味着用户在配置Vitis项目时需要关联到Petalinux生成的系统镜像或BSP包。 接下来,我需要考虑用户的具体需求:将Vitis 2020.2的应用程序从默认设置更改为适用于Linux系统的应用程序。默认情况下,Vitis可能针对裸机(Bare-metal)配置,而用户需要切换到Linux环境。因此,用户可能需要配置操作系统设置、指定BSP、调整编译选项,并处理硬件描述文件。 首先,检查创建项目时的操作系统选择。在Vitis中创建新应用项目时,用户需要选择Linux作为操作系统,而不是Bare-metal。这可能涉及到在Platform页面中选择支持Linux的平台,或者导入自定义的BSP,如引用[2]和[3]中提到的Petalinux生成的镜像。 其次,硬件描述文件(XSA)可能需要包含处理器的配置,支持Linux运行。用户需要确保在Vivado中导出的XSA文件包含足够的资源,如处理器类型、内存分配和外设配置,这些都是运行Linux所必需的。例如,ZC702开发板可能需要特定的硬件设置,如引用[2]中提到的定制板级描述文件。 然后,配置应用项目的编译设置。包括指定交叉编译工具链,如aarch64-linux-gnu-g++,这可能需要用户事先安装好Petalinux工具链,并正确设置环境变量。引用[3]中提到Ubuntu 16.04.6下使用Petalinux 2020.1,可能用户需要根据对应的版本安装工具链,并在Vitis中配置路径。 另外,用户可能需要处理文件系统和设备树。Linux应用程序可能需要访问特定的外设或文件系统结构,这涉及到在Petalinux中定制根文件系统,并将生成的文件系统镜像包含到Vitis项目中。引用[1]中提到Vitis AI Library的编译,可能还需要链接相应的库文件,并设置正确的包含路径。 最后,生成可执行文件后,用户需要将其部署到目标Linux系统,可能通过SD卡或网络启动。测试阶段可能需要确保应用程序能够正确访问硬件资源,并与Linux内核兼容。 总结步骤应该是:准备支持Linux的平台、创建应用项目时选择Linux作为OS、配置交叉编译工具链、处理硬件描述和BSP、编译并部署。同时,用户可能需要参考Petalinux的文档(如UG1144)来确保步骤正确,如引用[3]所述。 需要验证是否有遗漏的步骤,比如设备树的配置或启动脚本的设置。另外,确保用户已正确安装Vitis 2020.2和对应的Petalinux版本,并且环境变量设置正确。可能还需要指导用户如何导入自定义BSP或平台到Vitis中,或者使用Xilinx提供的现有Linux平台。</think>在Vitis 2020.2中配置Linux应用程序需遵循以下步骤: ### 1. **准备Linux系统支持环境** - 使用Petalinux生成Linux系统镜像(含根文件系统、内核和设备树),参考引用[2][^2]和[3][^3]的板级定制流程。 - 确保硬件描述文件(XSA)包含Zynq/ZynqMP处理器配置,支持Linux运行环境(如内存分配、外设驱动)。 ### 2. **创建Vitis平台项目** - 在Vitis中新建**Platform Project**,选择导出的XSA文件。 - 设置操作系统为`linux`,指定Petalinux生成的`sysroot`路径和BSP包: ```bash # 示例路径(根据实际Petalinux工程调整) sysroot = /path/to/petalinux-project/images/linux/sdk/sysroots/aarch64-xilinx-linux ``` ### 3. **配置应用项目** - 创建**Application Project**,选择刚建立的Linux平台。 - 设置交叉编译器(如`aarch64-linux-gnu-g++`),路径通常在Petalinux工具链中: ```bash # 示例工具链路径 /opt/pkg/petalinux/2020.1/tools/linux-i386/gcc-arm-aarch64/bin ``` ### 4. **调整编译选项** - 在项目属性中配置: - **C/C++ Build > Settings > GCC Cross Compiler**:包含头文件路径(如Linux内核头文件)。 - **C/C++ Build > Settings > Cross ARM Linux Linker**:链接库路径(如`-L${sysroot}/usr/lib`)。 ### 5. **集成硬件外设驱动** - 若使用自定义IP核,需在Petalinux中添加驱动支持。 - 在应用程序中通过`/dev`节点或Linux API(如`mmap`)访问硬件。 ### 6. **生成可执行文件** - 编译后,ELF文件位于`Debug`或`Release`目录。 - 通过SCP或SD卡将可执行文件传输到目标Linux系统,添加执行权限: ```bash chmod +x app.elf ``` ### 示例:添加Vitis AI Library支持 参考引用[1][^1],在编译时链接AI库: ```makefile LIBS += -lvart-runner -lopencv_core INCLUDES += -I${sysroot}/usr/include/vitis/ai ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

flysnow010

你的鼓励就是我最大的创作动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值