OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 1239|回复: 0

《DFZU2EG_4EV MPSoC开发板之嵌入式Linux 驱动开发指南》 第十章 Petalinux构建Qt和OpenCV交叉编译开发环境(上)

[复制链接]

1117

主题

1128

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
4666
金钱
4666
注册时间
2019-5-8
在线时间
1224 小时
发表于 2024-2-2 17:15:33 | 显示全部楼层 |阅读模式
本帖最后由 正点原子运营 于 2024-2-1 18:02 编辑

第十章 Petalinux构建Qt和OpenCV交叉编译开发环境

1)实验平台:正点原子 DFZU2EG_4EV MPSoC开发板

2) 章节摘自【正点原子】DFZU2EG_4EV MPSoC开发板之嵌入式Linux 驱动开发指南 V1.0


4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/fpga/zdyz-MPSOC.html

5)正点原子官方B站:https://space.bilibili.com/394620890

6)Linux技术交流QQ群:887820935

155537c2odj87vz1z9vj6l.jpg

155537nfqovl2gg9faaol9.png

如果读者用过2019.1之前的Petalinux,会知道在设置Petalinux工作环境变量后可以直接使用arm或aarch64的linux交叉编译工具链,然而此后的Petalinux版本包括我们当前使用的Petalinux在设置环境变量后只能得到裸机的交叉编译工具链,而无法获得linux交叉编译工具链,所以本章以构建Qt和OpenCV交叉编译开发环境为例讲解如何获得linux交叉编译工具链。

1.1 简介
1.1.1 Petalinux的交叉编译工具链
交叉编译是编译技术发展过程中的一个重要分支。通俗的说,交叉编译就是在一个平台上生成另一个平台上的可执行代码。这里提到的平台有两方面的含义:处理器的体系结构和所运行的操作系统。
通常,程序是在一台计算机上编译,然后再分布到将要使用的其它计算机上。当主机系统(运行编译器的系统)和目标系统(产生的程序将在其上运行的系统)不兼容时,该过程就叫做交叉编译。嵌入式系统应用的日益广泛和需求推动了交叉编译技术的发展。嵌入式系统开发,一般都是基于X86的PC平台进行,如果开发非X86的嵌入式系统,由于嵌入式系统资源的匮乏,交叉编译几乎是唯一手段。嵌入式系统中的应用程序都是通过交叉编译得到的。
我们使用Petalinux工具编译,显示Petalinux工具是带有交叉编译工具链的。设置Petalinux的工作环境后,输入“aa”,然后按TAB键,会显示当前环境中,以“aa”开头的工具和命令,包括交叉编译的工具和命令,如下图所示:                              
image001.png
图 10.1.1以“aa”开头的工具和命令
其中以aarch64开头的是aarch64的交叉编译工具链,显示的aarch64交叉编译工具链只有none,也就是裸机下的交叉编译工具链,不能编译linux,那么用于linux的交叉编译工具链是啥样的呢,如下图所示:
image003.png
图 10.1.2 用于linux的交叉编译工具链
是以aarch64-xilinx-linux开头的。如果我们想编译linux内核或linux应用就可以用其中的aarch64-xilinx-linux-gcc进行编译。既然设置Petalinux工作环境没有,那么Petalinux是怎么构建linux系统的呢?其实Petalinux在构建linux系统过程中会编译生成linux交叉编译工具链,然后使用其构建linux系统,可以在Petalinux工程下使用“find . -name"aarch64-xilinx-linux-gcc"”命令找到相应的痕迹。不过这种构建过程中编译生成的linux交叉编译工具链是不方便使用的,而且其功能完整性还不能得到保证,毕竟我们不知道Petalinux在构建完成后会怎么处理这些中间件。那么怎么才能获得实用的linux编译工具链呢?这就是本章的重点了。因为有了linux交叉编译工具链就可以摆脱对Petalinux的依赖,直接使用linux交叉编译工具链进行编译,方便快捷。
由于获取linux编译工具链需要用Petalinux构建SDK,然后安装SDK,为了避免后面开发Qt和OpenCV时重新构建安装SDK,所以本章我们就将Qt和OpenCV也打包进SDK。所谓的SDK,也就是软件开发工具集,与Petalinux构建的根文件系统息息相关,里面不仅包含有Petalinux构建的根文件系统,各种库和头文件,还包含linux交叉编译工具链,用来编译linux内核及linux应用以使其能在ZYNQ MPSoc的PS上运行。

1.1.2 Qt简介
Qt是一个跨平台的C++图形用户界面应用程序开发框架。它既可以开发GUI图形用户界面程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器 (MetaObject Compiler, moc))以及一些宏,Qt很容易扩展,并且允许真正地组件编程。
Qt是一个完整的开发框架,其目的旨在简化桌面、嵌入式和移动平台的应用程序和用户界面的创建。Qt除了可以绘制漂亮的界面(包括控件、布局、交互),还包含很多其它功能,比如多线程、访问数据库、图像处理、音频视频处理、网络通信、文件操作等。
大部分应用程序都可以使用Qt实现,除了与计算机底层结合特别紧密的,例如驱动开发,它直接使用硬件提供的编程接口,而不能使用操作系统自带的函数库。
由于Qt良好的跨平台特性,基本上不做修改就可以在Linux上实现同样的界面。Linux操作系统是嵌入式的主力军,广泛应用于消费类电子、工业控制、军工电子、电信‍/‍网络‍/‍通讯、航空航天、汽车电子、医疗设备、仪器仪表等相关行业。
除了Qt的跨平台特性和功能丰富外,笔者选择Qt的另一个原因是开源。Qt有商业版和开源版(使用GPL和LGPL开源协议),开源版Qt足以满足一般需求。关于Qt不同许可证模式和开发平台下的不同特性,可访问该网页:https://www.qt.io/cn/product/features。进入该网页后,点击左侧的选择菜单,选择对应的许可证模式和开发平台后,右侧会显示支持的特性,不支持的特性会变灰。
image004.png
图 10.1.3 Qt版本特性
开发Qt需要搭建Qt开发环境。Qt有自己的集成开发环境——Qt Creator。Qt Creator是一个跨平台的、完整的Qt集成开发环境(IDE),其中包括了高级C++代码编辑器、项目和生成管理工具、集成的上下文相关的帮助系统、图形化调试器、代码管理和浏览工具等。与常见的IDE不同的是,QtCreator本身是一个空壳,不包含编译器和Qt库,所以后面还需要配置QtCreator。
由于使用Qt的人很多,市面上关于Qt的教程也很多,入门的、深入的都有,所以本章就不浪费时间讲解如何安装Qt了,读者可自行上网搜索Qt的安装,也可阅读本章扩展阅读部分的“安装Qt”。

1.1.3 OpenCV简介
OpenCV全称 Open Source Computer VisionLibrary,是一个开源的计算机视觉库,实现了图像处理和计算机视觉方面的很多通用算法,我们可以调用它提供的各种 API 接口对图像进行算法处理,例如图像模糊处理、边缘检测、滤波以及人脸识别等相关应用场景,笔者对此并不是很了解,大家有兴趣的话可以在网上百度 get 这些知识。
OpenCV基于 BSD 协议,因此它可免费用于学术和商业用途,其提供 C++、C、Python 和 Java 接口,支持 Windows、Linux、Mac OS、iOS 和 Android 等多种操作系统。
OpenCV提供了丰富的API可简化我们对图像处理相关的编程工作,同样这些API也是封装成链接库的形式,可以是动态链接库(Dynamic linklibrary)或者静态链接库(Staticlink library);对于嵌入式Linux系统来说,我们需要通过交叉编译将OpenCV源码编译成可适用于ARM平台的链接库文件,那么如何获取适用于ARM平台的链接库文件呢?
答案是可以使用Petalinux构建,通过定制根文件系统的方式将OpenCV库添加到根文件系统中,这样就获取到了用于我们开发板的链接库文件。

1.2 定制根文件系统rootfs
前面介绍了SDK与Petalinux构建的根文件系统息息相关,这是因为SDK中包含了根文件系统,而根文件系统中又包含了我们添加的各种各样的软件库,特别是链接库,我们在电脑主机中开发编译Qt或OpenCV时就需要这些链接库。下面我们定制本章的根文件系统。
进入到第六章Petalinux设计流程实战中创建的petalinux工程目录下,然后按照6.3.2小节设置Petalinux环境变量。输入如下命令配置根文件系统:
  1. petalinux-config -c rootfs
复制代码
执行结果如下图所示:

image006.png
图 10.2.1 根文件系统配置界面
下面定制本章需要的根文件系统。(在第九章的基础上定制)
1.2.1 添加Qt
添加Qt需要对如下配置项进行配置:
  1. PetalinuxPackage Groups  --->
  2.        packagegroup-petalinux-qt   --->
  3.               packagegroup-petalinux-qt(Y)
  4.               populate_sdk_qt5(Y)
复制代码
结果如下图所示:
image007.png
图 10.2.2 添加qt
“packagegroup-petalinux-qt”中包含了linux系统使用Qt需要的基本包。移动到“packagegroup-petalinux-qt”,然后用界面下方的“< Help >”查看其含义,也可以按下键盘上的H键,结果如下图所示:
image008.png
图 10.2.3包含的Qt包
可以看到“packagegroup-petalinux-qt”中包含了Qt的基本包有哪些。“populate_sdk_qt5”表示包含Qt5主机工具链,同样可以用< Help >查看其含义。
其中的dev和dbg应该对应着开发和调试,由于没有具体说明,此处就不配置了。
对于Qt,还有一个Qt扩展“qt-extended”的包组,名为packagegroup-petalinux-qt-extended,此处笔者没有添加该包组,有需要的读者可自行添加。
1.2.2 添加OpenCV
添加OpenCV需要对如下配置项进行配置:
  1. PetalinuxPackage Groups  --->
  2. packagegroup-petalinux-opencv   --->
  3.       packagegroup-petalinux-opencv(Y)
复制代码
结果如下图所示:
image009.png
图 10.2.4 添加OpenCV
packagegroup-petalinux-opencv包含着linux系统使用opencv需要用到的基本库,可以用< Help >查看,结果如下图所示:
image010.png
图 10.2.5 packagegroup-petalinux-opencv中的包
1.2.3 添加Python
当今社会,随着深度学习及AI的兴起,使用Python的人越来越多,在根文件系统中必然不可缺少对Python的支持,添加Python需要对如下配置项进行配置:
  1. PetalinuxPackage Groups  --->
  2. packagegroup-petalinux-python-modules   --->
  3.       packagegroup-petalinux-python-modules(Y)
复制代码
结果如下图所示:
image011.png
图 10.2.6添加Python
用< Help >可以看到packagegroup-petalinux-python-modules包含如下Python工具包:
image012.png
图 10.2.7包含的Python工具包
1.2.4 添加视频工具库v4lutils(可选)
如果想使用开发板对视频进行采集开发等,可以添加视频工具库v4lutils。添加视频工具库v4lutils需要进行如下配置:
  1. PetalinuxPackage Groups  --->
  2. packagegroup-petalinux-v4lutils   --->
  3.       packagegroup-petalinux-v4lutils(Y)
复制代码
结果如下图所示:
image013.png
图10.2.8 添加多媒体库
用< Help >可以看到packagegroup-petalinux-multimedia包含如下包:
image014.png
图10.2.9包含的多媒体库
笔者未使用过,就不介绍了。
1.2.5 添加音频库audio(可选)
要想添加对音频的操作,可以添加音频库audio。添加音频库需要进行如下配置:
  1. PetalinuxPackage Groups  --->
  2. packagegroup-petalinux-audio   --->
  3.       packagegroup-petalinux-audio(Y)
复制代码
结果如下图所示:
image015.png
图10.2.10 添加多媒体库
用< Help >可以看到packagegroup-petalinux-audio包含如下包:
image016.png
图 10.2.11包含的音频工具库
由于添加音频库会使根文件系统变大、且不是每个人都需要的,所以是可选,此处介绍是让读者知道有这么个东西。
1.2.6 添加gcc编译工具链(可选)
要想在开发板上直接编译C/C++源码,可以添加gcc编译工具链,也就是packagegroup-petalinux-self-hosted,self-hosted直译就是自主机的,也就是把开发板当作主机来开发使用。添加packagegroup-petalinux-self-hosted需要进行如下配置:
  1. PetalinuxPackage Groups  --->
  2. packagegroup-petalinux-self-hosted   --->
  3.       packagegroup-petalinux-self-hosted(Y)
复制代码
结果如下图所示:
image017.png
图 10.2.12 添加编译工具链
用< Help >可以看到packagegroup-petalinux-self-hosted包含如下包:
image018.png
图 10.2.13 包含的包
packagegroup-self-hosted中包含着gcc编译工具链;对于whetstone,笔者查到的信息好像是一种性能测试工具;vim,相信不需要笔者进行介绍了,linux中一种流行的文本编辑器。
注意该包是可选的,添加会增大根文件系统的大小,需要的话可以添加。
1.2.7 添加utils工具(可选)
要想丰富根文件系统的一些常用工具,如查看cpu频率等,可以添加utils工具包,需要进行的配置如下:
  1. PetalinuxPackage Groups  --->
  2. packagegroup-petalinux-utils   --->
  3.       packagegroup-petalinux-utils(Y)
复制代码
结果如下图所示:
image019.png
图10.2.14 添加多媒体库
用< Help >可以看到packagegroup-petalinux-utils包含如下包:
image020.png
图 10.2.15包含的utils工具
1.2.8 添加网络工具(可选)
要想丰富根文件系统的网络相关方面的功能,如访问mdio寄存器等,可以添加网络栈包networking-stack,需要进行的配置如下:
  1. PetalinuxPackage Groups  --->
  2. packagegroup-petalinux-networking-stack   --->
  3.       packagegroup-petalinux-networking-stack(Y)
复制代码
结果如下图所示:
image021.png
图10.2.16 添加多媒体库
用< Help >可以看到packagegroup-petalinux-networking-stack包含如下包:
image022.png
图 10.2.17包含的网络工具
1.2.9 添加GPU库(可选)
配置rootfs来构建用于在GPU上运行图形应用程序的mali.ko。
  1. FilesystemPackages --->
  2. libs --->
  3. libmali-xlnx   --->
  4. libmali-xlnx
复制代码
结果如下图所示:
image023.png
图 10.2.18 添加GPU库
“mali-backend-defaults (x11)”表示mali的后端是x11,也可以选择其他的后端,可选的后端如下:
image024.png
图 10.2.19 默认后端选择
配置完成后,保存配置并退出。
1.3 编译根文件系统并构建SDK
使用如下命令编译刚才定制的根文件系统:
  1. petalinux-build -c rootfs
复制代码
结果如下图所示:
image025.png
图 10.3.1 编译根文件系统
Petalinux工程编译生成的根文件系统在images/linux/目录下。
构建SDK的命令如下:
  1. petalinux-build --sdk
复制代码
该命令可构建SDK并将其部署在当前Petalinux工程的images/linux/sdk.sh中。
注:笔者不推荐读者自己构建SDK,一是因为由于Petalinux本身bug的原因会出现一些ERROR,有些ERROR不好解决,二是构建SDK太耗硬盘空间。推荐使用我们提供的已经构建好的SDK文件,路径为资料盘A盘:4_SourceCode\3_Embedded_Linux\资源文件\sdk.sh。
构建时可能会出现如下图所示的错误:
image027.png
图 10.3.2 出现的错误
错误的原因是缺失了包unfs3,而且由于BB_NO_NETWORK的原因不能联网下载。如果访问错误中的网页http://petalinux.xilinx.com/sswreleases/rel-v2020/downloads/git2_github.com.unfs3.unfs3.git.tar.gz会发现也是不能下载,这可能是Xilinux在打包“下载”时可能出现的缺漏。
解决的方法也很简单,配置Petalinux工程,让其可以联网下载,命令如下:
  1. petalinux-config
复制代码
进入到Yocto Settings界面,取消使能BB_NO_NETWORK,如下图所示:
image029.png
图10.3.3取消使能BB_NO_NETWORK
保存配置并退出。
现在继续构建SDK,结果如下图所示:
image031.png
图 10.3.4 构建SDK
可以看到是将之前的ERROR变成了WARNING,并未从根本上解决问题。从编译根文件系统没问题而构建SDK有问题来看,可能是Petalinux的一个bug。定制根文件系统时添加的包越多,就越会出现一些奇怪的错误,因而推荐读者在构建SDK之前尽可能少的添加包到根文件系统中,以避免产生无法解决或很难解决的错误,在构建SDK完成后,再定制根文件系统将之前未添加的包或工具添加到根文件系统中。
注:笔者最终发现缺失的unfs3包可访问该网站进行下载:http://downloads.yoctoproject.org/mirror/sources/git2_github.com.unfs3.unfs3.git.tar.gz,将下载下来的包放到错误!未找到引用源。下,然后重新构建,问题即可解决。如果读者在构建SDK时出现其他的ERROR,请使用我们提供的已经构建好的SDK文件,路径为资料盘A盘:4_SourceCode\3_Embedded_Linux\资源文件\sdk.sh。
成功构建的SDK文件在工程的images/linux目录下,名为sdk.sh,如下图所示:
image033.png
图 10.3.5构建的SDK文件
可以看到构建的SDK文件是一个脚本文件,需要执行才能使用,也就是安装sdk。命令如下:
  1. cd images/linux/
  2. ./sdk.sh
复制代码
首先进入到当前Petalinux工程的images/linux目录下,然后执行sdk.sh进行安装,结果如下图所示:
image034.png
图 10.3.6 安装sdk
如果使用的是网盘提供的sdk.sh文件,需要先将其拷贝到Ubuntu系统中,然后执行sdk.sh进行安装。
默认是安装在/opt/petalinux/2019.2目录下,如果想安装在其他目录下,可以输入相应的路径,此处笔者保持默认,按回车键继续,结果如下图所示:
image036.png
图 10.3.7 安装sdk成功
再次确认是否将SDK安装在/opt/petalinux/2019.2目录下,默认为“Y”,也就是“是”,按回车键继续往下执行安装。等待安装完成,安装完成后提示在一个新终端中使用SDK前需要先执行“./opt/petalinux/2019.2/environment-setup-aarch64-xilinx-linux”以设置相应的环境变量,其中的“.”和source具有相同含义。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 10:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表