时间:2019.1.26
最近接触在ARM平台上的嵌入式开发,选择了Linux作为宿主机,直接装了Ubuntu16.04的双系统,没有在windows下装虚拟机。上一篇文章实现了最简单的嵌入式编程,勉强算是摸到了入门开发的门槛。但是在宿主机编译,通过u盘拷贝程序运行的运行方式显然是极其低效的。
更好的方案是使用nfs将开发板上的某个目录挂载到宿主机上,使得二者可以在形式上共享某个目录,宿主机在这个目录编译程序,目标机在这个目录测试可执行文件,免去了很多麻烦。
开发IDE选择的是跨平台的QT,对于嵌入式开发来说,QT分为三个版本(参考:https://www.aliyun.com/jiaocheng/137939.html):
第一种是在linux系统上编译完后仍然在linux系统上运行的,称为x11版本(至于为什么叫x11,这是因为linux系统的应用程序与视窗程序之间是通过X窗口系统的X11协议进行交互,所以称之为x11系统。具体请自行百度);
第二种是在linux系统上编译完后转移到arm平台上运行的,称为Embeded arm版本,编译完后的文件必须烧录到arm处理器上运行,在PC端无法运行;
第三种称之为Embeded x11版本,也叫做qvfb版本。这里要解释一下,如前所述,lixnu的应用程序是以X11协议(X窗口系统)输送到屏幕显示界面的,X server负责图形显示,应用程序负责计算、修改数据,两者基于某种协议通信。对于嵌入式linux,qt应用程序同样也需要一个窗口系统才能显示,但是嵌入式linux系统不能使用X11(太耗资源了),奇趣公司就专门开发了一个qws(QT windows system), 应用程序按照协议向qws发送数据,服务端负责显示数据。换句话说,qvfb就是qws的显示设备。不过要注意的是,embeded x11版并不是我们的开发板最终使用的Qt库,编译这个版本只是为了方便我们调试, 先在PC中仿真运行,看看界面,不必下载到开发板的文件系统中运行,两者的运行效果除了界面基本相同,其他方面还是有差异的。
经过上述分析可以看出,其实,我们做嵌入式开发,只需要涉及到后面2种版本,第一种版本的只有桌面应用程序开发的人才需要使用。而对于后面2个版本,严格来说只需编译Embeded arm版本的程序就好,因为它才是最终在arm平台上运行的版本。但是,如果只编译Embeded ARM版本的话,每次编译完都得下载到开发板上去运行才能看到效果,开发过程太过麻烦,因此我们才需要引入Embeded x11版本,借助于PC端的显示系统,快速完成界面部分的调试。所以,综合起来可以这么说,编译x11 版本的目的是为了方便学习Qt,编译Embeded x11是为了体验仿真效果,编译Embeded ARM版本才是为了完成嵌入式程序开发。
为达到这个目的,需要做几方面工作:
1、完成开发板与宿主机的网络连接
2、实现nfs工作目录共享
3、编译Qt源码
4、编译qvfb
5、安装QtCreator
6、配置与测试
下面分别记录我的实现过程:
实现过程中参考了 EasyARM-iMX28xx Linux开发指南 20150901 V1.03
我的Linux主机与ARM开发板用网线直连,ARM板执行ifconfig后原本没有激活对外的网卡:
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
开发套件的以太网接口为 eth0,通过 ifconfig 命令可以查看或者设置网卡的 IP 地址,将地址设置为192.168.100.200
ifconfig eth0 192.168.100.200
查看eth0的网络状态:
ifconfig eth0
eth0 Link encap:Ethernet HWaddr 02:00:92:B3:C4:A8
inet addr:192.168.100.200 Bcast:192.168.100.255 Mask:255.255.255.0
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Base address:0x8000
同样设置宿主机的有线网IP 为192.168.100.100 此时需要超级用户权限
我的网卡叫enp6s0
sudo ifconfig enp6s0 192.168.100.100
这时候二者已经在同一个网段中,可以正常通信了。为测试网络状况可以相互ping一下试试。
但是通过这种方法设置的网络在系统重启后会重置,一劳永逸的方法是在系统的配置文件里写好。对于宿主机的静态IP配置请移步参考我的另一篇文章 https://blog.csdn.net/zywvvd/article/details/86667592
对于开发板来说(我的是EasyARM-i.MX28xA)设置静态IP 可以在开机自动启动的程序目录中加入IP配置,在/etc/rc.d/init.d/start_userapp 文件增加网络配置命令:
ifconfig eth0 192.168.100.200
route add default gw 192.168.100.1
两边都设置好之重启过后,网线一连就可以随便通信了。
NFS 即网络文件系统(Network File-System),可以通过网络让不同机器、不同系统之间可以实现文件共享。通过 NFS,可以访问远程共享目录,就像访问本地磁盘一样。
sudo apt-get install nfs-kernel-server #安装 NFS 服务器端
sudo apt-get install nfs-common #安装 NFS 客户端
安装完 NFS 服务器等相关软件后,需要指定用于共享的 NFS 目录,其方法是在
“/etc/exports”文件里面设置对应的目录及相应的访问权限,每一行对应一个设置。下面介
绍如何添加 NFS 共享目录。
在终端输入“sudo gedit /etc/exports”指令
若需要把 /home/vvd/nfs 目录设置为 NFS 共享目录,请在该文件末尾添加下面的一行:
/home/vvd/nfs *(rw,sync,no_root_squash)
保存并退出。
新建共享目录nfs,设置最宽松的权限:
sudo mkdir nfs
sudo chmod 777 nfs
sudo chown nobody nfs
为了方便测试 NFS 是否挂载成功,在“/nfsroot”目录下创建 Test 目录用于测试。
sudo /etc/init.d/nfs-kernel-server start
执行如下命令则可以重新启动 NFS 服务,也可以通过重启 ubuntu 来实现:
sudo /etc/init.d/nfs-kernel-server restart
在 NFS 服务已经启动的情况下,如果修改了“/etc/exports”文件,需要重启 NFS 服务,以刷新 NFS 的共享目录。当然在下一次启动系统时,NFS 服务是自动启动的。
可以先在本机测试,尝试将/home/vvd/nfs 目录挂载到另外一个目录/mnt下:
sudo mount -t nfs 192.168.xxx.xxx:/home/vvd/nfs /mnt -o nolock
没有报错即为挂载成功,此时在/mnt目录下可以看到test文件夹;
使用开发套件进行挂载测试,此时需要在开发套件上输入如下指令:
mount –t nfs 192.168.100.100:/home/vvd/nfs /mnt –o nolock
此时在开发板中的/mnt目录里可以看到test文件夹,说明搭建成功。之后我们可以将编译好的开发板可执行文件放入/home/vvd/nfs文件夹中,在开发板的/mnt目录里运行。
参考:https://blog.csdn.net/weixin_40385285/article/details/80165960
下载qt-everywhere-opensource-src-4.8.6
https://www.xuebuyuan.com/1162921.html
解压缩成三份,分别命名为qt-pc,qt-qvfb,qt-arm
这个是正常电脑桌面版的QT
进入qt-pc目录,执行如下操作:
#./configure
# make
# make install
编译过程中出现的问题:
若出现:QTmake:arm-linux-g++:Command not found
参考:https://www.xuebuyuan.com/1162921.html
出错:Basic XLibfunctionality test failed!
这个错误主要是因为,XLib库没有安装,所以在编译X11平台时,应该保证,以下命令正确执行:sudo apt-get install libx11-dev libxext-dev libxtst-dev
注意:可以使用 make confclean 命令 把以前的配置信息清除掉,然后再重新配置。
这个版本的QT用来在qvfb环境中模拟开发板运行程序
进入qt-qvfb目录,执行如下操作:
# ./configure -embedded x86 -qt-gfx-qvfb -qt-kbd-qvfb -qt-mouse-qvfb
# make
# make install
编译安装PC版中的 qvfb:
进入qt-pc/tools/qvfb/目录,执行如下操作:
#make
编译完毕,将qt-pc/bin目录下的qvfb文件复制到/usr/local/Trolltech/QtEmbedded-4.8.6/bin目录。
编译qvfb时,一般会出现很多错误,解决办法请见
https://blog.csdn.net/weixin_40385285/article/details/79760970
注:qvfb为模拟arm输出环境,可先在pc端进行qvfb测试,然后再拷贝到arm板上,运行结果相同
这个是为开发板准备的专用编译器,编译出的文件只能在开发板运行
进入qt-arm目录,执行如下操作:
sudo ./configure -prefix /usr/local/Trolltech/QtEmbedded-4.8.6-arm -shared -release -opensource -little-endian -embedded arm -no-qt3support -lrt -xplatform qws/linux-arm-g++
一般情况下会出现错误,具体解决办法可参考下述网站:
https://blog.csdn.net/cyf15238622067/article/details/53542049
安装完成后,在/usr/local/Trolltech目录中有三个文件夹:Qt-4.8.6、QtEmbedded-4.8.6-i386、QtEmbedded-4.8.6-arm。
参考:https://www.aliyun.com/jiaocheng/137939.html
qt-qvfb的版本需要在qvfb环境下运行,此时我们还没有qvfb环境,需要编译生成。
进入qt-pc版的目录,在其中:
cd tools/qvfb
make
编译qvfb出错:X11/extensions/XTest.h:没有那个文件或目录
https://blog.csdn.net/makuiyu/article/details/7019020
make完后,会在qt-pc/bin目录下生成一个qvfb的可执行文件。将该文件拷贝到 /usr/local/Trolltech/Qt-4.8.6/bin目录。
将qvfb加入系统目录中:
sudo gedit /etc/profile
在文件末端加入:
export QTDIR=/usr/local/Trolltech/Qt-4.8.6
export PATH=$QTDIR/bin:$PATH
export MANPATH=$QTDIR/man:$MANPATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
配置文件生效后即可以随时使用qvfb命令了,可以执行:
qvfb -width 400 -height 400
来测试以下,然后就出来了个黑框框,想要进一步测试的话不要急着关闭,用QT自带的示例程序测试qvfb执行程序的情况。
cd /usr/local/Trolltech/QtEmbedded-4.8.6-i386/examples/widgets/calculator
./calculator -qws
运行qvfb程序需要在后面加上 -qws 参数,然后在刚才的qvfb窗口里就会出现一个计算器~
qvfb完成。
说道QtCreator的安装有些惭愧,我现在还没弄明白新版的Qt如何用不同的编译器编译代码,暂且把现在的成果记下来,如过有大神了解相关的内容烦请不吝赐教~
安装了Qt5.12.0 和Qt4.4.1 不知道咋用,退回到了qt-creator-linux-x86_64-opensource-2.5.2.bin
https://www.aliyun.com/jiaocheng/137939.html
使用终端cd到你刚刚存放QtCreator的临时目录,修改bin文件的权限使其具有可执行的权限:
chmod a+x qt-creator-linux-x86_64-opensource-2.5.2.bin
然后输入以下命令安装bin文件:
./qt-creator-linux-x86_64-opensource-2.5.2.bin
就会出现仿windows系统的安装界面。如下图所示,一步步按照要求确认就可以完成安装流程了。
等待操作完成即可,如下图所示。
参考 https://www.aliyun.com/jiaocheng/137939.html
这个版本的Qt会在桌面生成QtCreator的快捷方式,打开Qt点击’工具’-‘选项’,弹出配置界面。在其中选择’构建和运行’页面,在’QT版本’标签下,分别配置你所安装的各个Qt库的相关信息。
首先配置Qt版本路径信息。如下图所示,分别配置好qt-pc、qt-qvfb、qt-arm这3个库的路径信息(即各个库中的qmake文件所在的路径信息)。
然后配置工具链的路径。因为Qt只能自动识别出x86平台下的gcc编译器所在路径,arm-linux-gcc的路径无法自动识别,需要手工去指定。如下图所示:
至此,基本完成了QtCreator运行所必须的各项参数的配置,可以开始新建工程进行实际操作了,如下图所示。
完成代码的编码工作之后,点击左下角的’构建目标选择器’,可以自由选择你需要构建的项目目标,包括x11目标、qvfb目标、以及arm目标。如下图所示:
至此,嵌入式Qt开发的安装和搭建工作基本完成,剩下的问题以后再慢慢摸索吧。