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。
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触发加去抖和光耦隔离,避免误触发。
五、应用程序部署与结果观察
裸机程序编译生成.elf后,可通过JTAG下载到DDR运行,也可转换为BOOT.BIN放入QSPI或SD卡实现上电自启动。Linux应用则直接复制到根文件系统,通过串口终端或SSH执行。部署后应观察:串口是否打印预期启动信息、GPIO输出是否驱动相机触发、SD卡能否正确读写图像文件、以及图像帧率是否满足工业节拍。若UART无输出,先检查波特率和引脚约束;若GPIO无动作,检查XGpio_SetDataDirection是否把对应位设为输出;若SD挂载失败,确认文件系统格式为FAT32且分区表正确。
掌握Vitis工程创建、BSP裁剪、交叉编译与PS外设驱动后,后续即可把图像采集、预处理和通信任务分别映射到PL与PS,形成完整的工业视觉处理链路。