Learning Linux(4)-开发Zynq应用程序并上板测试

一、使用SDK开发应用程序
要在Xilinx SDK上开发一个Linux应用程序并运行在ZYNQ开发板上,我们可以选择使用Xilinx SDK。
首先在创建工程时操作系统平台选择Linux,处理器核心根据开发板来选择,ZYNQ-7020使用的就是Dual ARM-Cortex A9的核心,如图所示:
在这里插入图片描述
点击next,这时候一般选择一个空的应用工程来编写自己的逻辑代码,然而这里使用hello,world示例程序,选择模板程序即可:
在这里插入图片描述
现在生成了一个简单的应用程序,如果不加默认设置,这时候工程应该已经自动编译完成了。在工程路径下会生成一个elf文件,此文件就是可在Linux系统上运行的应用程序文件。接下来可以将此文件通过FTP或者其他方式转移到开发板上,就可以在开发板上执行。
在这里插入图片描述
我这里还是使用了FTP来将hello_world.elf文件传输到了板子/home/root文件夹下,传输完成之后给这个.elf文件赋予执行权限之后,使用./hello_world.elf执行。结果如下,可以看到执行成功:
在这里插入图片描述
二、使用Petalinux开发应用程序
进入到工程目录下,使用petalinux-create命令行来创建应用程序工程。输入以下命令行:

# 使用petalinux-create创建一个名为test的应用工程,使用的工程语言是c
# 这些用法可以在petalinux-create --help中查询到
# 工程名称不建议使用大写字母和下划线
petalinux-create -t apps -n test --template c

执行之后会给出这个工程所在的文件夹绝对路径,如下所示:
在这里插入图片描述
进入到此文件夹中,下面有自动生成的一个名为files的文件夹,下面有<工程名>.c文件,我们的核心应用逻辑代码也在此完成。
在这里插入图片描述
打开源文件查看源代码:
在这里插入图片描述
修改无误后保存退出。
回到工程目录下,准备编译整个项目,使用以下命令来编译整个工程:

# 编译工程, -c指定要编译的组件,这里就是我们的应用工程,-x是执行的具体动作
# 这里就是编译动作:do_compile
# petalinux-build -c <工程名> -x do_compile
petalinux-build -c test -x do_compile

在这里插入图片描述
接下来我们要找到此应用程序的位置,这个位置是这样的:

# 找到生成的应用工程
cd build/tmp/work/cortexa9hf-neon-xilinx-linux-gnueabi/<应用工程名>/1.0-r0

此文件夹下面有一个可执行文件test,这就是生成的可执行文件,这个文件可以直接转移到开发板上来执行:
在这里插入图片描述
转移的时候可以使用scp命令,这个是使用SSH完成远程安全拷贝的命令:
在这里插入图片描述
使用以下指令完成文件远程拷贝:

# 格式为scp <要拷贝的工程名>  <开发板系统登录名>@<开发板ip地址>:<要拷贝到的开发板目标路径>
# 对于我的工程,命令为
scp test [email protected]:/home/root

这个方法还需要在开发板上运行SSH服务,如何配置网络使得ubuntu能够ping通开发板也需要额外的步骤,我个人当时查了很多东西做了很久,如果是做Zynq开发的话非常不推荐用这种方式。而且xilinx SDK的界面也更加友好,没必要非在ubuntu下用petalinux开发应用逻辑代码。
所以这两个开发方法相比,我还是更倾向于使用xilinx SDK来做。

三、使用NFS服务(网络文件系统)来远程执行可执行文件
我们在ubuntu机器上建立一个网络文件系统,在开发板上使用mount来通过网络挂载这个文件系统之后,开发板就可以像访问自己的文件系统一样去访问ubuntu文件系统,从而实现了执行可执行文件的目的。
1.在ubuntu上搭建NFS服务
执行下面的命令来安装NFS服务:

# 安装NFS服务
sudo apt-get install nfs-kernel-server

2.创建一个目录,此目录将作为NFS的目录,将来会被开发板挂载到自己的根文件系统下:

# 在家目录下创建一个文件夹
mkdir ~/nfs

3.打开NFS配置文件,在文件最后加入一些配置信息:

# 打开NFS配置文件
sudo vim /etc/exports

在文件末尾加入以下的信息:

# <要挂载的文件夹路径> * (rw,sync,no_root_squash)
# *代表允许所有的网络段访问
# rw 是可读写权限
# sync 是文件同步写入存储器
# no_root_squash 是 nfs 客户端分享目录使用者的权限
/home/zheyuan/nfs *(insecure,rw,sync,no_root_squash,no_all_squash)

在这里插入图片描述
使用以下命令使得上述更改生效:

# 使上述配置生效
sudo exportfs -rv

4.重启nfs服务,使得上述更改生效:

扫描二维码关注公众号,回复: 13129884 查看本文章
# 重启客户端
sudo service nfs-kernel-server restart

5.将可执行文件拷贝到nfs文件夹下

# 假设现在已经在生成的可执行文件所在的文件夹下
cp test ~/nfs

6.在开发板上挂载NFS文件夹

# 此命令是在开发板上执行的,通过串口发送
mount -t nfs -o nolock 192.168.0.109:/home/zheyuan/nfs /mnt

挂载完成之后可以通过nfs直接在开发板上执行此程序,可以看到执行成功:
在这里插入图片描述
注意,我在使用NFS时,出现了Permission Denied的报错,这种情况可能是配置文件中的共享文件夹路径出错,也有可能是在开发板上执行的挂载命令出错,检查之后如果没有解决,请尝试为共享的文件夹赋予完全的权限,对于我来说是这样的:

chmod 777 ~/nfs

四、使用petalinux自带的交叉编译工具编译应用代码
除了上述的使用xilinx SDKpetalinux开发应用程序,使用FTP,或者使用scp命令,或者使用NFS直接执行可执行文件的方式之外。我们还可以使用自主的编辑器(vim,VS Code)来编写代码,并使用petalinux提供的交叉编译工具来编译我们的代码,最后将生成的可执行文件通过上述三种方法转移到开发板上执行。

使用vim编辑一个hello,world示例程序:

# 建立一个源文件并编辑
touch hello.c
# 使用交叉编译工具来编译之,生成名为hello的可执行文件
arm-linux-gnueabihf-gcc hello.c -o hello

在这里插入图片描述
最后将这个文件转移到开发板上执行,或者使用NFS直接执行即可。

五、一个小的总结
经过这段时间对Zynq开发的粗浅学习,我觉得大致我对工程的开发流程有了一点自己的大致把握,当然这以后还需要很多的细化。
1.对于加速器的开发,首先是分析热点代码,然后是根据热点代码设计合适的加速器结构,这是整个设计的核心。随后可以采用HLS或HDL来描述加速器的构造和接口,生成IP核并打包。
2.在vivado中完成IP核的集成和硬件系统的设计,生成比特流文件。
3.此后使用vivado中生成的hdf文件来初始化和配置自定义的petalinux工程,编译生成image.ub,这个镜像中集成了内核镜像、根文件系统和设备树信息,这些信息是开发者高度定制的。
4.对于BOOT.bin这样一个启动镜像,既可以选择使用Xilinx SDK来生成,也可以使用petalinux来生成,这个镜像中集成了包括FSBL、比特流文件、U-BOOT等重要信息,在启动时就会将PL端逻辑进行配置。
5.执行到此,应该说已经成功搭建了一个Linux系统,这个系统烧录到SD卡上已经可以用来启动开发板并配置FPGA了,但是我们还有应用程序没有编写,这部分所谓应用程序其实也就是运行在PS端的主控逻辑。它描述了如何调用FPGA,要完成怎样的功能等等。编写应用程序代码都是在之前搭建的Linux系统上完成的,完全不需要再考虑硬件和驱动上的细节,也就不再需要传统嵌入式开发中的BSP中所提供的种种API了。
6.最后就是这篇博客上面的内容,如何去开发应用程序,如何生成.elf并将其上传到开发板上去执行,这篇博客已经做了详细叙述。

猜你喜欢

转载自blog.csdn.net/zzy980511/article/details/113069757