Linux ARM 嵌入式开发 搭建nfs - qvfb模拟运行环境

时间: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版本才是为了完成嵌入式程序开发。

0、目录

为达到这个目的,需要做几方面工作:

1、完成开发板与宿主机的网络连接

2、实现nfs工作目录共享

3、编译Qt源码

4、编译qvfb

5、安装QtCreator

6、配置与测试

下面分别记录我的实现过程:

实现过程中参考了 EasyARM-iMX28xx Linux开发指南 20150901 V1.03

1、完成开发板与宿主机的网络连接

我的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

两边都设置好之重启过后,网线一连就可以随便通信了。

2、实现nfs工作目录共享

NFS 即网络文件系统(Network File-System),可以通过网络让不同机器、不同系统之间可以实现文件共享。通过 NFS,可以访问远程共享目录,就像访问本地磁盘一样。

  • 安装 NFS 软件包

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

sudo apt-get install nfs-common #安装 NFS 客户端

  • 添加 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 目录用于测试。

  • 启动 NFS 服务

sudo /etc/init.d/nfs-kernel-server start

执行如下命令则可以重新启动 NFS 服务,也可以通过重启 ubuntu 来实现:

sudo /etc/init.d/nfs-kernel-server restart

在 NFS 服务已经启动的情况下,如果修改了“/etc/exports”文件,需要重启 NFS 服务,以刷新 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目录里运行。

3、编译Qt源码

参考: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-pc版

这个是正常电脑桌面版的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环境中模拟开发板运行程序

进入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

这个是为开发板准备的专用编译器,编译出的文件只能在开发板运行

进入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。

 

4、编译qvfb

参考: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完成。

5、安装QtCreator

说道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系统的安装界面。如下图所示,一步步按照要求确认就可以完成安装流程了。

Linux ARM 嵌入式开发 搭建nfs - qvfb模拟运行环境_第1张图片

等待操作完成即可,如下图所示。

Linux ARM 嵌入式开发 搭建nfs - qvfb模拟运行环境_第2张图片

 

6、配置与测试

参考 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的路径无法自动识别,需要手工去指定。如下图所示:

Linux ARM 嵌入式开发 搭建nfs - qvfb模拟运行环境_第3张图片

至此,基本完成了QtCreator运行所必须的各项参数的配置,可以开始新建工程进行实际操作了,如下图所示。

步骤1、新建工程
Linux ARM 嵌入式开发 搭建nfs - qvfb模拟运行环境_第4张图片

步骤2、输入工程名
Linux ARM 嵌入式开发 搭建nfs - qvfb模拟运行环境_第5张图片

步骤3、设置目标
Linux ARM 嵌入式开发 搭建nfs - qvfb模拟运行环境_第6张图片

Linux ARM 嵌入式开发 搭建nfs - qvfb模拟运行环境_第7张图片

步骤4、设置类信息
Linux ARM 嵌入式开发 搭建nfs - qvfb模拟运行环境_第8张图片

*步骤5、项目管理
Linux ARM 嵌入式开发 搭建nfs - qvfb模拟运行环境_第9张图片

步骤6、工程视图
Linux ARM 嵌入式开发 搭建nfs - qvfb模拟运行环境_第10张图片

完成代码的编码工作之后,点击左下角的’构建目标选择器’,可以自由选择你需要构建的项目目标,包括x11目标、qvfb目标、以及arm目标。如下图所示:

Linux ARM 嵌入式开发 搭建nfs - qvfb模拟运行环境_第11张图片

Linux ARM 嵌入式开发 搭建nfs - qvfb模拟运行环境_第12张图片

  • 如果选择的是桌面版本的Qt-qvfb目标,那么编译完后是无法直接运行的,会提示”QWSSocket::connectToLocalFile could not connect:: 拒绝连接”。这是因为,该目标是基于qvfb来构建的,无法基于x11桌面系统来显示。必须先将qvfb运行起来,然后在终端命令行中输入’qvfb -width 800 -height 400’,然后进入该目标所在目录,输入’./test -qws’,程序方可正常运行,同时会给出’Connected to VFB server :0: 800 x 400 x 32 282x141mm (72x72dpi)’的提示。
  • 如果选择的是嵌入式版本的Qt-arm目标,那么编译完后必须下载到arm目标版上才能运行,在PC端是无法运行的。

基于x11环境的程序运行情况截图
Linux ARM 嵌入式开发 搭建nfs - qvfb模拟运行环境_第13张图片

基于qvfb环境的程序运行情况截图
Linux ARM 嵌入式开发 搭建nfs - qvfb模拟运行环境_第14张图片

至此,嵌入式Qt开发的安装和搭建工作基本完成,剩下的问题以后再慢慢摸索吧。

你可能感兴趣的:(Linux,嵌入式,QT)