基于MINIGUI的LED简易控制.docx
《基于MINIGUI的LED简易控制.docx》由会员分享,可在线阅读,更多相关《基于MINIGUI的LED简易控制.docx(37页珍藏版)》请在冰豆网上搜索。
基于MINIGUI的LED简易控制
《嵌入式系统》课程设计
报告书
课题基于MINIGUI的LED简易控制
专业通信工程
班级
学号
姓名
指导教师
信息科学与工程学院
2013年6月15日
目录
Ø一、设计课题2
Ø二、设计目的2
Ø三、设计任务及要求2
Ø四、设计流程及时间安排2
Ø五、设计思路3
Ø六、设计流程4
Ø6.1MiniGUI在X86上的安装和运行4
Ø6.2MiniGUI交叉编译环境的建立6
Ø6.3建立超级终端8
Ø6.4移植8
Ø七、界面编程10
Ø八、调试结果15
Ø九、设计总结16
Ø附录...................................................................................................17
Ø附录一:
程序17
Ø附录二:
设计参考文献27
一、设计课题:
基于MINIGUI的LED简易控制
二、设计目的:
1.进一步巩固嵌入式系统的基本知识;
2.掌握嵌入式应用系统的基本结构;
3.掌握嵌入式系统开发环境建立和使用;
4.掌握MINIGUI界面程序编程;
5.掌握Linux下硬件驱动的编程;
5.学会查阅有关专业资料及设计手册;
三、设计任务及要求:
1、掌握嵌入式系统开发环境建立和使用;
2、掌握嵌入式系统基本驱动、应用程序的设计调试和编译移植方法;
3、MiniGUI在PC上的安装、移植
4、Linux基本输入输出驱动程序设计编译与移植
5、基于MiniGUI的基本输入输出应用编程编译与移植
6、编写设计说明书(方案的确定、设计环节的考虑及必要说明等)及设备的使用说明;
7、结合课程设计,绘制有关图纸,并详细分析.
四、设计流程与时间安排
1、工作流程
工作流程主要有开发环境搭建、驱动程序设计、应用程序设计及最终调试。
2、设计时间安排:
(共1.5周)
序号
项目
具体内容
时间(天)
1
基础知识
1)讲解设计任务;
2)熟悉Ubuntu的使用;
3)熟悉TQ2440试验系统的使用;
4)掌握嵌入式系统开发环境建立和使用;
1
2
MINIGUI的环境搭建及编程
1)minigui的环境搭建
2)minigui的移植(IAL,GAL)
3)minigui的编程的学习
4
3
驱动程序的编写
1)LED驱动程序的编写及移植
2)键盘驱动,成为Minigui的IAL
实现4个按键,一个enter,一个tab,一个向上键,一个向下键
1
4
界面应用程序的编写
1)界面程序的编写
界面的内容与LED控制有关
2)定时器编程
2
5
软硬件调试
设计综合调试
1
6
完成设计说明书
设计说明书
1
五、设计思路:
基础知识的回顾复习,包括:
嵌入式系统开发环境建立和使用,嵌入式系统基本驱动、应用程序的设计调试和编译移植方法.。
MiniGUI在pc机上的安装。
(可参照《minigui用户手册》)
参照《Minigui技术白皮书》和《Minigui编程指南》学习基于MiniGUI的应用界面编程方法。
运行minigui演示程序,设计界面,开始界面编程。
交叉编译环境的建立,及MiniGui在TQ2440上的移植
开始综合调试
六、设计流程:
6.1、MiniGUI在X86上安装和运行
1、准备工作
①建立工作目录:
mkdir/minigui-free
cd/minigui-free
②复制源文件压缩包到工作目录:
cp/mnt/hgfs/D/*/minigui-free
③解压文件:
tarzxvflibminigui-1.6.10.tar.gz
tarzxvfminigui-res-1.6.10.tar.gz
tarzxvfmg-samples-1.6.10.tar.gz
2、MiniGUI库安装
1进入目录:
cdlibminigui-1.6.10/
2配置:
./configure
在x86上运行只需默认配置即可,配置完成后即可生成Makefile
3编译:
make
成功后即可生成必要的库文件等。
4安装:
makeinstall
在x86上安装库文件。
3、MiniGUI资源安装
①进入目录:
cdminigui-res-1.6.10/
②安装:
makeinstall
必要资源文件的复制安装等操作。
4、MiniGUI例子编译
1进入目录:
cdmg-samples-1.6.10/
2编译:
make
编译src目录下的例子程序,用于验证MiniGUI是否安装成功。
即可在src目录下生成可执行文件
5、安装qvfb
使用qt的qvfb
apt-getinstallqt3-dev-tools-embedded
6、配置MiniGUI.cfg
vi/usr/local/etc/MiniGUI.cfg修改如下部分为
[system]
#GALengineanddefaultoptions
gal_engine=qvfb
defaultmode=800x480-16bpp
#IALengine
ial_engine=qvfb
mdev=/dev/input/mice
mtype=IMPS2
[fbcon]
defaultmode=800x480-16bpp
[qvfb]
defaultmode=800x480-16bpp
display=0
7运行MiniGUI例子程序
1打开qvfb:
qvfb-width800-height480&
2运行helloword:
src/helloworld
出现此窗口说明运行成功。
8、问题
1.错误1:
Permissiondenied
解决方法:
权限不够,使用root用户登录。
2.错误2:
出现符号未找到等编译错误
解决方法:
makeclean后在make
6.2、Minigui交叉编译环境的建立
1、安装交叉编译器arm-linux-gcc
2、在/minigui-free下新建目录nfsroot
#cd/minigui-free
#mkdirnfsroot
3、建立交叉编译的lib
修改libminigui-1.6.10下的configure文件,在文件头添加
CC=arm-linux-gcc
CPP=arm-linux--cpp
LD=arm-linux-ld
AR=arm-linux-ar
RANLIB=arm-linux-ranlib
STRIP=arm-linux-strip
将libcorss.sh拷到libminigui-1.6.10文件夹中
libcorss.sh文件内容如下:
#/bin/sh
./configure--prefix=/minigui-free/nfsroot/--host=arm-linux--target=arm-linux
make
makeinstall
运行脚本#./libcorss.sh
之后可以查看到/minigui-free/nfsroot下面生成了etc、lib、include三个目录
4、建立交叉编译的res
修改minigui-res-1.6.10下的config.linux文件的第11行TOPDIR=/home/nick/minigui-free/nfsroot
将rescorss.sh拷到minigui-res-1.6.10文件夹中
rescorss.sh文件内容如下:
#!
/bin/sh
makeinstall
运行脚本#./rescorss.sh
可以查看/minigui-free/nfsroot下面生成usr目录
5、修改mg-samples-1.6.10下的configure文件,在文件头添加
CC=arm-linux-gcc
CPP=arm-linux--cpp
LD=arm-linux-ld
AR=arm-linux-ar
RANLIB=arm-linux-ranlib
STRIP=arm-linux-strip
将samplecorss.sh拷到mg-samples-1.6.10文件夹中
samplecorss.sh文件内容如下:
#!
/bin/sh
./configure--host=arm-linux--target=arm-linux--prefix=/minigui-free/nfsroot/LDFLAGS=-L/opt/minigui/temp/libCPPFLAGS=-I/minigui-free/nfsroot/includeCFLAGS=-I/opt/minigui-free/nfsroot/include
Make
运行脚本#./simplecorss.sh
可以查看/minigui-free/mg-samples-1.6.10/src下生成了可执行文件
6.3、建立超级终端
1)pc机与开发板串口相连
2)开始-附件-通信-超级终端(波特率115200,数据位8,奇偶校验:
无,停止位1,数据控制流:
无)
6.4、移植
1)将/minigui-free/nfsroot/etc下的Mingui.cfg文件拷到开发板/etc目录下。
2)将/minigui-free/nfsroot/lib下的所有文件拷贝到开发板/usr/lib目录下
3)将pc机/minigui-free/nfsroot/usr/local/lib中所有内容拷贝到开发板的/usr/local/lib下
12、把/minigui-free/mg-samples-1.6.10/src中任意可执行文件和资源文件拷贝到开发板的/usr/minigui下面,没有这个目录自己建一个,最后运行科执行程序,观察开发板上的lcd显示情况,若能出现相应串口,则证明移植成功。
问题
1.环境变量为无效路径:
先用echo$PATH查询环境变量,发现无效路径后,在$ vi .bash_profile #修改用户环境变量文件, 环境变量更改后,在用户下次登陆时生效。
如果想立刻生效,则可执行下面的语句:
$source .bash_profile
用VI在文件/etc/profile文件中增加变量,该变量将会对Linux下所有用户有效,并且是“永久的”
2.在移植文件时要注意文件所在位置,如将/minigui-free/nfsroot/lib下的所有文件拷贝到开发板/usr/lib目录下时要注意是将lib下的所有文件拷贝到开发板/usr/lib目录下,而不是拷贝lib文件夹
七、界面编程
7.1基本的编程概念
MiniGUI是一个图形用户界面支持的系统,通常的GUI编程概念均适用于MiniGUI编程,如窗口和事件驱动编程等。
7.2头文件
Com.c的开始所包括的四个头文件分别是:
他们是所有的MiniGUI应用程序都必须包括的头文件。
7.3程序入口点
一个C程序的入口点为main函数,而一个MiniGUI程序的入口点为
MiniGUIMain,该函数原型如下:
intMiniGUIMain(intargc,constchar*argv[])
main函数已经在MiniGUI的函数库中定义了,该函数在进行一些MiniGUI的出始化工作之后调用MiniGUIMain函数。
7.4进入消息循环
在函DialogBoxIndirectParam(&DlgInitProgress,hWnd,DialogBoxProc,0L)和函数staticintDialogBoxProc(HWNDhWnd,intmessage,WPARAMwParam,LPARAMlParam)的MSG_INITDIALOG进行消息的循环。
其中:
1、hwnd消息发往的窗口的句柄。
2、message消息标识符。
3、wParam一个32位的消息参数,其含义是根据消息的不同而不同。
4、IParam一个32位的消息参数,去含义是取决于消息的类型。
7.5窗口过程函数
窗口过程函数是MiniGUI程序的主体部分,应用程序实际所做的工作大部分都发生在窗口的过程函数中,以为GUI程序的主要任务是接收和处理窗口收的各种消息。
7.6程序的推出
用户单击窗口右上角的关闭按钮时窗口过程函数将收到一个MSG_CLOSE消息。
7.7对话框编程基础
在MiniGUI中,对话框是一类特殊的主窗口,这中主窗口只关注与用户的交互—向用户提供输出消息,但更多的是用于用户输入。
对话框可以理解为子类化之后的主窗口。
它针对对话框的特殊性进行了特殊设计。
/*********************对话框定义************************
staticDLGTEMPLATEDlgInitProgress=
/*定义对话框模板.用static类型数据,使该数据的定义只在所在文件中有效,以免因为名字空间污染造成潜在的编译或连接错误*/
{
WS_BORDER|WS_CAPTION,
/*对话框风格,WS_BORDER创建有边框的窗口,WS_CAPTION创建含标题栏的主窗口*/
WS_EX_NONE,
/*对话框扩展风格,WS_EX_NONE表示无扩展风格*/
0,0,800,480,/*对话框位置,左上角坐标(0,0),800、
"MY_LED_CONTROL",/*对话框标
0,/*对话框图标
0,/*对话框菜单
9,/*对话框中控件个数。
NULL,/*pointerto
0/*附
};
这个函数就是对话框的一个基本定义了。
其中9是包含的控件数,如果包含的控件没有填入正确的个数,那么Qt不会正常显示。
7.8对话框的回调函数
staticintDialogBoxProc(HWNDhWnd,intmessage,WPARAMwParam,LPARAMlParam)
/*对话框过程函数,用来接收和处理所有发送到该窗口的消息*/
{
intnumber;/*用来存从旋钮数字框获得的数值*/
staticintt=0;
intnum;/*存放定时时间*/
switch(message)
{
caseMSG_INITDIALOG:
return1;
caseMSG_PAINT:
{
}
return1;
caseMSG_TIMER:
{
}
caseMSG_COMMAND:
switch(wParam)
{
}
break;
caseMSG_CLOSE:
break;
}
returnDefaultDialogProc(hWnd,message,wParam,lParam);
}
使用的几个消息:
MSG_INITDIALOG:
建立对话框和控件之后,发送到回调函数的
MSG_PAINT:
窗口重绘时发送到窗口过程。
MSG_TIMER:
timer专用。
MSG_COMMAND:
传递wParam参数。
MSG_CLOSE:
关闭时发送。
文本框回调函数用于频率的获取。
7.9控件编程基础
较为复杂的GUI系统中,都带有预定义的控件集合,他们是人机交互的主要元素。
而此次实验用到的控件分别是静态框、按钮、旋钮组合和框
staticCTRLDATACtrlInitData[]=/*控件数组*/
{
{
"static",/*控件类型*/
WS_VISIBLE|SS_SIMPLE,
/*控件风格,WS_VISIBLE创建初始可见的窗口,SS_SIMPLE显示单行文本*/
100,270,150,40,/*控件位置*/
ID_TEXT1,/*控件ID*/
"Pleaseinputfrequency",/*控件内容*/
0,/*附加值*/
WS_EX_NONE/*控件扩展风格*/
},
{
"static",
WS_VISIBLE|SS_SIMPLE,
605,270,150,40,
ID_TEXT2,
"HZ",
0,
WS_EX_NONE
},
{
"button",
WS_VISIBLE|WS_TABSTOP,/*WS_TABSTOP支持Tab键*/
135,160,80,60,
ID_LED1,
"LED1",
0,
WS_EX_NONE
},
{
"button",
WS_VISIBLE|WS_TABSTOP,
285,160,80,60,
ID_LED2,
"LED2",
0,
WS_EX_NONE
},
{
"button",
WS_VISIBLE|WS_TABSTOP,
435,160,80,60,
ID_LED3,
"LED3",
0,
WS_EX_NONE
},
{
"button",
WS_VISIBLE|WS_TABSTOP,
585,160,80,60,
ID_LED4,
"LED4",
0,
WS_EX_NONE
},
{
"button",
WS_VISIBLE|WS_TABSTOP,
285,360,80,60,
ID_START,
"START",
0,
WS_EX_NONE
},
{
"button",
WS_VISIBLE|WS_TABSTOP,
435,360,80,60,
ID_STOP,
"STOP",
0,
WS_EX_NONE
},
{
CTRL_COMBOBOX,
WS_VISIBLE|WS_TABSTOP|CBS_AUTOSPIN|CBS_AUTOLOOP,/*CBS_AUTOSPIN创建旋钮数字框,CBS_AUTOLOOP框中的数字将自动循环显示*/
435,270,80,40,
ID_COMBOBOX,
"0",/*旋钮数字框初始值*/
0,
WS_EX_NONE
}
};
在上面的定义中,我们可以通过坐标来改变他们的位置,使控件能摆放到合适的位置上去。
7.10可以看到运行的界面如下图所示
7.11问题
Linux系统运行很卡,通过top指令查询进程,再用kill杀掉没用的进程,使系统顺畅运行。
八、调试结果:
按led控制灯的亮灭,黑的为灭,绿的为亮,通过输入频率,再按start键,流水灯开始按一定频率亮灭。
再按stop键,就结束了流水灯。
九、设计总结:
本学期为期两周的嵌入式课程设计在不知不觉中结束了,虽说这次课程设计时间不是很长,但是感觉自己收获颇丰,不仅学习到了一些新知识,回顾了以前的一些快要遗忘的知识点,通过这次的课程设计进一步巩固嵌入式系统的基本知识、嵌入式应用系统的基本结构、进一步掌握了嵌入式系统开发环境建立和使用、MINIGUI界面程序编程、Linux下硬件驱动的编程、学会查阅有关专业资料及设计手册、掌握了嵌入式系统基本驱动、应用程序的设计调试和编译移植方法;、MiniGUI在PC上的安装、移植、Linux基本输入输出驱动程序设计编译与移植、基于MiniGUI的基本输入输出应用编程编译与移植。
开发过程中遇到许多问题,主要原因是对于基本知识掌握的不够牢固,所以一旦遇到问题就会摸不着头脑,不知道从何下手。
在软件编译过程中最为棘手的问题,我觉得就是链接库的问题,每一个都有相当复杂的依赖关系,由于我们对嵌入式开发的经验不足,有时候很难能知道库依赖于哪个软件中,比较常用的办法是下载安装与名称相关的软件,如lib*库等等。
即可解决大部分在软件编译中,出现的错误。
对于配置,也是一个非常容易出错的地方,不同的软件配置是不一样的,但通过上网查资料和向老师和同学的请教。
终于对整个设计有了进一步的理解也更深层次的了解了整个的设计思路,更通过学习掌握了Minigui的设计方法。
总之,虽然这次课程设计,使我进步不少,但同时也看到了自己还有非常大的差距,所以更需加倍努力。
附录:
附录一:
程序:
#include
#include/*包括MiniGUI常用的宏以及数据类型的定义*/
#include/*包含了全局的和通用的接口函数以及某些杂项函数的定义*/
#include/*包含了MiniGUI绘图函数的接口定义*/
#include/*包含了libminigui中所有内建控件的接口定义*/
#include
#include
#include
#include/*包含了许多UNIX系统服务的函数原型*/
#include/*提供对I/O控制的函数*/
#include
#defineID_LED1101/*定义各个控件与定时器的ID号*/
#defineID_LED2102
#defineID_LED3103
#defineID_LED4104
#defineID_TEXT1105
#defineID_TEXT2106
#defineID_START107
#defineID_STOP108
#defineID_COMBOBOX109
#defineID_TIMER110
staticinta,b,c,d=0;/*定义LED灯的初始值*/
staticintfd_led;/*定义文件描述符*/
HWNDhMainWnd;/*定义主窗口句柄*/
staticvoiddraw_circular(HWNDhdig,intx,inty,intr,intwhich)
/*自定义一个画圆函数,x、y、r、which分别表示圆心坐标、半径、颜色*/
{
HDChdc;/*定义设备上下文句柄*/
intcolor;
color=((which==0)?
PIXEL_green:
PIXEL_black);
hdc=BeginPaint(hdig);/*获得设备上下文句