4. Vitis与PetaLinux开发环境搭建

Kria 智能相机与视觉边缘终端的开发,本质上是一条“主机交叉编译 + 目标板运行”的链路。KV260、KD240 这类 Kria SOM 上运行的是 Ubuntu 或 PetaLinux 构建的嵌入式 Linux,而 PL 侧的加速逻辑、AI 推理引擎、设备树覆盖层(dtbo)以及固件包(.xclbin)都需要在 x86_64 主机上编译生成。因此,本节要解决的核心问题是:在主机上把 Vitis Unified IDE 与 PetaLinux 两套工具链装好、把 BSP 与工程创建起来、把交叉编译环境配通,并能在出错时快速定位。

4.1 两套工具的分工与版本对齐

Vitis Unified IDE 是 AMD 自 2023.2 起主推的统一开发界面,它把原来的 Vitis IDE、Vitis HLS、Vivado 的硬件导出流程整合到一个基于 VS Code 内核的界面中,主要负责 PL 侧加速器开发、AI 引擎编译、平台(.xsa)导入与 xclbin 生成。PetaLinux 则是基于 Yocto 的嵌入式 Linux 构建系统,负责生成 BOOT.BIN、image.ub、rootfs、设备树与内核模块。

两者必须使用同一版本号,例如统一使用 2023.2 或 2024.1。版本错配是新手最常见的坑:用 2024.1 的 Vitis 去链接 2023.2 的 PetaLinux 生成的 sysroot,会出现 glibc 符号版本不匹配、undefined reference to `__libc_start_main@GLIBC_2.34' 之类的链接错误。安装前先确定版本,再下载对应安装包。

4.2 主机环境与安装要点

官方推荐 Ubuntu 20.04.6 LTS 或 22.04.4 LTS,内存建议 32 GB 以上(PetaLinux 构建峰值可超过 16 GB),磁盘预留 200 GB 以上。安装前先装依赖:

sudo apt update
sudo apt install -y build-essential git libncurses5-dev \
  libssl-dev zlib1g-dev libbz2-dev libreadline-dev \
  libsqlite3-dev wget curl python3 python3-pip \
  gcc-multilib g++-multilib libgtk2.0-0 libcanberra-gtk-module \
  iproute2 net-tools libncursesw5-dev texinfo chrpath \
  socat cpio python3-pexpect xz-utils debianutils \
  python3-git python3-jinja2 libsdl1.2-dev pylint3 \
  tftpd-hpa autoconf libtool rsync

Vitis 安装使用统一安装器 Xilinx_Unified_2023.2_1013_2256_Lin64.bin,运行后选择 “Vitis” 与 “Vivado” 组件,安装路径建议 /tools/Xilinx,避免路径含空格或中文。PetaLinux 是独立安装包 petalinux-v2023.2-10121855-installer.run,安装时用 --dir /tools/Xilinx/petalinux/2023.2 指定目录,安装完成后必须 source 其 settings.sh 才能使用 petalinux-* 命令。

每次打开新终端都要重新 source 环境,建议把 source 命令写入 ~/.bashrc,但注意 Vitis 与 PetaLinux 的 settings 脚本会互相覆盖部分变量,推荐在独立终端中分别使用,或写两个别名 alias sv='source /tools/Xilinx/Vitis/2023.2/settings64.sh' 与 alias sp='source /tools/Xilinx/petalinux/2023.2/settings.sh'。

4.3 BSP 获取与工程创建

Kria 官方 BSP 从 AMD 下载中心获取,例如 xilinx-kv260-starterkit-v2023.2-10121855.bsp。BSP 里已经包含硬件平台描述、预配置的 device-tree、kernel 配置与 rootfs 配方,是快速起步的最佳入口。创建工程:

petalinux-create -t project -s xilinx-kv260-starterkit-v2023.2-10121855.bsp -n kv260_cam
cd kv260_cam
petalinux-config --get-hw-description=./  # 若已有自定义 xsa 可指定路径

若不用 BSP,也可以从零创建:petalinux-create -t project --template zynqMP -n myproj,再导入 Vivado 导出的 .xsa。BSP 方式的优势是省去大量手工配置,适合先跑通再定制。

Vitis 侧则通过 vitis -w ./workspace 启动 Unified IDE,新建 Platform Component 时导入 .xsa,再新建 Application Component 选择 “Empty Application (C)” 或 “Acceleration” 模板。平台编译成功后会生成 export/ 目录,其中的 hw/ 与 sw/ 子目录就是后续 sysroot 的来源。

4.4 交叉编译环境配置

交叉编译的关键是让主机编译器找到目标板的头文件与库。PetaLinux 提供了 petalinux-build --sdk 生成 SDK 安装包,安装后得到 sysroot:

petalinux-build --sdk
petalinux-package --sysroot
# 生成 images/linux/sdk.sh,执行安装
./images/linux/sdk.sh -d /opt/petalinux/2023.2/sdk

安装后 source /opt/petalinux/2023.2/sdk/environment-setup-cortexa72-cortexa53-xilinx-linux,此时 $CC、$CXX、$SYSROOT 等变量自动就绪。用 aarch64-xilinx-linux-gcc 编译一个测试程序验证:

aarch64-xilinx-linux-gcc hello.c -o hello
file hello
# 期望输出:ELF 64-bit LSB executable, ARM aarch64

若输出为 x86-64,说明环境未生效或 PATH 被覆盖。Vitis 中则通过 Platform 的 sysroot 设置自动关联,无需手工指定,但需保证 Platform 编译时使用的 PetaLinux 版本与 SDK 一致。

4.5 常见问题排查

下面这张图把本节最容易出问题的几个环节串成一条排查路径,从环境变量、版本、sysroot 到链接与运行,按“先看现象、再定位根因”的顺序组织,便于对照使用。

Vitis / PetaLinux 环境搭建排查路径 按“环境 → 版本 → sysroot → 链接 → 运行”逐层定位 ① 环境变量未生效 petalinux-* 命令找不到 $CC 为空或指向 x86 ② 版本不一致 Vitis 2024.1 + PL 2023.2 glibc 符号版本冲突 ③ sysroot 缺失/错位 头文件找不到 库路径指向主机 /usr/lib ④ 链接失败 undefined reference cannot find -lxxx ⑤ 目标板运行异常 No such file or directory 动态库版本不匹配 对应处理措施 1 source settings.sh / environment-setup-*,确认 which aarch64-xilinx-linux-gcc echo $CC 应输出交叉编译器完整路径 2 统一 Vitis / Vivado / PetaLinux 为同一版本号,重装错配组件 检查 petalinux-config 中 Yocto 版本与 SDK 是否一致 3 petalinux-build --sdk 后执行 sdk.sh 安装,确认 $SYSROOT 指向目标板根文件系统 Vitis Platform 中检查 sysroot 路径是否指向 PetaLinux SDK 4 用 aarch64-xilinx-linux-objdump -p 检查依赖库;确认 -L 指向 sysroot/lib 运行前用 file 确认 ELF 架构为 ARM aarch64,而非 x86-64

排查时建议按顺序执行三条命令快速定位:which aarch64-xilinx-linux-gcc 确认交叉编译器是否在 PATH;echo $SYSROOT 确认 sysroot 是否指向目标板;file ./your_binary 确认产物架构。三条都正常却仍报错,再检查 Vitis Platform 与 PetaLinux 的版本号是否严格一致。

不要用主机 gcc 编译后直接拷贝到 Kria 上运行,即使侥幸能跑,也会因 glibc 版本差异在调用某些库函数时崩溃。交叉编译产物必须来自目标板对应的 sysroot。