《嵌入式系统》课程设计(论文)-基于S3C2440设备驱动及其界面设计.doc

上传人:小小飞 文档编号:3904174 上传时间:2019-10-10 格式:DOC 页数:16 大小:109KB
返回 下载 相关 举报
《嵌入式系统》课程设计(论文)-基于S3C2440设备驱动及其界面设计.doc_第1页
第1页 / 共16页
《嵌入式系统》课程设计(论文)-基于S3C2440设备驱动及其界面设计.doc_第2页
第2页 / 共16页
《嵌入式系统》课程设计(论文)-基于S3C2440设备驱动及其界面设计.doc_第3页
第3页 / 共16页
《嵌入式系统》课程设计(论文)-基于S3C2440设备驱动及其界面设计.doc_第4页
第4页 / 共16页
《嵌入式系统》课程设计(论文)-基于S3C2440设备驱动及其界面设计.doc_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《《嵌入式系统》课程设计(论文)-基于S3C2440设备驱动及其界面设计.doc》由会员分享,可在线阅读,更多相关《《嵌入式系统》课程设计(论文)-基于S3C2440设备驱动及其界面设计.doc(16页珍藏版)》请在三一文库上搜索。

1、福建工程学院嵌入式系统课程设计(论文)题目: 基于S3C2440设备驱动及其界面设计 班级: 通信0902 姓名: 学号: 指导老师: 目 录1序言 22实践课题题目 33设计目的 34设计过程 34.1 MiniGUI在PC上的安装34.2 MiniGUI在ARM上的移植44.3基于MiniGUI的应用界面编程和基于LED驱动程序的应用程序的编写55调试结果及改进 11 5.1调试结果11 5.2改进方案126心得体会 127参考文献 141序言MiniGUI 是一种面向嵌入式系统或者实时系统的图形用户界面支持系统。它主要运行于 Linux 控制台,实际可以运行在任何一种具有 POSIX 线

2、程支持的 POSIX 兼容系统上。MiniGUI 同时也是国内最早出现的几个自由软件项目之一。MiniGUI 的主要特色有:遵循 LGPL 条款的纯自由软件。提供了完备的多窗口机制。这包括:多个单独线程中运行的多窗口。单个线程中主窗口的附属。对话框和预定义的控件类(按钮、单行和多行编辑框、列表框、进度条、工具栏等)。消息传递机制。多字符集和多字体支持,目前支持 ISO8859-1、GB2312、Big5 等字符集,并且支持各种光栅字体和 TrueType、Type 1 等矢量字体。全拼、五笔等汉字输入法支持。BMP、GIF、JPEG、PCX、TGA 等常见图像文件的支持。Windows 的资源

3、文件支持,如位图、图标、光标等。插入符、定时器、加速键等。其他(Beep、ETC/INI 文件操作等)。小巧。包含全部功能的库文件大小为 300 K左右。可配置。可根据项目需求进行定制配置和编译。高稳定性和高性能。MiniGUI 已经在Linux 发行版安装程序、CNC 系统、蓝点嵌入式系统等关键应用程序中得到了实际的应用。可移植性好。目前,MiniGUI 可以在 X Window 和 Linux 控制台上运行。通过这个课程实践,我们进一步巩固嵌入的基础知识,而且可以复习嵌入式系统的基本结构,开发环境的建立和使用,进一步理解嵌入式基本驱动程序、应用程序的设计调试和编译移植方法,同时新学了Min

4、iGUI在PC上的安装、移植和基于MiniGUI的基本输入输出应用编程编译与移植,从而完成了整个linux初步课程的学习。2实践课题题目基于S3C2440的设备驱动及其界面设计3设计目的3.1进一步巩固嵌入式系统的基本知识3.2掌握嵌入式应用系统的基本结构3.3掌握嵌入式系统开发环境建立和使用3.4掌握嵌入式系统基本驱动、应用程序的设计调试和编译移植方法3.5学会查阅有关专业资料及设计手册3.6 MiniGUI界面编程4设计过程4.1 MiniGUI在PC上的安装4.1.1准备工作4.1.1.1建立工作目录:mkdir /minigui-free cd /minigui-free4.1.1.2

5、复制源文件到工作目录:cp /mnt/hgfs/D/minigui1.6/* /minigui-free4.1.1.3解压文件:tar zxvf libminigui-1.6.10.tar.gz tar zxvf minigui-res-1.6.10.tar.gz tar zxvf mg-samples-1.6.10.tar.gz tar zxvf mde-1.6.10.tar.gz tar zxvf qvfb-1.1.tar.gz4.1.2 MiniGUI库安装4.1.2.1进入目录:cd libminigui-1.6.10/4.1.2.2配置:./configure 在x86上运行只需默认

6、配置即可,配置完成后即可生成Makefile4.1.2.3编译:make 成功后即可生成必要的库文件等。4.1.2.4安装:make install 在x86上安装库文件。4.1.2.5把libminigui加入库搜索路径:找到/etc/ld.so.conf,在这个文件末尾加上/usr/local/lib4.1.2.6把系统共享库缓存刷新,将libminigui加载上,可以使用命令 ldconfig这个命令执行时要花十多秒,耐心等待。当然不使用刷新命令重启系统也可以。4.1.3 MiniGUI资源安装4.1.3.1进入目录:cd minigui-res-1.6.10/4.1.3.2安装:mak

7、e install 必要资源文件的复制安装等操作。4.1.4 MiniGUI例子编译4.1.4.1进入目录:cd mg-samples-1.6.10/4.1.4.2配置:./configure4.1.4.3编译:make编译src目录下的例子程序,即可在src目录下生成可执行文件,用于验证MiniGUI是否在虚拟机上安装成功。4.1.5安装qvfb4.1.5.1进入目录:cd qvfb 1.14.1.5.2配置:./configure4.1.5.3编译:make4.1.5.4安装:make install apt-get install qt3-dev-tools-embedded4.1.6配

8、置MiniGUI.cfgvi /usr/local/etc/MiniGUI.cfg 修改如下部分为system# GAL engine and default optionsgal_engine=qvfbdefaultmode=800x480-16bpp# IAL engineial_engine=qvfbmdev=/dev/input/micemtype=IMPS2fbcondefaultmode=800x480-16bppqvfbdefaultmode=800x480-16bppdisplay=04.1.7运行MiniGUI例子程序4.1.7.1打开qvfb:qvfb -width 800

9、 -height 480 &4.1.7.2运行helloword:./helloworld出现此窗口说明运行成功。4.2 MiniGUI在ARM上的移植4.2.1综述:实际上过程与MiniGUI在虚拟机上的安装过程类似,只不过是使用交叉编译器来编译而已,以下为老师提供的脚本文件,内容中指定了交叉编译器和需要连接的一些库以及要运行的命令,为我们后续的交叉编译提供了极大的方便!libcross.sh minigui库 交叉编译脚本rescross.sh minigui资源 交叉编译脚本samplecorss.sh minigui例子交叉编译脚本mdecorss.sh minigui例子交叉编译脚本

10、libreduce.sh minigui库裁剪脚本4.2.2将libcross.sh考到minigui的lib库的解压文件夹中将rescross.sh 考到minigui的res资源解压文件夹中 将samplecorss.sh 考到sample例子解压文件夹中将mdecorss.sh 考到mde例子解压文件夹中4.2.3依次运行libcross.sh,rescross.sh,samplecorss.sh,mdecorss.sh4.2.4到nfsroot的,目录下,将libreduce.sh考到这个目录下,运行libreduce.sh4.2.5修改nfsroot下的etc下的MINIGUI的配置

11、文件4.2.6可以使用nfs等通信方式将minigui的库文件和资源文件和配置文件传送到开发板,将MiniGUI.cfg移到开发板的/etc目录下,将minigui的库文件移至开发板的/lib和/usr/lib下,将minigui的资源文件移至开发板的/usr/local/下。4.2.7验证移植是否成功:将mg-samples-1.6.10/src下经过交叉编译的可执行程序(例如HelloWorld)传送至开发板上,并运行:./HelloWorld。可能会出现权限不够的情况,则需要运行chmod 777 HelloWorld,然后再次运行:./HelloWorld。传送之前应使用file He

12、lloWorld,若出现ARM字样,即说明可运行于arm处理器上。4.3基于MiniGUI的应用界面编程和基于LED驱动程序的应用程序的编写4.3.1设计思路我是先看有关MiniGUI的书籍,理解了整体框架后,再在写程序的过程中去使用手册里查阅相关函数,再根据驱动程序里的函数模型来调用函数,将框架和函数搭配在一起。例如:DLGTEMPLATE为对话框模板,定义对话框整体参数。CTRLDATA为控件模板,定义对话框中的控件的参数。以上两者可以定义整个界面。InitDialogBoxProc为对话框窗口过程函数,用于对各种消息的处理,包括按键消息,许多函数就是用在这里。InitDialogBox

13、(HWND hWnd)包含DlgInitProgress.controls = CtrlInitProgress;和 DialogBoxIndirectParam (&DlgInitProgress, hWnd, InitDialogBoxProc, 0L);把控件信息告诉对话框模板,再把对话框模板和过程函数对应起来。WinProc为主窗口的过程函数,InitMainWindow为主窗口的初始化函数,定义主窗口参数,实际上在这个程序中是可以不需要主窗口的。MiniGUIMain为MiniGUI函数的入口点。以上为大致框架,设计过程主要是在于修改InitDialogBoxProc对话框窗口过程函

14、数。例如:用ioctl(led_fd, a, 3)来控制LED的开关。用GetWindowText(GetDlgItem(hDlg,IDC_EDIT),usr,22)获取编辑框中的字符串。4.3.2程序注释#include 头文件#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include HWND hMainWnd; 定义主窗口句柄,在程序中用来指代主窗口 static int led_

15、fd; 设备文件描述符int a=0,b=0,c=0,d=0, num;int q=0,w=0,e=0,r=0;static void draw_circle (HWND hWnd,int x,int which) 画圆的函数 HDC hdc; 定义设备上下文 int color; color=(which=0)? PIXEL_blue:PIXEL_red); 选择圆的颜色,是蓝色还是红色 hdc=BeginPaint(hWnd); 获得设备上下文 SetBrushColor(hdc,color); 设置圆的颜色 FillCircle(hdc,x,50,25); 设置圆的位置和半径 EndPa

16、int(hWnd,hdc); 终止设备上下文static DLGTEMPLATE DlgInitProgress = 对话框模板,定义对话框总体参数 WS_BORDER | WS_CAPTION, 窗口风格 WS_EX_NONE 扩展风格 0, 0, 400, 330, 左上角的位置和宽和高 led controler, 标题 0, 没有菜单 0, 没有图标 7, 7个控件 NULL, 指向控件的指针 0 没有附加数据; 定义控件的ID#define IDC_PROMPTINFO100 静态框的ID#define IDC_LED1 110 按钮LED1到LED4的ID#define IDC_L

17、ED2 120#define IDC_LED3 130#define IDC_LED4 140#define IDC_EDIT 150 编辑框的IDstatic CTRLDATA CtrlInitProgress = 控件数据,包含对话框的所有控件 static, 静态框 WS_VISIBLE | SS_SIMPLE, 控件风格 10, 200, 80, 16, 控件左上角位置和宽和高 IDC_PROMPTINFO, 控件ID input frequency, 控件标题 0, 没有附加数据 WS_EX_NONE, 扩展风格 , button, 按钮 WS_VISIBLE | WS_TABSTO

18、P | BS_PUSHBUTTON, 15, 140, 50, 20, IDC_LED1, LED1, 0, WS_EX_NONE , button, 按钮 WS_TABSTOP | WS_VISIBLE | BS_PUSHBUTTON, 85, 140, 50, 20, IDC_LED2, LED2, 0, WS_EX_NONE , button, 按钮 WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON, 155, 140, 50, 20, IDC_LED3, LED3, 0, WS_EX_NONE , button, 按钮 WS_VISIBLE | WS_TA

19、BSTOP | BS_PUSHBUTTON, 225, 140, 50, 20, IDC_LED4, LED4, 0, WS_EX_NONE , button, 按钮 WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON, 225, 200, 50, 20, IDOK, OK, 0, WS_EX_NONE , edit, 编辑框 WS_VISIBLE | WS_TABSTOP | WS_CHILD | WS_BORDER, 90, 200, 100, 20, IDC_EDIT, , 0, WS_EX_NONE ;对话框过程函数,用来处理各种消息static int I

20、nitDialogBoxProc (HWND hDlg, int message, WPARAM wParam, LPARAM lParam)char usr20; switch (message) case MSG_INITDIALOG: 初始化对话框消息 return 1; case MSG_PAINT: 重绘消息 draw_circle (hDlg,40,0) ; 画圆 draw_circle (hDlg,110,1) ; draw_circle (hDlg,180,1) ; draw_circle (hDlg,250,0) ; break; case MSG_COMMAND: 按下对应

21、的按键执行相应指令 switch (wParam) case IDC_LED1:a=(q+)%2; ioctl(led_fd, a, 3); break; 控制LED1的开关 case IDC_LED2:b=(w+)%2; ioctl(led_fd, b, 2); break; 控制LED2的开关 case IDC_LED3:c=(e+)%2; ioctl(led_fd, c, 1); break; 控制LED3的开关 case IDC_LED4:d=(r+)%2; ioctl(led_fd, d, 0); break; 控制LED4的开关 case IDOK: 按下OK键 GetWindow

22、Text(GetDlgItem(hDlg,IDC_EDIT),usr,22); 获取编辑框中的字符串sscanf(usr,%d,&num); 将字符串转换成整数 num=(int)(1.0/num)*100000);int i=0; 把输入的频率转换成周期for(i=0;i100;i+) 先全部点亮LED,延时,再关掉全部LED,再延时,闪烁100次ioctl(led_fd, 1, 0); ioctl(led_fd, 1, 1); ioctl(led_fd, 1, 2); ioctl(led_fd, 1, 3); usleep(num); ioctl(led_fd, 0, 0); ioctl(

23、led_fd, 0, 1); ioctl(led_fd, 0, 2); ioctl(led_fd, 0, 3); usleep(num); break; break; case MSG_CLOSE: 关闭消息 EndDialog (hDlg, IDCANCEL); 关闭对话框 break; return DefaultDialogProc (hDlg, message, wParam, lParam); 如果没有任何消息则返回默认的过程函数static void InitDialogBox (HWND hWnd) 建立对话框 DlgInitProgress.controls = CtrlIni

24、tProgress; 把控件信息告诉对话框模板 DialogBoxIndirectParam (&DlgInitProgress, hWnd, InitDialogBoxProc, 0L); 建立对话框,把对话框模板和过程函数对应起来 主窗口过程函数static int WinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam) switch (message) case MSG_PAINT: 绘图消息 break; case MSG_CLOSE: 关闭消息 DestroyMainWindow (hWnd); 关闭主窗口 Post

25、QuitMessage (hWnd); 发送退出消息给消息循环 break; default: 返回默认过程函数 return DefaultMainWinProc(hWnd, message, wParam, lParam); return(0); int InitMainWindow(void) MAINWINCREATE CreateInfo; 建立主窗口对象CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION; 窗口风格 CreateInfo.dwExStyle = WS_EX_NONE; 扩展风格 CreateInfo.sp

26、Caption = Hello, world!; 标题 CreateInfo.hMenu = 0; 无菜单 CreateInfo.hCursor = GetSystemCursor(0); 光标 CreateInfo.hIcon = 0; 无图标 CreateInfo.MainWindowProc = WinProc; 定义窗口过程函数 CreateInfo.lx = 0; 窗口左上角和宽和高 CreateInfo.ty = 0; CreateInfo.rx = 800; CreateInfo.by = 480; CreateInfo.iBkColor = COLOR_lightwhite;

27、背景色 CreateInfo.dwAddData = 0; 无附加数据 CreateInfo.hHosting = HWND_DESKTOP; 托管句柄 hMainWnd = CreateMainWindow (&CreateInfo); 创建主窗口并获得句柄 if (hMainWnd = HWND_INVALID) return (0); 如果没打开主窗口返回0 else return (1); 打开成功返回1int MiniGUIMain (int argc, const char* argv) MSG Msg; 定义消息变量led_fd = open(/dev/GPIO-Control,

28、 O_RDWR | O_NOCTTY | O_NDELAY); 打开LED设备if (led_fd 0) perror(open device led); 没打开则输出错误信息exit(1); ioctl(led_fd, a, 0); 先关闭所有LEDioctl(led_fd, b, 1); ioctl(led_fd, c, 2); ioctl(led_fd, d, 3); #ifdef _MGRM_PROCESSES JoinLayer(NAME_DEF_LAYER , helloworld , 0 , 0); #endif InitDialogBox (HWND_DESKTOP); 建立对

29、话框 InitMainWindow(); 建立主窗口 ShowWindow(hMainWnd, SW_SHOWNORMAL); 显示主窗口 消息循环 while (GetMessage(&Msg, hMainWnd) 从消息队列中获取消息 TranslateMessage(&Msg); 将按键消息转换为字符消息 DispatchMessage(&Msg); 把字符消息关联到过程函数 MainWindowThreadCleanup (hMainWnd); 关闭主窗口 return 0;#ifndef _LITE_VERSION 如果不是LITE版本则要包含以下头文件#include #endif

30、5调试结果及改进5.1调试结果设计的界面如下基本的功能都能实现:按LED1到LED4按钮可以控制对应的LED的开和关,通过键盘的Tab键可以选择每个按钮和编辑框,在编辑框内输入不同数字,按OK键,使LED的闪烁频率不同。程序的小缺陷:界面上的蓝色的和红色的圆没有闪烁,这主要是我一开始理解错误,以为那只是一种装饰。5.2改进方案当a=0时,LED关,同时在界面上显示蓝色,意味着蓝色代表LED灯熄灭。当a=1时,LED开,同时在界面上显示红色,意味着红色代表LED灯点亮。改动处1:case IDC_LED1:a=(q+)%2; ioctl(led_fd, a, 3); draw_circle (h

31、Dlg,40,a) ;break;case IDC_LED2:b=(w+)%2; ioctl(led_fd, b, 2); draw_circle (hDlg,110,b) ;break;case IDC_LED3:c=(e+)%2; ioctl(led_fd, c, 1); draw_circle (hDlg,180,c) ;break;case IDC_LED4:d=(r+)%2; ioctl(led_fd, d, 0); draw_circle (hDlg,250,d) ; break; 改动处2:for(i=0;i100;i+)ioctl(led_fd, 1, 0); ioctl(le

32、d_fd, 1, 1); ioctl(led_fd, 1, 2); ioctl(led_fd, 1, 3); draw_circle (hDlg,40,1) ; draw_circle (hDlg,110,1) ; draw_circle (hDlg,180,1) ; draw_circle (hDlg,250,1) ;usleep(num); ioctl(led_fd, 0, 0); ioctl(led_fd, 0, 1); ioctl(led_fd, 0, 2); ioctl(led_fd, 0, 3);draw_circle (hDlg,40,0) ; draw_circle (hDlg

33、,110,0) ; draw_circle (hDlg,180,0) ; draw_circle (hDlg,250,0) ;usleep(num); 这样当LED被控制一次,圆也要重绘一次。6心得体会先罗列我这次设计遇到的问题和解决方案:安装qvfb时配置不成功:运行./configure -prefix=/usr/ -with-qt-dir=/usr/lib/qt3/ -with-qt-includes=/usr/include/qt3 -with-qt-libraries=/usr/lib/qt/让minigui可执行程序在虚拟机上运行:在mg-samples-1.6.10目录下运行./configure和make即可,再运行qvfb&,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1