4. Vitis统一软件平台与PS端裸机/ Linux开发

在Zynq工业视觉平台中,PL端负责图像采集、预处理与高速接口,而PS端承担系统控制、外设管理、网络通信与上层应用调度。Vitis统一软件平台把硬件平台(XSA)、板级支持包(BSP)、交叉编译工具链和应用工程整合到同一工作空间中,使裸机与Linux两种开发模式都能围绕同一份硬件描述展开。理解Vitis工程创建、BSP配置、工具链选择、PS外设驱动和部署流程,是后续把视觉算法真正落到板卡上运行的前提。

一、从XSA到Vitis工程:硬件与软件的衔接点

Vivado完成Block Design、约束与综合实现后,导出包含PS配置、PL地址映射和时钟信息的XSA文件。Vitis新建平台工程时导入该XSA,平台会自动识别PS端的UART、GPIO、SD、DDR等外设,并生成对应的硬件描述。随后在平台上创建应用工程,选择standalone(裸机)或linux域。裸机域适合启动流程验证、外设寄存器级调试和实时性要求明确的小型控制任务;Linux域适合需要文件系统、网络协议栈和多进程调度的视觉应用。两者可以共用同一平台,但BSP和编译选项不同。

工程创建时需注意三个关键选择:处理器核(通常为psu_cortexa53_0或ps7_cortexa9_0)、操作系统域(standalone/linux)以及语言(C/C++)。对于工业视觉平台,若后续要跑OpenCV或深度学习推理,建议直接建立Linux域应用工程,并在BSP中启用lwip或libmetal等必要库;若只是验证PL寄存器读写,则裸机工程更轻量。

二、BSP配置:外设驱动与库的裁剪

BSP是Vitis为特定硬件平台生成的驱动与库集合。打开platform → Board Support Package可看到psu_uart_0、psu_gpio_0、psu_sd_0等外设驱动,以及xil_printf、xil_cache、lwip等可选库。配置时重点检查:UART波特率是否与板级终端一致(工业现场常用115200)、GPIO是否启用中断、SD控制器是否配置为SD 4-bit模式、DDR是否与硬件一致。若使用Linux域,BSP主要提供设备树和内核启动参数,驱动由内核自带,此时应确认system.dtb中UART、GPIO、SD节点状态为okay。

BSP修改后必须重新生成(Rebuild),否则应用工程仍链接旧驱动。裸机工程中若出现undefined reference to XGpio_Initialize,通常是没有把xgpio库加入BSP或未包含头文件路径。

三、交叉编译工具链与构建流程

Vitis内置GNU交叉工具链:裸机使用aarch64-none-elf-gcc(Zynq UltraScale+)或arm-none-eabi-gcc(Zynq-7000),Linux使用aarch64-linux-gnu-gcc。在应用工程的C/C++ Build Settings中可查看实际调用路径。典型裸机编译命令如下:

aarch64-none-elf-gcc -Wall -O2 -I${BSP}/include \
  -c main.c -o main.o
aarch64-none-elf-gcc -T lscript.ld main.o -o app.elf \
  -L${BSP}/lib -lxil -lxgpio -lxiicps -lxsdps

链接脚本lscript.ld决定代码段、数据段和堆栈在DDR中的位置。工业视觉应用中若图像缓冲区较大,需在链接脚本中预留足够heap和stack,否则运行时会因内存不足而异常。Linux应用则通过make或Vitis的Linux Application模板生成.elf或可执行文件,部署时复制到根文件系统即可。

四、PS端外设驱动:UART、GPIO与SD卡

裸机下UART驱动通过XUartPs_Send发送调试信息,初始化时需设置XUartPs_SetBaudRate。GPIO常用于控制工业相机触发、光源开关或读取限位信号,使用XGpio_SetDataDirection配置方向,XGpio_DiscreteWrite输出电平。SD卡驱动XSdPs支持FATFS文件系统,可挂载0:/并读写图像文件。Linux下这些外设以设备节点形式出现:/dev/ttyPS0对应UART,/dev/gpiochip0配合libgpiod操作GPIO,SD卡挂载到/mnt/sd。工业现场建议对GPIO触发加去抖和光耦隔离,避免误触发。

Vitis 工程创建 → BSP 配置 → 交叉编译 → PS 外设驱动 → 部署 Vivado 硬件平台 Block Design 导出 .xsa XSA Vitis 平台工程 导入 XSA 识别 PS 外设 生成硬件描述 standalone 域(裸机) aarch64-none-elf-gcc linux 域(Linux) aarch64-linux-gnu-gcc BSP 配置 UART 115200 GPIO 中断使能 SD 4-bit 模式 lwip / libmetal PS 端外设驱动与访问方式 UART 裸机:XUartPs_Send Linux:/dev/ttyPS0 GPIO 裸机:XGpio_DiscreteWrite Linux:libgpiod / gpiochip0 SD 卡 裸机:XSdPs + FATFS Linux:/mnt/sd 驱动库 应用程序部署与运行 裸机:JTAG 下载 .elf 到 DDR,或 QSPI/SD 启动 Linux:复制可执行文件到 rootfs,通过串口/SSH 启动 观察点:串口打印、GPIO 电平、SD 文件读写、图像帧率 链接生成 交叉工具链 aarch64-none-elf aarch64-linux-gnu lscript.ld 链接 结果判断 串口有输出 GPIO 电平翻转 SD 文件可读

五、应用程序部署与结果观察

裸机程序编译生成.elf后,可通过JTAG下载到DDR运行,也可转换为BOOT.BIN放入QSPI或SD卡实现上电自启动。Linux应用则直接复制到根文件系统,通过串口终端或SSH执行。部署后应观察:串口是否打印预期启动信息、GPIO输出是否驱动相机触发、SD卡能否正确读写图像文件、以及图像帧率是否满足工业节拍。若UART无输出,先检查波特率和引脚约束;若GPIO无动作,检查XGpio_SetDataDirection是否把对应位设为输出;若SD挂载失败,确认文件系统格式为FAT32且分区表正确。

工业现场部署时,PS端外设驱动需考虑电磁干扰与热插拔保护。GPIO触发线建议加光耦隔离,SD卡座选用带锁紧结构,UART调试口保留但避免长期暴露在强干扰环境中。

掌握Vitis工程创建、BSP裁剪、交叉编译与PS外设驱动后,后续即可把图像采集、预处理和通信任务分别映射到PL与PS,形成完整的工业视觉处理链路。