4、Vitis统一软件平台入门:Vitis IDE安装与工作空间设置、创建Hello World应用工程、编译与下载运行
好,咱们进入第4章。从这一章开始,你就要真正动手了。前面几章我们把Zynq的硬件架构、开发流程捋了一遍,算是纸上谈兵。现在,我们要把Vitis这个武器装好,然后跑通第一个程序。
Vitis是什么?说白了,它就是Xilinx新一代的统一软件开发平台。以前我们做Zynq开发,要装SDK(Software Development Kit),后来升级到Vitis。它把嵌入式软件开发、FPGA逻辑开发、AI推理加速全揉到一起了。我个人觉得,Vitis最大的变化是编辑器换成了基于Eclipse的IDE,调试功能更强,而且支持用C/C++直接开发PL端的加速器。
嗯,咱们这一章的目标很明确:装好Vitis,建个Hello World工程,下载到板子上跑起来。别小看这一步,这是你整个嵌入式开发流程的“点火”动作。
- Vitis IDE的安装与许可配置
- 工作空间(Workspace)的概念与设置
- 基于板级支持包(BSP)创建Hello World工程
- 编译、链接与生成可执行文件
- 通过JTAG下载并运行在Zynq的ARM Cortex-A9上
4.1 安装Vitis IDE——别踩这些坑
安装Vitis其实不复杂,但有几个地方容易出问题。我先把步骤列出来,然后说几个我踩过的坑。
| 步骤 | 操作内容 | 注意事项 |
|---|---|---|
| 1 | 从Xilinx官网下载Vitis Unified Software Platform安装包 | 建议下载“All OS”单文件安装包,约20GB+ |
| 2 | 运行安装程序,选择“Vitis”组件 | 不要只选“Vivado”,Vitis是独立选项 |
| 3 | 选择安装目录(建议纯英文路径) | 路径中不要有空格或中文 |
| 4 | 安装USB驱动(Windows需要) | 用于JTAG调试器(如Digilent Cable) |
| 5 | 配置FlexLM许可证 | 可以申请免费Node-Locked License |
- 路径问题:我第一次安装时把Vitis放在了“Program Files (x86)”下,结果编译时老是报路径解析错误。后来改成“C:\Xilinx\Vitis”就没事了。
- 驱动问题:Windows 10/11需要手动安装“Cable Drivers”,否则JTAG连不上。安装程序里有个“Install Cable Drivers”的勾选框,千万别漏掉。
- 许可证问题:Vitis需要单独的Vitis许可证,Vivado的许可证不通用。去Xilinx官网申请一个“Vitis Core Development Kit”的免费Node-Locked License就行。
4.2 工作空间(Workspace)——你的工程大本营
启动Vitis后,第一个弹窗就是选择Workspace。Workspace说白了就是一个文件夹,用来存放你的所有工程、编译产物和设置。我个人习惯把Workspace放在一个独立的、空间充足的盘符下,比如“D:\Zynq_Workspace”。
为什么要单独设置?你想想看,Vitis每次编译都会生成大量中间文件,如果放在C盘,用不了多久就会爆满。而且,不同项目最好用不同的Workspace,避免工程文件互相干扰。
- 每个大项目建一个独立的Workspace
- Workspace路径不要有中文和空格
- 勾选“Use this as the default and do not ask again”可以跳过下次弹窗
- 如果Workspace里的工程太多,启动会变慢,定期清理不用的工程
4.3 创建Hello World应用工程
好,现在开始动手。假设你已经有了Vivado导出的硬件平台文件(.xsa),或者直接用Vitis自带的模板。我们一步步来。
- 启动Vitis,选择或新建一个Workspace。
- 点击菜单栏 File → New → Application Project。
- 在弹出的对话框中:
- 输入工程名:
hello_world - 点击 Next
- 输入工程名:
- 选择硬件平台:
- 如果已有.xsa文件,点击 Browse 选择它
- 如果没有,可以选择 Create a new platform from hardware (XSA) 或者使用空模板
- 选择模板:在模板列表中选择 Hello World,然后点击 Finish。
Vitis会自动生成工程结构,包括BSP(板级支持包)、链接脚本和main.c文件。你打开 src/helloworld.c,会看到类似这样的代码:
#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
int main()
{
init_platform();
print("Hello World\n\r");
xil_printf("Hello from Vitis!\n\r");
cleanup_platform();
return 0;
}
嗯,这里要注意:print() 和 xil_printf() 都是Xilinx提供的轻量级打印函数,它们通过UART输出。如果你的板子没有接串口,或者串口驱动没配好,是看不到打印信息的。我在项目中就遇到过这个问题,折腾了半天才发现是串口线没插紧。
4.4 编译工程——生成.elf文件
代码写好了,接下来要编译。Vitis的编译操作很简单:
- 在工程上右键 → Build Project
- 或者直接按快捷键 Ctrl+B
编译过程会依次执行:
- 编译BSP库(驱动、板级初始化代码)
- 编译用户代码(main.c等)
- 链接生成可执行文件(.elf)
编译完成后,你可以在 hello_world/Debug/ 目录下找到 hello_world.elf 文件。这就是我们要下载到板子上的二进制文件。
| 错误信息 | 原因 | 解决方法 |
undefined reference to `init_platform' |
BSP未正确生成或未链接 | 右键BSP工程 → Regenerate BSP Sources |
cannot find -lxil |
库路径错误 | 检查BSP的链接设置,确保libxil.a存在 |
multiple definition of `main' |
工程中有多个main函数 | 检查源文件,只保留一个main |
4.5 下载与运行——看到Hello World
编译通过后,就可以下载到板子上运行了。前提是你的开发板已经通过JTAG(比如Digilent JTAG-HS3)连接到电脑,并且上电。
- 在工程上右键 → Run As → Launch on Hardware (Single Application Debug)
- Vitis会自动连接开发板,下载.elf文件到DDR中
- 程序开始运行,输出会显示在Vitis的 Console 窗口中
如果你连接了串口(UART),也可以用串口助手(如Putty、MobaXterm)查看输出。波特率通常为115200。
- 如果下载失败,检查JTAG驱动是否安装,以及板子是否上电
- 可以在
main()中加个延时循环,方便观察 - 使用 Debug As → Launch on Hardware 可以单步调试,设置断点
当你看到Console里打印出“Hello World”和“Hello from Vitis!”时,恭喜你,你的第一个Zynq嵌入式程序跑通了!
总结一下这一章的关键点:
- Vitis安装时注意路径、驱动和许可证
- Workspace是工程容器,建议独立存放
- Hello World工程依赖BSP,BSP由硬件平台文件生成
- 编译生成.elf,通过JTAG下载到板子运行
- 串口输出是验证程序运行的最直接方式
嗯,这一章的内容就到这里。你可能会觉得,折腾半天就为了看个“Hello World”,是不是太简单了?其实不然。这个流程涵盖了从工程创建、编译、下载到运行的全链路,后面所有复杂的项目都是在这个基础上搭建的。把这个流程跑通,后面的路就好走了。