第四阶段:项目
智能家具项目:
1.能够监控室内温度,如果温度高于某个阈值,启动报警器,LED1告警指示灯每隔200ms闪烁
2.能够监控红外状态,如果检测有非法入侵,启动报警器,LED2告警指示灯每隔500ms闪烁
3.能够实现软件的在线升级
4.能够实现MP3播放器
5.能够查阅版本信息
智能小车项目:
1.连接USB接口摄像头,下位机能够显示摄像头采集的视频
2.连接USB接口的WIFI,下位机能够实现路由功能和AP热点功能
3.手机和电脑能够通过无线和浏览器获取到视频
4.能够控制小车的前进后退,左转右转
5.能够控制摄像头的垂直和水平摆动
********************************************************
项目第一天任务安排:
2.1.向下位机移植QT,观看QT.avi和QT2.avi视频
实施步骤:
1.建议最好能够再次制作一个最小根文件系统出来
复习面试题:谈谈对嵌入式linux系统的认识
2.向下位机移植QT
具体实施步骤:
获取要移植的QT源码:ftp://project/qt/qtbase-opensource-src-5.4.1.tar.xz
获取配置QT源码的脚本:ftp://project/qt/build.sh
mkdir /opt/project/qt_source
cp qtbase-opensource-src-5.4.1.tar.xz /opt/project/qt_source
cd /opt/project/qt_source
tar -xvf qtbase-opensource-src-5.4.1.tar.xz
cd qtbase-opensource-src-5.4.1
cp build.sh qtbase-opensource-src-5.4.1
vim mkspecs/linux-arm-gnueabi-g++/qmake.conf
将:arm-linux-gnueabi-修改为arm-cortex_a9-linux-gnueabi-
保存退出
./build.sh //./configure...,生成Makefile
make -j4 //编译
make install -j4 //安装
ls /opt/project/qt/ //查看编译生成的成果
bin lib plugins include doc
file /opt/project/qt/bin/qmake //查看qmake的属性
只拷贝将来QT运行时所需的动态库到根文件系统中
mkdir /opt/rootfs/home/qt/
切记:不能拷贝到/opt/rootfs/lib(只存放标准的系统库)
cp /opt/project/qt/lib /opt/rootfs/home/qt/ -frd
cp /opt/project/qt/plugins /opt/rootfs/home/qt -frd
获取触摸屏的设备文件方法:
在下位机执行以下命令:
hexdump /dev/input/event0 //执行完毕,用手点击触摸屏
如果有打印信息,说明触摸屏的设备文件就是/dev/input/event0
如果点击触摸屏没有反应,接着测试下一个设备文件:
hexdump /dev/input/event1 //操作步骤同上
直到找到对应的触摸屏的设备文件
提示:注意bootargs中的lcd=.... tp=....
添加QT运行时所需的环境变量
vim /opt/rootfs/etc/profile 添加如下环境变量
export QTDIR=/home/qt
export PATH=$QTDIR:$PATH
#明确,以下环境变量都是给QT源码使用
#此环境变量用来指示图片的处理库所在的路径
export QT_QPA_PLATFORM_PLUGIN_PATH=/home/qt/plugins
#此环境变量用来指示将来QT运行时操作的LCD显示屏的设备文件
export QT_QPA_PLATFORM=linuxfb:tty=/dev/fb0
#此环境变量用来指示QT运行时所需的字体库
export QT_QPA_FONTDIR=$QTDIR/lib/fonts
export set QT_QWS_FONTDIR=$QTDIR/lib/fonts/
#此环境变量用来指示将来QT在和用户进行交互时对应的
触摸屏的设备文件,触摸屏的设备文件通过hexdump来测试
export TSDEVICE=/dev/input/event0
export QT_QPA_GENERIC_PLUGINS=evdevtouch:$TSDEVICE
export QWS_MOUSE_PROTO=evdevtouch:$TSDEVICE
#用来指示将来使用的LCD显示屏的设备文件
export set QWS_DISPLAY=LinuxFb:/dev/fb0
#用来指示LCD显示屏的分辨率
export set QWS_SIZE=1024x600
export set QWS_DISPLAY="LinuxFb:mmWidth300:mmHeight400:0"
保存退出
下位机测试QT移植的成果:
随意找一个QT程序helloworld,获取用qtcreator
创建一个helloworld工程,然后交叉编译测试:
注意:工程名一般就是源码所在的目录名
编译源码生成的二进制文件名和工程名一样!
切记切记:交叉编译自己的QT源码,不能这么做:
cp helloworld /opt/project/
cd /opt/project/helloworld //进入自己的QT源码
qmake -project //生成一个工程文件helloworld.pro
qmake //根据工程helloworld.pro生成Makefile
vim Makefile //观察CXX=g++
make //根据Makefile进行编译
file helloworld //查看属性,一定是针对于X86架构
同样也不能这么干:
利用qtcreator的绿色的按钮直接编译!此编译方式
同样生成X86架构的二进制文件!
所以qtcreator仅仅目前用来便于编辑代码!但不能交叉编译!
只能这么干:一定要使用交叉编译QT源码生成的qmake
cd /opt/project/helloworld
/opt/project/qt/bin/qmake -project //生成工程文件helloworld.pro
vim helloworld.pro 添加widgets控件的支持
QT += widgets
保存退出
/opt/project/qt/bin/qmake //根据工程文件helloworld.pro生成的Makeifle
vim Makefile //观察CXX=arm-cortex_a9-linux-gnueabi-g++
make
//创建自己的QT程序在根文件系统rootfs中的存放目录
mkdir /opt/rootfs/home/appbin/
cp helloworld /opt/rootfs/home/appbin
开发板测试:
cd /home/appbin/
./helloworld //观察自己的QT程序是否能够启动
//如果有JPG图片,看能否正常显示
//如果有中文,看能够正常显示
此时此刻,如果QT界面有中文,此时是无法显示中文字体:
1.将原先QT中的字体库全部删除
rm /opt/rootfs/home/qt/lib/fonts/* -fr
2.从ftp://project/qt/下载文泉驿字体库wqy-zenhei.ttc
cp wqy-zenhei.ttc /opt/rootfs/home/qt/lib/fonts/
然后再次运行QT程序,即可显示中文字体!
最后:观看QT.avi和QT2.avi视频尝试给QT界面添加背景图片和多级界面操作
问题总结:
1.开源应用软件操作三步骤
./configure ... //目的就是为了自动生成Makefile
//利用automake工具对源码进行操作生成configure配置程序
"...":用来指定编译选项
-prefix /opt/project/qt //-prefix选项用来
指定编译安装目录(将来编译QT源码生成的目标文件的存放目录)
将来只需到/opt/project/qt目录下就可以看到
编译QT源码生成的成果
选项可以通过执行:./configure --help来获取
例如:-qt-libjpeg:表示让QT支持jpg格式的图片
make //编译
make install //将编译QT生成的内容放到/opt/project/qt目录下
2.编译QT源码,到底获取了什么东西呢?
编译QT源码生成的内容如下:
ls /opt/project/qt/
bin lib plugins include doc
bin:编译QT源码生成工具,例如qmake,uic,moc等
这些工具将来用于交叉编译自己的QT程序使用
注意:这些工具都是运行在上位机
lib:编译QT源码生成的各种动态库
其实就是类似QPushButton的类进行了交叉编译
生成了对应的动态库,将来自己的应用程序可以
访问这些动态库,这些动态库运行在下位机
plugins:同lib一样,生成了各种动态库,主要是处理图片的动态库
include:头文件,在上位机编译QT程序时使用
doc:说明文档
3./opt/rootfs/etc/profile配置文件的执行流程
profile:本质就是脚本程序
系统启动流程:
上电->uboot->kernel->rootfs->/sbin/init
->创建子进程执行etc/init.d/rcS,init父进程
此时等待,rcS执行完毕->init再次创建一个子进程来执行
etc/profile脚本文件,一般此文件用于
设置各种全局的环境变量,init父进程继续等待,执行完毕
->init父进程最后创建子进程用来执行/bin/sh->用户输入命令
4.运行QT测试程序helloworld提示各种动态库找不着
一类是缺少标准的系统库:类似libpthread.so找不着
解决办法:到交叉编译器中找到标准的系统库拷贝到
根文件系统/opt/rootfs/lib目录下
另一类是缺少QT库:提示libQtGui.so找不着
解决办法:明确这些动态库都已经拷贝到
根文件系统/opt/rootfs/home/qt/lib下
只需在根文件系统中添加环境变量即可:
上位机执行:
vim /opt/rootfs/etc/profile 文件最后添加:
export LD_LIBRARY_PATH=/home/qt/lib:$LD_LIBRARY_PATH
保存退出
重启下位机
切记切记:
标准的系统库一定放在/opt/rootfs/lib下
自己制作的库和移植的库一律不允许放到/opt/rootfs/lib下
要单独存放,当然了还要注意设置添加LD_LIBRARY_PATH