第三章 Vitis项目创建与工程结构
好,咱们今天来聊聊Vitis的项目创建。说实话,很多初学者一上来就被Vitis的工程结构搞晕了——平台工程、应用工程,到底什么关系?我刚开始接触时也绕了不少弯路。今天我就把这块掰开了讲清楚。
3.1 创建Vitis平台工程
平台工程是什么?说白了,它就是你的硬件“底座”。你想想看,FPGA上跑程序,总得知道硬件长什么样吧?有多少内存?用什么接口?时钟多快?这些信息都打包在平台里。
创建平台工程的步骤其实不复杂:
- 打开Vitis,选择Create Platform Project
- 指定从硬件描述文件(XSA)导入
- 选择你的XSA文件——这个文件是从Vivado导出的
- 配置操作系统(比如裸机或Linux)
- 点击Finish,等着编译完成
平台工程编译完成后,你会看到几个关键输出:
- psv_cortexa72_0 —— 处理器相关的配置
- standalone —— 裸机运行时库
- zynqmp_fsbl —— 第一级启动引导程序
3.2 创建应用工程
平台工程建好了,接下来就是写真正的应用程序了。应用工程是跑在平台之上的——它依赖平台提供的硬件抽象层。
创建应用工程的流程:
- 在Vitis里选择Create Application Project
- 选择刚才建好的平台工程作为目标平台
- 给你的应用取个名字(比如image_capture_demo)
- 选择模板——如果是图像采集,我建议从空工程开始
- 配置编译选项,比如优化级别、链接脚本等
关键点:应用工程和平台工程是分离的。这意味着你可以换平台而不改应用代码——当然,前提是你代码写得够抽象。
3.3 理解工程目录结构
建好工程后,你会看到一堆文件夹。别慌,我来给你拆解一下:
| 目录/文件 | 作用 |
|---|---|
src/ |
你的源代码放这里,包括.c和.h文件 |
_ide/ |
IDE的配置文件,一般不用手动改 |
Debug/ 或 Release/ |
编译输出目录,可执行文件在这里 |
platform/ |
引用的平台工程,只读的 |
lscript.ld |
链接脚本,定义内存布局 |
Makefile |
编译规则,Vitis自动生成 |
我个人习惯把源文件按功能分文件夹,比如drivers/、algorithms/、main/。这样工程大了也好找。
3.4 编译与下载流程
编译和下载是整个流程里最容易出问题的地方。我按步骤来说:
编译步骤
- 右键点击应用工程,选择Build Project
- Vitis会先编译平台工程(如果没编译过)
- 然后编译你的应用代码
- 最后链接生成.elf文件
下载步骤
- 连接开发板,上电
- 在Vitis里选择Run As → Launch on Hardware
- Vitis会自动下载比特流(如果硬件有变化)
- 然后下载你的.elf文件到DDR里运行
这里有个细节:第一次下载时,Vitis会先下载FSBL(第一级启动引导程序),然后才是你的应用。FSBL负责初始化DDR、配置MIO等。我遇到过FSBL配置不对导致程序跑飞的情况,后来发现是时钟频率设错了。
3.5 知识体系结构图
下面这张图把整个流程串起来了,你一看就明白:
从图上你能看到,整个流程是串行的——Vivado出硬件,Vitis建平台,然后写应用,最后编译下载。每一步都依赖上一步的输出。
3.6 避坑指南
最后,我分享几个实战中遇到的坑:
- 链接脚本不对:默认的lscript.ld可能不适合你的应用。比如图像采集需要大内存,你得手动改DDR的起始地址和大小。
- BSP库没选全:用到了某个驱动但没在BSP里勾选,编译不报错,运行就崩。我曾经因为这个查了三天。
- 平台工程没重新编译:改了硬件后,一定要重新编译平台工程。Vitis有时候不会自动检测变化。
总结一下:创建Vitis项目其实就三步——建平台、建应用、编译下载。但每一步都有细节,尤其是平台和应用的关系要搞清楚。你想想看,平台是硬件抽象,应用是具体逻辑,两者解耦才能灵活开发。
好了,这一章就到这里。记住我说的那些坑,你实际做项目时能省不少时间。