嵌入式课程设计报告.docx
《嵌入式课程设计报告.docx》由会员分享,可在线阅读,更多相关《嵌入式课程设计报告.docx(15页珍藏版)》请在冰豆网上搜索。
![嵌入式课程设计报告.docx](https://file1.bdocx.com/fileroot1/2022-12/7/640be3d9-02ce-4a29-9bfb-34a0358a18ce/640be3d9-02ce-4a29-9bfb-34a0358a18ce1.gif)
嵌入式课程设计报告
嵌入式课程设计
---------基于QT的界面程序设计
学院:
信息科学与工程学院
专业:
电子信息工程
班级:
姓名:
学号:
指导老师:
日期:
2015年06月15日
目录
一、设计目的3
二、设计任务及要求3
三、方案设计3
1内核编译3
2文件系统4
四、搭建嵌入式系统开发环境4
1安装交叉编译器4
2安装tslib-1.4.14
3安装Qt4.75
4、qt-4.5文件系统6
五、NFS挂载6
六、QT界面设计(LED实现)7
1QTcreater安装7
2ARM平台的编译环境设置7
3创建工程7
4LED界面设计8
5主要程序代码8
七、结果12
八、总结12
1遇到的问题及解决方法12
2实验心得感想13
基于QT界面的程序设计
一、设计目的
1.进一步巩固嵌入式系统的基本知识;
2.掌握嵌入式应用系统的基本结构;
3.掌握嵌入式系统开发环境建立和使用;
4.掌握嵌入式系统基本驱动、应用程序的设计调试和编译移植方法;
5.学会查阅有关专业资料及设计手册;
6.QT界面编程。
二、设计任务及要求
1.掌握嵌入式系统开发环境建立和使用;
2.掌握嵌入式系统基本驱动、应用程序的设计调试和编译移植方法;
3、QT在PC上的安装、
4、QT在开发板上的移植
5、QT界面程序设计
6.编写设计说明书(方案的确定、设计环节的考虑及必要说明等)及设备的使用说明;
7.绘制有关图纸
三、方案设计
1内核编译
两种方案;一:
静态编译内核,二:
动态编译内核。
用动态链接库编译生成的可执行文件需调用.so文件方可正常运行,灵活但稍显麻烦;用静态链接库编译生成的可执行文件可直接运行,不用再调用如.so般的依赖库文件,简单但不灵活,本次选用静态编译。
2文件系统
在嵌入式linux系统中,编译的环境和运行的环境不一样,所以我们需要交叉编译工具,一般是在PC上面运行交叉编译工具编译好程序,然后再烧写到目标板的flash上,对于应用程序,我们需要频繁的调试,如果每次都需要烧写,那一定是一件很烦的事情,因此我们此次尝试通过NFS文件系统来调试程序的方法,减少调试工作量。
四、搭建嵌入式系统开发环境
1安装交叉编译器
(1)解压EABI-4.3.3_EmbedSky_20091210.tar.bz2
tar-xvfEABI-4.3.3_EmbedSky_20091210.tar.bz2
(2)设置环境变量
exportPATH=/opt/EmbedSky/4.3.3/bin:
$PATH
(3).永久设置环境变量
vi/etc/profile在最后添加一行
exportPATH=/opt/EmbedSky/4.3.3/bin:
$PATH
2安装tslib-1.4.1
(1)解压tslib-1.4.tar.gz
tar-zxvftslib-1.4.tar.gz-C/
(2)创建目录
mkdir/optEmbedSky/tslib_install
(3)生成configure
./autogen.sh
(4)配置
./configure--prefix=/opt/EmbedSky/tslib_install--host=arm-linuxac_cv_func_malloc_0_nonnull=yes
(5)编译(大概20~30分钟)
make
(6)安装
makeinstall
如果以上步骤没错,则可以在/opt/tslib_install下出现我们需要的库文件,这些库文件我们移植时会用到。
3安装Qt4.7
(1)解压qt-everywhere-opensource-src-4.7.0.tar.gz
tar-zxvfqt-everywhere-opensource-src-4.7.0.tar.gz-C/
(2)创建目录,把QT4.7安装在qt-4.7.0-arm目录下
mkdir/opt/qtEmbedded/qt-4.7.0-arm
(3)配置configure
./configure-embeddedarm-release-opensource-silent-qt-libpng-qt-libjpeg-qt-libmng-qt-libtiff-no-multimedia-makelibs-nomaketools-nomakeexamples-nomakedocs-nomakedemos-qt-kbd-linuxinput-qt-mouse-tslib-xplatformqws/linux-arm-g++-little-endian-qt-freetype-depths16,18-qt-gfx-linuxfb-no-qt3support-no-nis-no-cups-no-iconv-no-dbus-no-openssl-no-fast-no-accessibility-no-scripttools-no-mmx-no-multimedia-svg-no-webkit-no-3dnow-no-sse-no-sse2-no-gfx-transformed-no-gfx-multiscreen-no-gfx-vnc-no-gfx-qvfb-no-glib-prefix/opt/EmbedSky/qt-4.7-arm/-I/opt/EmbedSky/tslib_install/include-L/opt/EmbedSky/tslib_install/lib
(4)编译(大概2.5小时)
make
(5)安装
makeinstall
安装成功后/opt/QtEmbedded-4.7.0-arm/bin里面有qmake,稍后会用到
4、qt-4.5文件系统
(1)将root_qt_4.5_2.6.30.4_20100601.tar.bz2解压到根下
(2)超级用户下修改文件权限
Chmod–R777/opt/EmbedSky/root_nfs
(3)拷贝字体文件
解压:
tar-xvf/opt/wqy-zenhei-0.8.38-1.tar.gz-C/opt/EmbedSky
(3)Qt4.7相关文件
mkdir-p/opt/EmbedSky/root_nfs/opt/qt_4.7
cp-rf/opt/EmbedSky/qt-4.7-arm/lib/opt/EmbedSky/root_nfs/opt/qt_4.7
cp-rf/opt/EmbedSky/qt-4.7-arm/plugins/opt/EmbedSky/root_nfs/opt/qt_4.7
mkdir/opt/EmbedSky/root_nfs/opt/qt-4.7/bin
拷贝自己的可执行文件到bin/opt/EmbedSky/root_nfs/opt/qt-4.7/bin
(4)修改环境profile
vi/etc/profile
exportsetQTDIR=/opt/qt-4.7
exportsetQPEDIR=/opt/qt-4.7
五、NFS挂载
参考实验指导书二,在CentOS下安装、配置nfs服务
安装NFS
安装nfs服务器端:
$yuminstallnfs-kernel-server
3、配置/etc/exports
NFS允许挂载的目录及权限在文件/etc/exports中进行了定义。
例如,我们要将根目录下的/opt/EmbedSky/rootfs目录共享出来,那么我们需要在/etc/exports文件末尾添加如下一行:
/opt/EmbedSky/rootfs*(rw,sync,no_root_squash)
4、拷贝文件
将tslib_install/lib/下的文件及bin下tslib提供的触摸屏校准程序ts_calibrate
和仅利用qt-4.7生成的lib和plugins文件。
拷贝到共享目录/source/rootfs下
5文件系统挂载
(1)设置虚拟机的IP地址
(2)设置参数
超级终端命令端口下,USB线,网线,和串口连接正常,启动开发板,进入调试。
依次设置PC机ip:
192.168.1.7和开发板IP:
192.168.1.6。
保存并退出
(3)nfs启动
选择8进入系统,成功后,超级终端命令端口输入ls查看开发板文件系统中是否有先前拷贝的文件,有即挂载成功。
六、QT界面设计(LED实现)
1下载QTcreater解压安装
【注:
新版下载文件格式为.run文件,需要更改文件权限才能正常安装使用】
2ARM平台的编译环境设置
(1)添加arm的环境
3创建工程
(1)创建工程
打开qtcreator后,创建一个工程,选择QTGuiApplication或者QTWidgetsApplication
(3)手动arm和pc机环境下的qmake
4LED界面设计(LED1~4分别控制等0~1,CLOSE用于熄灭全部的灯)
5主要程序代码
(1)程序初始化
Led.h
#ifndefLED_H
#defineLED_H
#include
#include
namespaceUi{
classLED;
}
classLED:
publicQMainWindow
{
Q_OBJECT
public:
explicitLED(QWidget*parent=0);
~LED();
publicslots:
voidL1();
voidL2();
voidL3();
voidL4();
voidCL();
private:
Ui:
:
LED*ui;
intled1,led2,led3,led4;
};
#endif//LED_H
Led.cpp
#include"led.h"
#include"ui_led.h"
#include
#include
#include
#include
#include
#include
#include
#include
intfd;
LED:
:
LED(QWidget*parent):
QMainWindow(parent),
ui(newUi:
:
LED)
{
ui->setupUi(this);
intscreenWidth=QDirectPainter:
:
screenWidth();
intscreenHeight=QDirectPainter:
:
screenHeight();
this->resize(screenWidth,screenHeight);
connect(ui->pushButton_LED1,SIGNAL(clicked()),this,SLOT(L1()));//定义信号获取和控制程序代码
connect(ui->pushButton_LED2,SIGNAL(clicked()),this,SLOT(L2()));
connect(ui->pushButton_LED3,SIGNAL(clicked()),this,SLOT(L3()));
connect(ui->pushButton_LED4,SIGNAL(clicked()),this,SLOT(L4()));
connect(ui->pushButton_CLOSE,SIGNAL(clicked()),this,SLOT(CL()));
led1=0;//软件清0,熄灭所有LED灯
led2=0;
led3=0;
led4=0;
fd=open("/dev/GPIO-Control",0);//定义io端口
if(fd<0)
{
perror("opendeviceledsfail");
exit
(1);
}
}
LED:
:
~LED()
{
deleteui;
}
voidLED:
:
L1()//LED控制程序
{
led1++;
if(led1==1)//检测到有触屏信号L1输入全部灯熄灭,再将L1点亮
{
ioctl(fd,0,0);
ioctl(fd,0,1);
ioctl(fd,0,2);
ioctl(fd,0,3);
ioctl(fd,1,0);
qDebug()<<"led1on";
}
elseif(led1==2)
{
led1=0;
ioctl(fd,0,0);
qDebug()<<"led1off";
}
}
voidLED:
:
L2()//检测到有触屏信号L2入全部灯熄灭,再将L2亮
{
led2++;
if(led2==1)
{
ioctl(fd,1,1);
qDebug()<<"led2on";
}
elseif(led2==2)
{
led2=0;
ioctl(fd,0,1);
qDebug()<<"led2off";
}
}
voidLED:
:
L3()//检测到有触屏信号L3入全部灯熄灭,再将L3亮
{
led3++;
if(led3==1)
{
ioctl(fd,1,2);
qDebug()<<"led3on";
}
elseif(led3==2)
{
led3=0;
ioctl(fd,0,2);
qDebug()<<"led3off";
}
}
voidLED:
:
L4()//检测到有触屏信号L4入全部灯熄灭,再将L4点亮
{
led4++;
if(led4==1)
{
ioctl(fd,1,3);
qDebug()<<"led4on";
}
elseif(led4==2)
{
led4=0;
ioctl(fd,0,3);
qDebug()<<"led4off";
}
}
voidLED:
:
CL()//清除键,当所有灯点亮时,该键有效,摁下全部灯灭
{
if((led1==1)&&(led2==1)&&(led3==1)&&(led4==1))
{ioctl(fd,0,0);
ioctl(fd,0,1);
ioctl(fd,0,2);
ioctl(fd,0,3);
qDebug()<<"allledoff";
}
//else
//{ioctl(fd,1,0);
//ioctl(fd,1,1);
//ioctl(fd,1,2);
//ioctl(fd,1,3);
//qDebug()<<"allledon";
//}
}
程序构建调试完毕后,进入终端将源代码编译,将可执行文件拷贝到source下的rootfs中。
在超级终端下调试:
(1)到校准文件的路径下执行./ts_calibtate
(2)输入ps命令,把helloworld程序kill
(3)执行./zgh–qws–fnHHH,成功后,能弹出自己设计的界面,按键能按照之前设计的运行。
七、结果
成功后,能弹出自己设计的界面,按键能按照之前设计的运行。
LED1:
按一次点亮LED0,再按一次熄灭LED2:
按一次点亮LED1,再按一次熄灭
LED3:
按一次点亮LED2,再按一次熄灭LED4:
按一次点亮LED3,再按一次熄灭
CLOSE:
当全部灯亮的时候,按一次熄灭全部的灯。
八、总结
1遇到的问题及解决方法
错误1不同操作系统下指令的差别,之前Ubuntu使用apt-get的指令在centOS中需要使用yum命令,个别指令存在差别
错误2 configure:
error:
no acceptable C compiler found in $PATH
yum -y install gcc gcc-c++ gdb问题解决。
错误3 makecommandnotfound
命令yuminstallmake问题解决。
错误4:
install-fixincludeserror1…..
命令makeclean然后make问题解决。
错误5:
gnu/stubs-32.hnosuchfileordirectory
命令yuminstallglibc-devel.i686问题解决
错误6不同操作系统下指令的差别,之前Ubuntu使用apt-get的指令在centOS中需要使用yum命令,个别指令存在差别
错误7:
ft2build.h:
Nosuchfileordirectory
命令yuminstallfontconfig-devel问题解决。
错误8:
BasicXLibfunctionalitytestfailed!
YoumightneedtomodifytheincludeandlibrarysearchpathsbyeditingQMAKE_INCDIR_X11andQMAKE_LIBDIR_X11
命令:
执行yuminstalllibX*,直接安装所有libX开头的包。
程序编译错误:
错误9:
cannotfindlglerror:
collect2:
ldreturned1exitstatus
命令yuminstallmesa-libGL-develmesa-libGLU-devel(2个opengl核心库)
命令yuminstallfreeglut-devel(OpenGLUtilityToolKit)
2实验心得感想
通过本次实验,更加深入的了解了嵌入式程序开发的流程和方法。
学习在搭建交叉编译环境的基础上对开发板进行NFS挂载调试。
理论学习和实际操作存在着巨大差距,在课本上诸多的环境设置都是理想的,但一旦自己动手却总是一波三折,由于是用自己新装的centOS系统,因此总是会缺少各种设置或者编译器版本不够诸如此类的问题,但可喜的是,在同学帮助下和查阅资料的情况下,诸多问题迎刃而解,并最终成功进入编写程序调试设备的阶段。
在尝试解决各类问题的同时,自己也从中学到更多的知识,更加输入的了解其环境搭建过程。
总之,此次课程设计收获颇丰。