基于arm的简易gui设计

2024-04-12

基于arm的简易gui设计(共8篇)

篇1:基于arm的简易gui设计

基于ARM LINUX的嵌入式GUI的设计与开发

摘 要:GUI设计在嵌入式系统设计中占据着举足轻重的地位,MiniGUI为一种适合于嵌入式系统的、功能强大的GUI,本文介绍了基于ARM和Linux的MiniGUI移植方法以及在ARM开发板上实现普通手机操作界面的设计过程,并提出了相应功能的实现方法,给出了设计的效果。

关键词:嵌入式系统;ARM;Linux;MiniGUI

1、引言

目前,嵌入式应用非常广泛。嵌入式系统由硬件和软件两大部分组成。硬件方面的主要核心是嵌入式处理器,以ARM为核的32位RISC处理器是中高端嵌入式应用的代表。软件方面一般由嵌入式操作系统和应用软件组成。嵌入式操作系统种类众多,比如Linux、uCLinux,其具有开放源码、免费授权和资源丰富等优点,备受开发者的青睐。应用软件根据产品需求会用到图形界面(GUI)、文件系统(FS)、网络(TCP/IP协议栈)等软件功能,其中,GUI对于提高人机交互友好性,易操作性具有很好的效果,而随着图形显示设备的广泛应用,目标产品对GUI的需求越来越多。

2、系统环境和构架

系统实现环境采用SmartARM2200开发板及运行在ARM上的uCLinux操作系统。

SmartARM2200开发板:CPU型号为LPC2210,内核规格为ARM7TDMI-S,60M,支持uCLinux操作系统[1] [2];上面带有充足的存储资源(PSRAM,NAND FLASH,NOR FLASH和E2EPRORM等)和丰富的接口(以太网接口、CF卡和SD卡接口,串口接口等),可使用2.2英寸240*320 TFT液晶屏,可使用JTAG仿真调试[3];

嵌入式Linux内核[4]:uCLinux嵌入式操作系统;

uCLinux开发平台的构建:

基于Linux嵌入式系统的设计,其开发流程为如图1所示:

图1 Linux嵌入式系统开发流程

图中,依次建立开发环境arm-elf-gcc,安装uCLinux内核,下载ZLG/BOOT,下载uCLinux内核和文件系统,为了调试uCLinux应用程序,将宿主机的共享目录加到开发板的/mnt目录下,并启动NFS服务。MagicARM2200-S主芯片为LPC2210,LPC2210芯片没有内部Flash,无法进行ISP下载,需要额外的DownLoad程序。

3、MiniGUI移植

在宿主机上安装MiniGUI:将MiniGUI函数库源代码和资源文件(MiniGUI-STR压缩包)复制到PC机的RedHat 9.0特定目录上,解压,编译。

在目标板的uCLinux操作系统上运行MiniGUI应用程序[3],需要:

1)由于不同目标机的图形显示设备与输入设备不一致,所以需要为MiniGUI编写相应的GAL和IAL(驱动程序),再于MiniGUI的源代码一起交叉编译生成MiniGUI的静态链接库文件(uCLinux不支持共享库,只能使用静态连接库); 2)MiniGUI应用程序也在宿主机上进行交叉编译,并与MiniGUI静态链接库生成目标板可执行的FLAT格式文件,交叉编译如图2所示; 图2 MiniGUI应用程序的交叉编译

3)在目标板的uCLinux操作系统上搭建MiniGUI运行环境(安装MiniGUI的资源文件res和运行的配置文件MiniGUI.cfg),将MiniGUI应用程序(FLAT格式)下载和运行。

根据系统要求,需安装MiniGUI资源文件,并修改运行时的配置文件MiniGUI.cfg。

4、系统设计与实现 4.1系统总体框架

基于SmartARM2200开发板,进行MiniGUI系统,并模拟手机显示部分主要功能:首页,图标选择界面,电话本,信息,游戏,其他等六大模块,系统总体框架如图3.1所示:

1)首页:具有显示静态封面图片,更改、显示时间等功能;

2)图形选择界面:提供一个以图标加标签文字的方式供用户浏览选择条目的界面;

3)电话本管理:提供记录姓名、手机、电话、地址等信息,并且可以添加、修改、设计适合手机键盘输入的拼音输入法程序,满足中文姓名,中文短信等汉字输入的需要,键盘布局如图3.2所示;

4)信息管理:提供编写新信息,浏览收信箱和发信箱等的操作界面; 5)游戏:提供一到两个单机游戏,比如贪吃蛇,俄罗斯方块; 6)其他:利用GUI绘图函数绘制几幅优美的图像,制作闹钟等;

图3.1系统整体框图图

图3.2键盘布局图

注:在主界面下,可以通过按左右键来进入图形选择界面,电话本管理和短信管理;在图形选择界面下可以通过选择不同的图标来进入不同的操作界面。

4.2 系统模块设计

4.2.1主界面功能的实现如下:

1)主窗口的创建部分[5]

InitMainWindow();

// 设置各项属性,并建立主窗口

ShowWindow(hMainWnd,SW_SHOWNORMAL);

// 显示主窗口

2)消息循环

while(GetMessage(&Msg,hMainWnd))

{ TranslateMessage(&Msg); DispatchMessage(&Msg);}

3)填充背景色和显示汉字

LoadBitmapFromFile(HDC_SCREEN,&mainskin,“res/skin2.bmp”);

FillBoxWithBitmap(hdc,0,0,MWINDOW_RX,283,&mainskin);

TextOut(hdc,30,295,“信息”); // 显示文字

其中资源图片一般在MiniGUI建立主窗口的过程中发送MSG_CREATE消息时加载(逻辑字体也在此时创建),而背景色的填充和汉字的显示则是在窗口初始显示,发送MSG_PAINT消息时绘制,而且必须在指定的设备上下文中操作:

hdc = BeginPaint(hWnd);

// 获得设备hdc

EndPaint(hWnd,hdc);

// 释放设备hdc

4)时间操作

在MSG_CREATE消息时,启动1s的定时器:SetTimer(hWnd,ID_TIME,100);在定时器消息MSG_TIMER中获取当前时间,并显示出来。

4.2.2图形选择界面的功能实现

当有键盘按下时,系统会发送MSG_KEYDOWN,处理此消息时,通过判断按键方向,确定当前选择的图标,当选择图标发生变化时,即用背景色重绘原有边框,用另一种颜色绘制新的边框,并将标签文字重写在右下角的位置。

4.2.3电话本管理模块完成的功能:

1)显示电话本名单,通过上下键移动可选中不同的名单,同时显示其电话号码;

2)选中一个名单时,可以查看其详细信息(姓名,手机,固话,住址,排序,类型等),并且可以编辑修改;

3)当选中“新建”时,可以创建一个新的电话名单和其详细信息;

4)姓名和住址的编辑支持中文拼音输入法,通过2~9按键上标注的26个字母组合,可以输入常见的汉字。

电话本管理模块的实现方法如下:

1)电话本列表框实现:

{CTRL_LISTBOX,//列表框控件定义:

WS_VISIBLE WS_VSCROLL WS_BORDER LBS_NOTIFY,//LBS_SORT,//

L

BS_AUTOCHECKBOX,1,0,238,263,ID_PhoneList,”“,0,}

在初始化和更新条目时需要填充列表框,清空列表框和填充函数分别为:

SendDlgItemMessage(hWnd,ID,LB_RESETCONTENT,0,0);

SendDlgItemMessage(hWnd,ID,LB_ADDSTRING,0,(LPARAM)myphonenote[i].name);

更改选择条目字符串和更改反白条位置的函数分别为:

SendDlgItemMessage(hwnd, ID, LB_SETTEXT,index,buff),SendDlgItemMessage(hwnd,ID,LB_SETCURSEL,index,0L);

2)条目明细——查看框

分别创建相应的静态框和编辑框,列表框,并填充相应的值即可。

3)条目明细——编辑框

初始化时把光标赋予姓名框,备份当前的条目信息。

SendMessage(hwnd,EM_LIMITTEXT,10,0L);

4)拼音输入框

拼音输入法实现了手机电话本的修改维护和信息的编写,它不仅窗口比较多,切换频繁,而且需要汉字字库和键盘编码译码的支持,显示界面实现的难度比较大,其实现框架图如图4所示:

图4 拼音输入法界面

5、系统实现

经过交叉编译,通过FTP或NFS,和MiniGUI的资源文件、配置文件一起下载到构架好uCLinux操作平台的ARM板,重启运行,程序在开发板上运行时部分界面效果比较理想,如图5所示:

图5 运行结果

参考文献:

[1]李岩,荣盘祥编著.基于S3C44B0X嵌入式uCLinux系统原理及应用.清华大学出版社.[2] 广州周立功单片机发展有限公司.uCLinux开发平台构建.[3]周立功等著.ARM嵌入式系统实验教程(二).北京航空航天大学出版社.[4]林晓飞,刘彬等编著.基于ARM嵌入式Linux应用开发与实例教程.清华大学出版社.[5]北京飞漫软件技术有限公司.MiniGUI编程指南.

篇2:基于arm的简易gui设计

基于ARM的GPS定位系统设计

介绍了基于ARM芯片LPC2131的.GPS定位系统的设计及实现,其中LPC2131为核心处理器,它接收GPS信息并对其进行处理,然后通过GSM模块把处理后的信息发送到GSM网络,任何和GSM短信服务兼容的平台都可以获取此信息并做相关应用.

作 者:杨春杰 Yang Chunjie 作者单位:西安邮电学院刊 名:航天制造技术英文刊名:AEROSPACE MANUFACTURING TECHNOLOGY年,卷(期):“”(4)分类号:V4关键词:LPC2131 GPS定位 GSM

篇3:基于arm的简易gui设计

一、系统总体方案构想

我们所设计的应用系统是一个便携式高精度数据采集与液显人机交互系统, 系统集高精度数据采集、快速数据处理、彩色液晶显示于一体。应用系统的硬件部分主要由两大块构成, 即前端数据采集、处理电路和后端数据处理、液晶显示电路组成, 这两部分是通过RS-232串行接口进行通信。系统的总体方案构图如图1所示。

我们所设计的这套系统, 前后端硬件部分接口丰富, 扩展性强, 硬件一旦成型就相对固定。使用时, 根据具体的应用场合不同, 前端辅以不同类型的传感器, 组成高精度的数据采集传输模块, 前后端分别编写相应的应用软件完成高精度的数据采集、处理和人机交互显示。系统的架构在一定的应用领域具有通用性, 可广泛用于工业过程控制、医疗仪器、智能传感器等各个领域。

二、数据采集部分的软硬件设计

1. 硬件电路设计

数据采集部分的核心器件MSC1210是德州仪器公司推出的系统级高精度ADC芯片系列, 内置24位低功耗Σ—ΔADC前端信号调理电路——多路模拟开关、缓冲器、PGA (可编程增益放大) 、电压参考, 且集成了高性能8051处理器内核、Flash存储器和32位累加器、兼容SPI串口等多种片上外设。

数据采集部分的电路结构原理图和PCB截图如图2所示。

由电路结构原理图可知, 整个数据采集电路是以片上系统——MSC1210Y5为中心的电路, 由前面介绍可以看出这个IC芯片已经集成了模拟电路和控制逻辑, 一方面内部逻辑功能比较强, 另一方面包含了比较完整的测量通道。因此所需要的外围电路很少, 是一种结构紧凑的实用电路。由图2可见线路中主要2块IC芯片为:MSC1210Y5和MAX3223, 前者是一个片上系统, 工作频率为1.8432MHz, 并且包含32kB Flash存储器;后者提供片上系统与后端人机交互系统串口通信的RS-232接口。由于IC芯片的功耗很低, 板上的DVdd电源 (3.3V) 由后端系统通过RS—232接口提供, 除了RS—232接口的接线, 就只需要接入J1、J2插座的信号 (8个AIN线、REF及公共地) 线, 不再需要其它连接, 使用非常方便。此外, 在电路中还预留一部分接口线供以后系统功能扩展使用, 包含第二串行口以及四根可配置为SPI接口、中断输入和I/O端口线等。

2. 软件设计

在基于此电路的智能高精度测温模块应用中, MSC1210Y5完成了微弱信号的多路切换、信号缓冲、PGA编程放大、24位Δ—ΣA/D转换、数字滤波、数据处理、信号校准及串口通信等功能。MSC1210Y5包含2个串口, 我们选取其中的一个串口用来与后端人机交互系统通信, 负责接收后端发送的控制命令和控制参数以及发送前端采集、处理的数据。因此数据采集电路的程序主要任务为以下几点。

(1) 控制内部的ADC的测量过程, 读取转换的数据。

(2) 与后端 (S3C44B0X系统) 通信, 读取上位机的命令和有关的控制参数, 同时向上位机传送转换的数据。

图3表示了数据采集电路的程序控制流程。

程序开始部分设置串口通信的基本参数, 如设置波特率、数据格式、定时/计数器工作方式、时间常数等, 同时使串口处于“接收”状态——等待上位机送过来的命令和数据, 在框图中将依次读到的后端系统的2个字节的串码 (暂存在R6, R7) 的控制字传送到MSC1210Y5内部寄存器ADCON1和ADCON0, 实现对于ADC的控制命令写入。其后还将ADCON3、ADCON2、ADMUX和PDCON这几个寄存器的内部写入相应的命令或参数值, 通过这些过程就能够完成对于MSC1210Y5内的ADC的设置和启动。在这之后内部ADC的转换过程就不需要用程序干预了, 控制程序的任务则是不断地去读取ADC转换结果, 并且向上位机传送。在程序流程的后半部分是一个循环过程, 在这个循环部分的开始是将MSC1210Y5串口转换为“发送”状态——向后端系统发送数据, 由于它的ADC是24位精度, 转换数据必须分为3个字节传送, 依次向上位机发送——即首先将ADC转换结果寄存器1的数据通过SBUF发送, 然后是ADC转换结果寄存器2的数据, 最后是ADC转换结果寄存器3。当然这个过程还应包含:发送同步字符, CRC校验等过程, 这些不是本文研究的重点, 因此在此不加细述。

三、嵌入式GUI应用系统概述

前面已经介绍了整个应用系统的总体结构, 已知整个系统在硬件上是由两大块组成, 一个是上面介绍的前端的数据采集部分, 另外的一个即是后端的基于S3C44B0X微处理器的数据处理和液晶显示部分, 两部分是通过RS—232串行接口进行通信。

后端的硬件部分主要是由三大块构成:以S3C44B0X为核心的系统板, 集JTAG调试电路、系统电源、LCD接口电路的辅助板, 液晶屏。

为了整个系统的便携性, 我们在设计的过程中充分考虑了系统的整体结构, 首先是根据实际应用的需要进行了液晶屏型号的选取, 我们选择的是5.7寸的256色, 320×240像素的STN液晶屏, 然后根据液晶屏的尺寸大小并结合最终应用系统的外形结构特点, 绘制了以S3C44B0X为核心的系统板和集JTAG调试电路、系统电源、LCD接口电路的辅助板。这三大块的构成模型如图4所示。

后端的软件部分也是由三个部分所组成:系统启动加载程序Boot loader程序, 嵌入式实时多任务操作系统uC/OS-II, 基于uC/OS-II的应用程序。根据系统应用的需要, 其中基于u C/OS-II的应用程序主要包括串行口通信程序和基于uC/GUI的图形用户接口程序。图5为后端软件部分的启动和运行过程。

篇4:基于arm的简易gui设计

关键词:Flash存储器;μC/OS-II;嵌入式文件系统

中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)16-31081-03

The Design of aFacility Embedded File System Based on ARM7TDMI

ZHANG Yan-wei,WEI Yin-ku

(Air Defense Command College of the PLA,Zhengzhou 450052,China)

Abstract:According to the features of flash memory,a embedded file system is presented,which fits for a lot of open source real—time operation system.At first we introduce the naturalization,which based on lot of open source real—time operation system μC/OS-II .and then ,we introduce an facility file system.the last we educe the conclusion from testing:The instrument indicate that the embedded file system is simple,highly dependable and efficient

Key words:Flash memory;μC/OS-II;embedded system

随着电子技术的不断发展,嵌入式计算机系统凭借其特有的功能和资源占用量少的特点,在各个领域得到了越来越多的应用。在越来越多的场合中要求存储器的容量不断的扩大,然而在这种情况下若没有文件系统支持,数据的存储就难以管理,故使用文件系统是嵌入式技术发展的必然趋势。

1 嵌入式操作系统选择

目前流行的嵌入式操作系统可以分为两类:一类是从运行在个人电脑上的操作系统向下移植到嵌入式系统中,形成的嵌入式操作系统,如微软公司的Windows CE及其新版本,SUN 公司的Java操作系统,朗讯科技公司的Inferno,嵌入式Linux等。这类系统经过个人电脑或高性能计算机等产品的长期运行考验,技术日趋成熟,其相关的标准和软件开发方式已被用户普遍接受,同时积累了丰富的开发工具和应用软件资源。另一类是实时操作系统,如WindRiver 公司的VxWorks,ISI的pSOS,QNX系统软件公司的QNX,ATI的Nucleus,μC/OS-II,中国科学院凯思集团的Hopen 嵌入式操作系统等,这类产品在操作系统的结构和实现上都针对所面向的应用领域,对实时性高可靠性等进行了精巧的设计,而且提供了独立而完备的系统开发和测试工具,较多地应用在军用产品和工业控制等领域中。这些种类繁多的操作系统中,μC/OS-II和μcLinux为公开源代码操作系统,目前得到了较多的认可,但相对于μcLinux系统,μC/OS-II具有体积小、高实时性的特点,因此设计使用时选择了嵌入实时操作系统μC/OS-II。

2 μC/OS-II的移植

2.1移植μC/OS-II的综合考虑

μC/OS-II是一个通用的嵌入式实时操作系统,具有很好的可移植性。大部分μC/OS-II的代码是用C语言编写的,但是仍有一部分代码是与处理器相关的。系统移植需要考虑CPU细节以及所用编译环境,虽然有各种成功移植的范例,但在LPC2210处理器上移植的范例并不多见。本人在借鉴他人移植代码基础上,实现了μC/OS-II在本次应用硬件系统上的移植。本节介绍使用ADS1.2编译器,把μC/OS-II 2.52移植到LPC2210处理器为CPU的具体实现。

然而任何操作系统的移植都有相当一部分工作是和所用处理器的体系结构密切相关的,因此在做具体的移植工作之前,需要先了解该处理器的体系结构在移植过程中要注意的特性。

(1)处理器模式:LPC2210是一款ARM7TDMI核的微处理器,同所有ARM7TDMI核芯片一样,该处理器工作在7种模式下,其中管理、终止、未定义、中断和快速中断模式都和相应的异常对应,能作为任务使用的模式只有系统态和用户态,比较这两种模式,区别在于系统态可使用特权指,但ARM7TDMI处理器没有存储管理器件MMU,所有代码运行在同一存储空间,各任务堆栈之间并没有保护隔离机制,这样并不能给多任务带来保护,同时系统模式可直接操作程序状态寄存器,这能给开关中断带来方便,权衡利弊,系统任务工作模式选择系统态。

(2)程序状态寄存器:程序状态寄存器CPSR(Current Program Status Register),它的[0--4]位用来表示CPU Mode,每一种处理器异常模式,都有一个对应的SPSR(Saved Program Status Register)寄存器,用来保存进入异常模式前的CPSR。SPSR的作用就是当CPU从异常模式退出时,通过一条简单的汇编指令就能够恢复进入异常模式前的CPSR,该值保存在当前异常模式的SPSR中。非异常模式的 usr和sys模式下没有 SPSR,只有 CPSR。不能显式地指定把 CPSR 保存到某个异常模式下的 SPSR,而必须是变更到该异常模式后由CPU自动完成,不能硬性赋值,因为该模式下SPSR在其他模式下不可见。需要注意的是程序状态寄存器只能在特权模式下修改,通常调用SWI软件中断指令,切换到管理模式后进行修改。

(3)软件中断:软件中断由执行SWI指令产生。在其他模式中调用SWI指令,可使CPU工作模式切换到管理模式,可用于用户模式下的程序调用特权操作指令,可使用该机制实现开关中断等系统功能调用。

(4)上下文切换:ARM处理器执行的CPU上下文,涉及共37个寄存器,其中31个是通用寄存器,包括一个程序计数器PC,另外6个分别是CPSR和五种异常模式程序状态保存寄存器。

(5)堆栈生长方向:μC/OS-II使用结构常量OS_STK_GROWTH

定义堆栈增长方向,这一常量允许两种方向,分别是向上和向下增长,虽然ARM支持了两种方式,但ADS1.2编译器只支持满递减的堆栈方式。

2.2 μC/OS-II系统文件结构

在移植过程中把整个系统代码分为三大部分(共15个文件):一是μC/OS-II核心代码部分,包括10个C程序文件和1个头文件,主要实现了系统调用、任务管理、内存管理、任务间通信等系统功能,这部分代码与处理器无关,在移植过程中无须处理;二是应用程序配置相关部分,包括系统配置相关的两个头文件,对其中相关C语言定义开关的使能或禁能可实现系统的剪裁;三是处理器相关代码部分,包括三个文件,系统移植代码集中在这里。μC/OS-II系统文件结构如图1。

图1 μC/OS-II系统文件结构

2.3移植μC/OS-II

2.3.1 OS_CPU.H的移植

该文件涉及处理器和编译器相关的数据类型定义以及处理器相关的宏定义。根据ADS1.2编译器特性,可以定义数据类型BOOLEAN、INT8U、INT8S等,定义代码见程序清单略。

与处理器相关的宏主要是进入临界区的OS_ENTER_CRITICAL和退出临界区的OS_EXIT_CRITICAL,这里开关中断方式采用方式2,两个开关宏定义为直接操作CPSR寄存器。另外定义OS_TASK_SW()和_OSStartHighRdy()为软件中断函数来为系统提供底层驱动。用软中断作为操作系统的底层接口就需要在C语言中使用SWI指令。在ADS中,有一个关键字__swi,用它声明一个不存在的函数,则调用这个函数救灾调用这个函数的地方插入一条SWI指令,并且可以指定功能号,同时,这个函数也可以由参数和返回值,其传递规则与一般函数一样。相关宏定义见程序清单略。

2.3.2 OS_CPU_C.C的移植

按μC/OS-II要求在OS_CPU_C.C中,需要编写10个C函数,其中9个为钩子函数,在移植过程中简单地把这几个函数处理为空函数了,主要的移植工作在OSTaskStkInit()函数上。分析该函数功能为初始化任务的栈结构,并使所有的寄存器都保存在堆栈中。实现过程中,注意SPSR初始为系统模式并使能中断,具体实现见代码清单略

2.3.3OS_CPU_A.S的移植

在OS_CPU_A.S中,编写3个汇编语言函数,OS_TASK_SW(),__OSStartHighRdy()和OSTICKISR(),并编写了软件中断服务程序。在调用软中断之后,处理器切换到ARM指令和管理模式下工作。在执行软件中断服务函数之前,要提取中断号,这些通过软件中断服务程序完成,具体实现见代码清单略。

任务切换发生在当前任务调用OS_TASK_SW函数主动交出CPU控制权和发生中断时调用OSIntCtxSw函数时,虽然这两个函数执行的条件不同,但是它们的功能相同,实现中让这两个函数公用了一个任务切换代码,其中OS_TASK_SW是通过软件中断0完成的,具体实现见代码清单略。

系统多任务环境由函数OSStart()启动,用户在调用该函数之前,必须已经建立了一个或更多任务。OSStart()最终调用函数OSStartHighRdy()运行多任务启动前优先级最高的任务,而它最终是调用__OSStartHighRdy实现的,其代码见程序清单略。

函数OSTickISR为系统时钟节拍中断函数,这需要使用处理器的定时器和定时中断,为达到集中地初始化硬件的目的,此函数放在了启动代码文件中,实现见程序清单略。

3 简易文件系统设计

3.1文件系统设计方案

用以存储文件数据的设备就是文件系统设备,文件系统设备向文件系统提供数据的物理存储服务。文件系统通过设备驱动程序对文件系统设备进行操作。本设计选择NandFlash存储器作为存储文件数据的设备,U盘就是USB接口大容量FLASH存储盘,它是一种新型移动存储设备,以体积小、速度高、抗震动、通用性强的特点倍受青睐。

通过设计U盘读写协议栈,微处理器已经能够对U盘的某一特定扇区读写。为了让系统写入U盘的数据直接被Windows系统所识别,还需要设计一个符合FAT格式的文件系统。为此我们再来分析需求:一是符合FAT文件系统格式;二是实现数据输入,数据结构不大于80字节;三是能对需要存储数据进行保存。根据对实际需求的分析,基于面向应用,满足应用要求的思路,最后确定文件系统方案为:在Windows NT系统环境下格式化U盘,同时建立一个名为“Hanglu.dat”的文件,通过该文件在嵌入式系统与PC机的Window系统交互,该文件格式固定为数据结构数组文件。根据以上方案,实际研究过程中我设计了一个较为简易的文件系统,该文件系统格式与FAT兼容,实现了嵌入式终端写入的文件能够被Windows系统直接作为文件读写,同时Windows系统上对文件写入的数据也能被嵌入式终端识别。之所以说是一个简易的文件系统,是因为该系统是高度面向本次应用的,而没有提供通用接口,它只默认对一个固定文件名为“Hanglu.dat”的文件进行读写操作,没有实现文件创建及删除功能,不能对文件名进行修改,也不能对通用文件进行操作。

3.2文件系统初始化

文件系统初始化是该系统的核心所在,文件操作的准备工作都在该过程中完成。系统初始化首先获取U盘信息,然后通过比对查询的方法在FDT目录表中查找“Hanglu.txt”目录项,根据目录项中“首簇”值再到FAT区追踪簇链到最后一个,然后根据该值在这一簇中查找EOF所在扇区,并把该扇区数据读到系统RAM中以备读写文件的需要。该过程中比较有特色的是,构建了一个扇区指针数据结构,该数据结构的三个指针成员分别指向“Hanglu.txt”文件末簇指针在文件分配表中、目录项在目录分配表以及EOF的扇区号,这就为后面的文件操作提供了极大的方便。图2为文件系统初始化流程图。

图2 文件系统初始化流程图

获取U盘信息主要包括U盘每扇区字节数、每簇扇区数、FAT开始扇区号、FAT表个数、根目录占扇区数、逻辑盘(卷)总共扇区数、FAT表占用扇区数、根目录开始扇区号以及数据区开始扇区号等数据。U盘在格式化后,把这些信息保存在U盘引导区中,读取U盘引导区可获得以上所列的大部分数据,还有些数据通过计算就可获得。获取U盘信息程序见清单略。

3.3文件读写

系统经初始化后,数据文件的最后一部分数据以读到了系统RAM中,读输入的数据只需要分析出该数据即可。在此不再过多描述。

追加方式写“Hanglu.dat”文件首先判断数据是否小于初始化获取的EOF指针所指簇空间,因为FAT文件系统规定文件存储的最小单位为簇,所以在当前簇空间不足时,需要先遍历文件分配区分配一个空闲的簇空间,并把剩余的数据写入其中。

4 结论

本设计是根据具体需求和项目指标对源代码开放的实时嵌入式操作系统 μC/OS-II进行了有针对性的移植,并在上基础上提出了适合本设计要求的镜文件系统。经实验测试该文件系统运行良好,性能稳定,可靠性强。下一步的工作扩充设备驱动程序库,使之支持更多各式各样的外部设备。

参考文献:

[1]ARM 公司.ARM7TDMI-S Reference Book[M].

[2]Philip公司.UM_LPC2114_2124_2212_2214_2 Datasheet[M].

[3]Andrew N Sloss.ARM嵌入式系统开发—软件设计与优化[M].北京:航空航天大学出版社,2005.

[4]Wayne Wolf.嵌入式计算系统设计原理[M].北京:机械工业出版社,2002.

[5]张宁.等.基于MSP430和CF卡的FAT16文件系统设计[J].长春理工大学学报,第29卷第1期.

[6]刘忆辉.MM36SB020中一个类FAT16文件系统实现[J].2005年全国单片机与嵌入式系统学术交流会论文集.

[7]Jean JLabrosse.著.邵贝贝.等译.嵌入式实时操作系统uC/OS-II(第2版)[M].北京航空航天大学出版社,2005.

篇5:基于arm的简易gui设计

基于ARM的嵌入式RIFD读写器设计

类别:汽车电子

摘要:RFID(Radio Frequency Identification)系统是高效的信息识别、采集系统。本文选用射频芯片S6700,控制模块用的是S3C44B0X作为微处理器,从硬件电路的设计和软件设计两个方面来阐述了嵌入式的RFID读写器的设计方案。

引言

RFID 利用了电磁波空间耦合、传播进行通信,以达到自动识别被标识对象,获取对象信息的目的。同其他一些识别技术相比,射频识别技术具有高效快捷、非接触、无污染、识别率高等突出优点。识别过程无需人工干预,可在恶劣环境下工作,能够应用到很多行业。

1.RIFD 读写器的硬件总体设计

图 1 读写器的硬件总体设计

RFID 系统主要由射频卡、读写器以及计算机系统组成。系统的工作原理如下:读写器通过天线发送出 13.56MHz 的射频信号,当射频卡进入读写器工作场时,天线产生感应电流,从而射频卡获得能量被激活并向读写器发送出自身编码等信息,读写器接收到来自射频卡的载波信号,对接收的信号进行解调和解码后发送至 PC 机进行处理,PC 机根据逻辑运算判断该射频卡的合法性,针对不同的设定做出相应的处理和控制,发出指令信号,射频卡的数据解调部分从接收到的射频脉冲中解调出数据并送到控制逻辑,控制逻辑接受指令完成存储、发送数据或其他操作。

2.硬件选型

在整个系统中,RFID 收发模块的功能是当接收到来自射频卡的载波信号时,对该信号进行解调和解码,并且将信息进行编码和调制后发送到射频卡中,要实现上述功能就需要一款内部封装有发送调制器和接收调制器的射频芯片,选用了射频芯片 S6700。S6700 芯片的时序是通过控制产生的,因此选用了单片机P89C58,利用它的 I/O 口进行控制。因为系统中使用的射频卡是疏耦合 IC卡,所以它与 S6700 芯片之间的协议标准采用了 ISO 15693,C 语言进行编程。

3.RFID 收发模块硬件电路设计

RFID 收发模块的主芯片是 TI 公司的射频芯片 S6700,该芯片的通信接口主要使用三条线:SCLOCK、DIN 和 DOUT。除了通信线外,还有一条 M_ERR 线,用来表征通信是否正常;应用电路如图2 所示:

图 2 RFID 收发模块硬件电路

S6700 的 SCLOCK、DIN、DOUT 分别由 P89C58 的 P1.3、P1.5 和 P1.6 进行控制,由于单片机 P89C52 应用比较广泛。R2 为调制深度选择电阻,当 R2 为 12 欧姆时,调制深度为 10%;当 R2 为 18 欧姆时,调制深度为 20%。SCLOCK 为双向时钟线,分别由单片机 P89C58 和 S6700芯片在不同的情况下进行控制:发送数据时由 P89C58 控制,接收数据时由 S6700 控制。在收发数据时,每个数据位在 SCLOCK 的上升沿被锁存,当 SCLOCK 为高时,数据位必须固定且保持不变,只有当 SCLOCK 为低时,传送的数据才能被改变;DIN 为数据输入线,S6700 芯片通过该线接收来自 P89C58 的命令和数据;DOUT 为数据输出线,S6700 芯片通过该线将回应数据发送给P89C58,同时该线还可用于监测S6700 芯片内部数据缓冲区的情况。M_ERR 线用来表征在同时读多张卡时数据的冲突情况。该线由于内部下拉,平时为低电平,一旦发生多卡冲突,此线会升为高电平。在每一次通信过程中,远端控制器必须通过发送命令来实现任务,典型命令格式为:起始位 S1、位命令字、传输数据和结束位ES1。

4.嵌入式控制模块硬件电路设计

S3C44B0X 微处理器是低功耗的,采用了应用于实时环境的 ARM7TDMI 32 位核,所以选为控制模块的主芯片,负责完成 PC 机和 RFID 读写器之间数据的传送和控制。

4.1 晶振电路

晶振电路用于向 CPU 及其他电路提供工作时钟。S3C44B0X 芯片通过管脚OM[3:2]确定选择何种时钟源,在本系统中,将两个管脚下拉,选择晶体时钟模式,选用该模式时,外部采用 10MHz的晶振,可以利用公式设计出各种所需的输出频率,也就是说时钟频率可以通过软件进行设定,公式如下:

Fpllo=(m×Fin)⁄(p×2s)其中设置 m=0x48,p=0x03,s=0x02,这样就可以得到 40MHz 的输出频率,满足系统的要求。

4.2 电源电路

在该系统中,需要使用 2.5V 和 3.3V 的直流稳压电源,其中 S3C44B0X 的内核需 2.5V 电源,S3C44B0X 的 I/O 口和其它部分电路需要 3.3V 电源。为简化系统电源电路的设计,要求整个系统的输入电压为高质量的 5V 的直流稳压电源,这样就需要用 DC-DC 转换器来完成

5V~2.5V、5V~3.3V 的转换,在该系统电路中选用了 BayLinear 公司的 B1117 电压转换芯片系列:B1117-2.5和B1117-3.3,器件输出电流为 1.0A。系统电源电路如图4 所示。

图 3 系统电源电路图

4.3 SDRAM 接口电路

在本系统中,采用了 HY57V641620 SDRAM 芯片,存储容量为 4 组×16M 位(8M 字节),工作电压为 3.3V,支持自动刷新和自刷新,16 位数据宽度。该芯片是通过行、列地址来定义存储器地址空间的,A11-A0 是列地址,A7-A0 是行地址,芯片管脚 BA0、BA1 用于片内 4 个存储器组的选择,将它与 ADDR21 和ADDR22 相连,利用地址高端进行相应的选择。

在本系统中,采用该 JTAG 接口对程序进行调试和下载。标准的 JTAG 接口是 4 线:TMS、TCK、TDI、TDO,分别为测试模式选择、测试时钟、测试数据输入和测试数据输出。读写器的软件设计

根据 RFID 读写器的需要,移植了UC/OS-Ⅱ。嵌入式系统通信程序循环发送命令,检测是否有卡待读,如果接收到从 RFID 模块传来的卡号信息,则将卡号从信息中提取出来发送至 PC 机上的应用程序,由应用程序对它进行辨识。无论是与 RFID 模块的通信还是与 PC 机的通信,都采用了串口通信方式,所以首先应对串口进行设置。

当嵌入式控制程序向 RFID 模块发送完读卡的相关命令后,就需要等待接收传回的卡号数据信息,由于系统串口采用的是查询方式,一旦发送端存在数据遗失,一直未能有数据传送回来,则程序将进入死循环,所以在程序中设计了自动终止功能。在系统设计中该部分子内容只接收来自 RFID模块的数据,故只考虑串口2。

读卡程序如下:

char recv_rfid(){ char lm;int m,l;if(whichUart==1)/⁄串口 2,接收从 RFID 模块传来的数据

{ wh: for(;(!(rUTRSTAT1 & 0x1));){ m=m+1;/⁄等待的同时对变量 m 计数

if(m==500)/⁄判断 m 是否已累计到 500 还未接收到有效数据

{err_flag=1;/⁄若是,则将标志 err_flag 置 1 goto wh1;/⁄跳转到标记为 wh1 的程序处

}} lm=RdURXH1();/⁄若接收到有效数据,则将串口数据赋给变量 lm return(lm);/⁄返回 lm 的值

} wh1: l=0;/⁄标记 wh1 处程序,实为跳出子程序

} 写卡的过程只需要将从应用程序处获取持卡人的相关信息然后发送至RFID 收发模块,由 RFID模块写入射频卡中,因为要验证写入信息是否正确,所以该程序还需要实现读取射频卡中的信息并返回给应用程序,由应用程序来判断写入信息的正误。持卡人的相关信息包括姓名、性别、年龄、工作单位、身份证号、发卡日期和发卡时间。结束语

篇6:基于arm的简易gui设计

引 言

USB(Universal Serial Bus)是通用串行总线的缩写,因其具有方便易用,动态分配带宽,容错性优越和高性价比等特点,现已成为计算机的主流接口。

随着嵌入式系统的广泛应用,各种小型终端需要开发出与外界联系的USB接口。目前,常用的技术有两种。基于单片机的USB接口,特点是需要外置芯片,电路复杂,留下的CPU资源不多;基于ARM的USB接口,特点是资源丰富,但ARM系列产品较多,如果选型不当,还需要搭接较多的外围电路,且不能很好地发挥CPU性能。USB 接口原理

USB1.1 规范[1]将USB 分为5 部分:控制器、控制器驱动程序、USB 芯片驱动程序、USB设备以及针对不同USB 设备的客户端驱动程序。

(1)控制器(Host Controller)主要负责执行由控制器驱动程序发出的命令。

(2)控制器驱动程序(Host Controller Driver), 在控制器与USB 设备间建立通信

管道(Pipe)。

(3)USB 驱动程序(USB Driver),提供对不同USB 设备及芯片的支持。(4)USB 设备(USB Device), 有两类USB 设备:一类称为功能设备(Function),另

一类是称为USB 集线器(HUB),可以连接多个USB 设备。

(5)USB 设备驱动程序(Client Driver Software)及特定应用程序。主控制器的驱动软件由操作系统支持,USB 设备开发人员一般只需编写客户驱动程序,实现特定功能,设备端所有功能软件需要全面设计。USB 的四种数据传输模式分别是:控制型传输、中断型传输、批量型传输、实时型传输。第一种在缺省通道中传输USB 接口本身的配置等控制信息,后面三种用于功能部件传输数据。中断型用于键盘等的异步输入输出少量数据传输,批量传输主要用于象硬盘等块设备的数据传输,在中断和批量的传输过程中要传递交互握手信号,确保数据准确无误。实时传输对带宽有严格要求,但允许有一定误码,省去了交互握手信号的传递,常用于音视频码流数据传输。四种类型数据都按带宽要求分配在1ms 一帧的数据帧内进行传输,连到端点(EndPoint)通道.1.1嵌入式系统USB 接口设计

要满足高性能ARM嵌入式系统的要求,扩展USB接口必须选择高性能USB控制器芯片,Philips公司的PDISUBD12 USB器件,是与微处理器配合使用的高性能USB接口器件,性价比很高[2][4]。PDIUSBD12主要特性有:

(1)符合USB 1.1 技术规范;

(2)USB控制器并行接口与处理器间的数据传输速度高达2M 字节/秒;(3)在批量模式和同步模式下均可实现1M 字节/秒的数据传输速率;(4)集成了FIFO存储收发器,支持DMA 操作;(5)内置时钟倍频PLL电路,可编程时钟频率输出;(6)多中断模式实现批量和同步传输;

1.2音频码流USB 设备驱动程序

Windows2000 中各种USB 设备客户驱动程序结构框架基本相同,可以从Windows2000 DDK 中获得USB 设备驱动程序范例代码,对范例代码作少量修改就可以满足特定功能需要。图1 显示了驱动程序各层间的数据传递关系,底层USB 主控制器驱动程序(USB Host Driver)由操作系统提供支持,设备驱动程序只需要对USB Host Driver 上传的I/O 数据包IRP 作出响应,并把要输出数据以IRP 形式下传给USB Host Driver 即可[5] [6]。在ISO(实时型)模式下传输音频码流,USB 客户程序除了WDM(Windows Driver Model)驱动常规处理外,必须计算好带宽,并为驱动程序在非分页存储区内分配好环行缓冲区(Ringbuffer),以便USB 主控制器可以不间断输出实时数据。RingBuffer 的大小按下式 计算:

每帧字节数 × 每缓冲帧数 × 缓冲区数 ; 每传完一缓冲区,USB Host Driver 回调(CallBack)一次客户驱动程序,USB 带宽

按每1ms 传送1 帧数据来分配,要实现8kHz 采样频率、8bits 编码的音频PCM 码流传输,帧数据包大小必须设为8Bytes,若设置4 个缓冲区交替工作,每缓冲区分20 帧传送, 则RingBuffer 的大小为640Bytes,那么USB 主控制器每20ms 的频率中断回调一次客户驱动程序是合适的。驱动程序通过IoSetCompletionRoutine()函数给每个IRP 设置回调函数入口地址[6],每完成一个IRP 缓冲区数据传送操作,回调一次该地址指向的函数,以便把下一缓冲包数据压入到IRP 栈,直到全部数据流传送完毕或人为终止传送。S3C2440A特点

S3C2440A的CPU部分主要集成了电源模块、复位和时钟模块、触摸屏和小键盘模块、程序存储器和数据存储器模块。同时提供如下丰富的外围接口:同步存储器(SDRAM)和NAND FLASH控制接口,可扩展到1 GB的存储的空间;4个DMA通道和24个中断端口;能控制STN LCD和TFT液晶屏显示,支持触摸屏功;USB接口A型和B型各一个;3个串行口、I2C,SPI,I2S等接口;带AC97音频接口;具备SD卡、数码相机接口和网络接口。

S3C2440A还具备多种工作模式,管脚为17×17方型分布,横向从左1到右17编号,纵向从下A到上U编号,分类为A1~A17,B1~B17,C1~C17依此类推到U1~U17。这些管脚所对应的功能并不是惟一的,通常只要使能变化,S3C2440A就能实现不同的控制功能。该设计涉及到的 S3C2440A,其管脚如表1所示分为3类。

串口电路

串口在该设计中的作用是通过计算机加载USB驱动程序,原理如图2所示。

3.1电源电路

由于S3C2440A芯片的管脚对电压提出了不同要求,所以需要完成电源的变压,其原理 如图3所示。驱动程序的研究

按USB接口,其设备结构可分为USB Host(主机)和USB Device(外部设备)。USB主机控制USB设备进行通信,而主机与主机之间,或USB设备与USB设备之间是不能通信的。

4.1 USB主机

USB主机的功能通常包含以下几个部分:验证USB设备是否安插好或拔除;控制USB主机与设备两者中的数据流;返回USB主机的所显状态。

USB系统软件由以下3个部分组成:主机控制器驱动(HCD)、USB驱动(USBD)、主机软件(Host Software)。主机控制器所具备的功能如表2所示。HCD和USBD包含基于不同抽象层次的软件接口,两者以一定的方式协同完成任务,用以实现 USB系统的功能。它们的任务差别没有具体定义,然而HCD要具备的一项功能就是必须支持多种不同主机控制器芯片。在一些操作系统中,当系统必须实现某些基本功能时,可由Host Software实现。

4.2 USB传输类型

USB定义了4种传送类型:控制传送、同步传送、中断传送、批传送。其中,控制传送是指可靠的、非周期性的、突发的,并由主机客户软件所发起的通信,主要应用于控制命令和状态信息的传送;同步传送是指在主机和设备之间周期性的、连续的通信,一般用于传送时实信息,这种类型保留了将时间概念包含于数据的能力,但传送并不一定很紧急;中断传送是指少量数据的、低速的、周期的传送;批传送是指非周期的、大量的、可靠的传送,其典型应用在于传送那些可以利用带宽的数据。

4.3 USB设备请求

USB设备应通过缺省控制管道(Default Control Pipe)响应来自主机的请求命令。这些请求是通过使用控制传输来完成的。请求及请求的参数通过Setup包发向设备,由主机负责设置Setup包内的每个域的值。USB设备请求包含的请求类型有三种:标准、厂商和设备类。标准请求用来完成设备的枚举过程;厂商请求用来完成使用者自己定义的请求;设备类请求指的是某些特定的USB设备类所传输出的请求,例如打印机类就属于这一类。设备请求要求有严格的定义,包含的内容有类型、设备请求、值、索引和长度。

4.4 USB驱动程序结构 S3C2440A芯片支持USB1.1协议和USB 2.0协议。该设计是针对USB Host(主机,A型),并基于USB 1.1协议编写的。程序结构和数据传输的流向如图4所示。

驱动程序的编写主要分为以下几个部分考虑:硬件提取层、中断服务程序、标准设备请求和主循环。硬件提取层实现的是S3C2440A对I/O端口直接的读写操作;中断服务程序处理各种中断,包括总线任务上的请求;标准设备请求完成主机送来的各种标准请求,用于完成各种枚举请求;而主循环则负责完成前台的数据采集等工作,所有的任务结束后都要回到主循环上去。

5结 语

篇7:基于arm的简易gui设计

目录

一、引言.................................................1

二、需求分析.............................................1

三、整体设计.............................................2

1、系统框图...........................................2

2、模块功能...........................................2

四、代码编写.............................................2

1、定义一个Cperson类.................................2

2、定义文档类数据成员m_StudengtList...................3

3、初始化文档类成员...................................4

4、建立文档类和视图类数据成员之间的关系...............5

五、测试结果............................................10

1、编译并连接源程序,执行程序后显示的初始界面........10

2、添加王豆豆的信息显示的界面........................11

3、删除通讯录中的信息................................11

4、修改通讯录中的信息................................12

六、设计小结............................................12

一、引言

21世纪是IT普及的世界,到处都存在IT的身影,实时通讯已是占据它不可或缺的地位。一个好的、强大的通讯录系统的好坏,不但可以直接影响到企业、个人的人际关系,而且会间接的影响到企业、个人经济利益和社会地位。随着社会的发展,科技的进步,计算机的应用在社会各领域中都得到了普及,越来越多的人都感受到利用计算机进行各类管理的科学和便捷,利用计算机进行通讯管理已经是一种趋势。

MFC是Microsoft Foundation Class Library(微软基础类库)的缩写形式。它是C++的类集,提供面向对象框架,利用这个框架,程序员可以轻松的创建Windows应用程序。基于MFC的通讯管理系统具有美观的窗口界面、充足可靠的信息数据、简单方便的维护手段和灵活多变的查询方式以及快捷而准确的查询结果。

二、需求分析

通讯录使我们每个人必不可少的一个工具,利用通讯录我们可以对同学、朋友、同事等信息进行有效的管理,包括查询、添加、删除和修改等。

此通讯录系统利用本着人性化的设计,此系统包括了联系人的姓名、电话、地址、E-mail、和备注等信息,利用此系统可以对联系人进行查询、增加、修改、删除等操作,基本上可以满足我们对通讯录的需要。

基于MFC简易通讯录管理系统具有以下特点:1,操作简单,所有人不需学习就可以使用的系统;2,输入简单,输入框都有相关提示,我们可以按照提示输入相关信息;3,界面显示信息完整,界面上每一个编辑框显示一条联系人信息,很清楚地显示了联系人的全部信息。数据库的操作与运行相比文件较复杂,一般对安全性较高的大型信息管理系统采用数据库方式,这里我们采用文件存取方式即可。

三、整体设计

1、系统框图

通讯录管理系统查询记录添加记录 修改记录查询记录删除单条记录清除整组记录向前浏览 向后浏览

2、模块功能

(1)添加记录:可以增加通讯录相关信息;(2)修改记录:可以修改通讯录相关信息;(3)查询记录:可以查找通讯录中每个人的信息;(4)删除记录:可以删除通讯录单条个人信息;(5)清除记录:可以清除通讯录整个组信息;

四、代码编写

1、定义一个Cperson类

程序中处理的学生信息是一个数据序列,即线性表结构。以Coject为基类,公有派生Cperson类。Person.h中的代码:

class CPerson:public CObject { public: DECLARE_SERIAL(CPerson)//对类进行串行化宏定义 CPerson();virtual ~CPerson();

CString m_Name;//姓名 CString m_Phone;//电话 CString m_Company;//公司 CString m_Email;//Email public: };Person.cpp中编辑的初始化的代码 CPerson::CPerson(){

} //初始化人员信息(m_Name,m_Phone,m_Company,m_Email)m_Name=“";//姓名 m_Phone=”“;//电话 m_Company=”“;//公司 m_Email=”“;//Email virtual void Serialize(CArchive& ar);

2、定义文档类数据成员m_StudengtList 在AddressBookview.h中编写代码: class CAddressBookView : public CFormView { protected: // create from serialization only CAddressBookView();

DECLARE_DYNCREATE(CAddressBookView)public: CAddressBookDoc* GetDocument();public: virtual ~CAddressBookView();protected: POSITION m_Position;//指向链表中当前结点的指针 CObList *m_PersonViewList;//指向文档类成员(双向链表)的指针

protected: };DECLARE_MESSAGE_MAP()

3、初始化文档类成员

#include ”stdafx.h“ #include ”AddressBook.h“ #include ”Person.h“ #include ”AddressBookDoc.h“ #include ”AddressBookView.h“ void CAddressBookView::OnInitialUpdate(){

CFormView::OnInitialUpdate();GetParentFrame()->RecalcLayout();ResizeParentToFit();CAddressBookDoc *pDoc=GetDocument();//获得文档类指针

m_PersonViewList=&(pDoc->m_PersonList);//视图类指针指向文档类对象 m_Position=m_PersonViewList->GetHeadPosition();//获得头结点位置 CPerson*pListDoc=(CPerson *)m_PersonViewList->GetAt(m_Position);//获得头一个数据 m_strName=pListDoc->m_Name;

m_strPhone=pListDoc->m_Phone;m_strCompany=pListDoc->m_Company;m_strEmail=pListDoc->m_Email;//将表头结点数据赋给视图类成员变量 UpdateData(false);//刷新窗口

((CDialog*)this)->GotoDlgCtrl(GetDlgItem(IDC_EDIT_NAME));//将光标停在姓名编辑框 }

4、建立文档类和视图类数据成员之间的关系

编写命令按钮代码:(1)添加记录

void CAddressBookView::OnButtonAdd(){

//界面

((CButton*)GetDlgItem(IDC_CHECK_MODIFY))->EnableWindow(false);((CButton*)GetDlgItem(IDC_BUTTON_CLEAR))->EnableWindow(false);((CButton*)GetDlgItem(IDC_BUTTON_PREVIOUS))->EnableWindow(false);((CButton*)GetDlgItem(IDC_BUTTON_NEXT))->EnableWindow(false);((CButton*)GetDlgItem(IDC_BUTTON_ADD))->SetWindowText(_T(”继续添加“));((CButton*)GetDlgItem(IDC_BUTTON_DELETE))->SetWindowText(_T(”添加完毕“));((CEdit*)GetDlgItem(IDC_EDIT_NAME))->EnableWindow(true);

((CEdit*)GetDlgItem(IDC_EDIT_EMAIL))->EnableWindow(true);((CEdit*)GetDlgItem(IDC_EDIT_PHONE))->EnableWindow(true);((CEdit*)GetDlgItem(IDC_EDIT_COMPANY))->EnableWindow(true);m_strName=”“;m_strPhone=”“;m_strCompany=”“;

m_strEmail=”“;//清空编辑框 UpdateData(false);//刷新界面 CPerson *pListDoc=new CPerson();m_Position=m_PersonViewList->AddTail(pListDoc);//新建空人员信息添加至链表,并将当前位置移至该处

CAddressBookDoc *pDoc=GetDocument();//获得文档指针 pDoc->SetModifiedFlag();//设置文档被修改标置

((CDialog*)this)->GotoDlgCtrl(GetDlgItem(IDC_EDIT_NAME));//姓名编辑框获得焦点

}(2)删除记录

void CAddressBookView::OnButtonDelete(){

delete pOld;//释放空间

if(m_PersonViewList->IsEmpty())//链表若为空,则调用添加生成CString str;GetDlgItem(IDC_BUTTON_DELETE)->GetWindowText(str);if(str==”删除记录(&D)“){

CObject *pOld;//临时对象指针

pOld=m_PersonViewList->GetAt(m_Position);//使其指向当前指针 m_PersonViewList->RemoveAt(m_Position);//将当前结点从列表中删// TODO: Add your control notification handler code here

一个新结点

{ CAddressBookDoc *pDoc=GetDocument();//获得文档指针

}

} pDoc->OnNewDocument();m_Position=m_PersonViewList->GetHeadPosition();CAddressBookDoc *pDoc=(CAddressBookDoc*)GetDocument();pDoc->SetModifiedFlag();//获得文档指针,标志文档已被修改 OnInitialUpdate();//显示列表第一个结点

else {

AfxMessageBox(”添加完毕!“);((CButton*)GetDlgItem(IDC_CHECK_MODIFY))->EnableWindow(true);((CButton*)GetDlgItem(IDC_BUTTON_CLEAR))->EnableWindow(true);((CButton*)GetDlgItem(IDC_BUTTON_PREVIOUS))->EnableWindow(true);((CButton*)GetDlgItem(IDC_BUTTON_NEXT))->EnableWindow(true);((CButton*)GetDlgItem(IDC_BUTTON_ADD))->SetWindowText(_T(”添加记录(&A)“));((CButton*)GetDlgItem(IDC_BUTTON_DELETE))->SetWindowText(_T(”删除记录(&D)“));

}(3)清除记录

void CAddressBookView::OnButtonClear(){ if(m_PersonViewList->GetCount()==1)//链表若为空,则调用添加生成} // TODO: Add your control notification handler code here((CEdit*)GetDlgItem(IDC_EDIT_NAME))->EnableWindow(false);((CEdit*)GetDlgItem(IDC_EDIT_EMAIL))->EnableWindow(false);((CEdit*)GetDlgItem(IDC_EDIT_PHONE))->EnableWindow(false);((CEdit*)GetDlgItem(IDC_EDIT_COMPANY))->EnableWindow(false);

一个新结点

{

} AfxMessageBox(”没有可清空的记录!“);return;if(MessageBox(”所有的记录将被清空!“,”清空警告“,MB_YESNO)==IDYES)

{ CAddressBookDoc *pDoc=GetDocument();//获得文档指针 pDoc->OnNewDocument();

m_Position=m_PersonViewList->GetHeadPosition();} }

(4)向前浏览

void CAddressBookView::OnButtonPrevious(){

POSITION m_templeposition;//定义一个临时位置指针

m_templeposition=m_Position;//并使其指向当前结点的前驱结点 m_PersonViewList->GetPrev(m_templeposition);//获得当前结点位置的前一个

CPerson*pListDoc=(CPerson*)m_PersonViewList->GetAt(m_Position);//获得前一个人员的信息 if(m_templeposition==NULL){//若到链表头结点

} else { m_Position=m_templeposition;//当前指针定位到前一个 AfxMessageBox(_T(”已到表头!“));

} m_strName=pListDoc->m_Name;m_strPhone=pListDoc->m_Phone;m_strCompany=pListDoc->m_Company;m_strEmail=pListDoc->m_Email;//赋值给视图类数据成员 UpdateData(false);//刷新窗口

(5)向后浏览

void CAddressBookView::OnButtonNext(){

POSITION m_templeposition;//定义一个临时位置指针

m_templeposition=m_Position;//并使其指向当前结点的前驱结点 m_PersonViewList->GetNext(m_templeposition);//获得当前结点位置的后一个

CPerson*pListDoc=(CPerson*)m_PersonViewList->GetAt(m_Position);

} //获得前一个人员的信息 m_strName=pListDoc->m_Name;m_strPhone=pListDoc->m_Phone;m_strCompany=pListDoc->m_Company;m_strEmail=pListDoc->m_Email;//赋值给视图类数据成员 UpdateData(false);//刷新窗口 if(m_templeposition==NULL){//若到链表尾结点

} else { m_Position=m_templeposition;//当前指针定位到后一个 AfxMessageBox(_T(”已到表尾!"));

// TODO: Add your control notification handler code here }(6)释放链表对象空间

class CAddressBookDoc : public CDocument { protected: // create from serialization only CAddressBookDoc();DECLARE_DYNCREATE(CAddressBookDoc)// Attributes public: CObList m_PersonList;//文档类成员

public: virtual ~CAddressBookDoc();protected: DECLARE_MESSAGE_MAP()};

五、测试结果

1、编译并连接源程序,执行程序后显示的初始界面

2、添加王豆豆的信息显示的界面

3、删除通讯录中的信息

4、修改通讯录中的信息

六、设计小结

在做这个小课题之前,先参考一些书,对整个Windows程序内部运行机制先做一定的了解,整个Windows程序的运行机制是:1,创建窗口:设计一个窗口

类、注册窗口类、创建窗口、显示及更新窗口;2,消息循环;3,窗口过程函数,其中窗口过程函数是关键,根据我们的需要来进行编写。

MFC(Microsoft Foundation Class,微软的基础类库),它是微软为了简化程序员的开发工作所开发的一套C++类的集合,是一套面向对象的函数库,以类的方式提供给用户使用,利用这些类可以有效地帮助程序员完成Windows应用程序的开发,而MFC AppWizard 是一个辅助我们生成源代码的向导工具,它可以帮助我们自动生成基MFC框架的源代码。该向导的的每一个步骤中,我们都可以根据需要来选择各种特性,从而实现定制应用程序。

对于基于MFC的简易通讯录管理系统的设计,需要对联系人的信息进行管理,需要调用MFC类中的函数,对于这个MFC的应用程序,主要的类有CPerson、CAddressBookView、CAddressBookDoc等几个类,里面封装了一些函数和一些变量,例如CPerson是由Cobject派生出来的,CPerson中的构造函数CPerson()对人员的信息进行初始化;CAddressBookView类封装了函数OnButtonAdd()、OnButtonDelete()、OnButtonPrevious()、OnChangeEditCompany()等函数,实现对人员信息的添加,删除,信息的查询,改变工作信息;CAddressBookDoc类封装了OnNewDocument()、DeleteContents()函数,实现对文档类成员的初始化和对文档成员的删除。

篇8:基于arm的简易gui设计

随着嵌入式设备在人们日常工作和生活中的广泛应用,人机交互变得越发重要起来。嵌入式GUI系统作为人机交互的重要方式,受到广大学者和工程开发人员的青睐。苹果公司在此方面做得尤为独到,其iPad、iPhone等电子消费产品一经推出,无不带来强烈的社会反响和良好的社会认可度。可见,GUI系统设计的好坏至关重要。目前主流的嵌入式GUI系统有MicroWindows/NanoX、Qt/Embedded、MiniGUI、DirectFB、PicoGUI以及GTK+/FB等。它们中的大多数遵循LGPL条款发布,而MicoroWindows/NanoX遵循的是MGPL,Qt/Embedded采用QGPL条款发布。

其中MiniGUI[1]是国人开发的一款开源GUI软件库,由于是国人开发,因而对中文支持很好。它为用户提供了丰富的图形功能,帮助显示各种格式的位图并在窗口中绘制复杂图形。它底层为GAL(图形抽象层)和IAL(输入抽象层),上层为基于标准POSIX接口中Pthread库的Mini-Thread架构和基于Server/Client模型的Mini-Lite架构。MiniGUI的GAL层技术基于SVGLib、LibGDI库、Framebuffer的native图形引擎及哑图形引擎等,对于Trolltech公司的QVFB在X Window下也有较好的支持。IAL层则支持Linux标准控制台下的GPM鼠标服务、触摸屏及标准键盘等。

1 基于ARM-Linux的GUI体系结构分析

1.1 GUI系统核心设计理念

我们日常生活中每天都在接收着大量的数据,然而数据对我们来说基本没有什么意义,并不适合用来交流。数据是发现、收集、研究和创造等人类活动的产物,为了得到信息,我们必须对数据进行组织和转化,并以某种适当的方式显示其蕴含的意义。然而信息并不是理解交流的终点,我们尚需将其转化成知识,来为用户创造出某种体验。数据、信息、知识等之间的关系可具体用图1表示[2]。

由图中可以看出:信息(information)是数据(data)和知识(knowledge)之间的桥梁,它通过发现数据之间的联系和模式来对其进行组织和转化,提供给人们可以进行加工的信息;人们则通过对这些信息进行分类组织和转化,将其抽象成知识,增加自己的体验。图中的信息即是我们所要讨论的计算机GUI系统。因此GUI核心设计理念就是将数据组织成有意义的模式和结构,并通过恰当且有意义的形式表达出来。它不仅仅是一个个漂亮的界面,同时还是一个可以用来进行有效交流的信息架构。

1.2 基于ARM-Linux的GUI体系结构分析

首先给出基于ARM-Linux的GUI体系结构框图,如图2所示。

LCD和触摸屏经过ARM-Linux和MiniGUI的封装,构成了嵌入式GUI系统的基础,并为上层GUI应用程序提供GUI元素;上层GUI应用程序通过对下层提供的GUI元素进行有效组织,为用户提供可以理解的信息,与用户进行有效交流。ARM-Linux通过设备驱动层来对底层硬件进行组织管理,并通过VFS为上层MiniGUI提供统一的操作接口。

1) 硬件层

嵌入式设备中广泛使用LCD和TouchScreen来作为GUI的硬件基础,这里以此为基础。用户通过嵌入式GUI系统与现实世界中的数据进行交互可表示为图3所示。

从图3中可以看出:用户通过LCD获取信息,并通过Touch screen来向系统发送交互指令。图中红色部分即为上文中提到的可以用来与用户进行有效交流的信息架构。该信息架构即为本文所要分析的嵌入式GUI系统。

LCD上显示的每一个点的颜色都被存放在显示缓冲区中,LCD控制器在扫描时通过读取显示缓冲区数据的内容输出相应的时序来实现显示。显示点的颜色深度决定着用来表示每个点的最小数据位数,再加上有些LCD控制器还包括了高低字节、高低半字节交换等多种控制,使得用软件实现显示缓冲区与显示点之间的对应关系变得很棘手。于是现今大部分LCD控制器通过调色板查表方式来解决所有对应关系,完成从LCD屏幕点到显示缓冲区的抽象,实际操作时只要向显示缓冲区中写入特定格式的数据,对应的屏幕就会有显示。这使得之后的软件工作变得简单:只需要得到这个显示缓冲区地址,对它进行操作。

触摸屏设备一般包括触摸屏控制器和触摸检测装置两部分。触摸控制器负责从触摸检测装置上接收触摸信息,并将它转换成触点坐标,再传送给CPU,它同时能接收CPU发来的命令并加以执行。

2) 设备驱动层

ARM-Linux为显示设备提供了一类设备驱动程序,即帧缓冲(Framebuffer)设备驱动架构。帧缓冲设备为显示内存和显示芯片寄存器提供从物理内存到进程地址空间的映射。ARM-Linux的Framebuffer机制如图4所示。

从图4中可以看出:Framebuffer通过struct fb_info*registered_fb[FB_MAX]来对向它注册的设备驱动进行管理,并通过file_operations向上层提供系统调用,其设备节点通常为/dev/fb*,上层GUI应用程序可以像操作普通文件那样对其进行操作。

在framebuffer中,fb_info结构为ARM-Linux为帧缓冲设备定义的驱动层接口,其包含了对设备进行操作的底层函数,以及一些记录设备信息的数据结构等。Fb_info结构的关键成员表述如下:

(1) fb_fix_screeninfo记录了用户不能修改的LCD控制器参数(如屏幕缓冲区物理地址等,当对缓冲区设备进行映射操作时,就是从该结构获取其物理地址的)。

(2) fb_var_screeninfo则记录了用户可以进行修改的LCD控制器参数(包括屏幕分辨率,每个像素点的比特数等),它们提供了对LCD的基本抽象。

(3) fb_ops提供给底层设备驱动一个接口,当需要为特定LCD编写驱动时,就需要填写该结构体。

Framebuffer驱动在初始化时通过register_framebuffer()将fb_info注册到 registered_fb数组中,并动态建立设备节点(分配主设备号、次设备号),对设备进行初始化。ARM-Linux通过主设备号和次设备号对设备进行唯一标识。当用户调用open()打开一个framebuffer设备时,将调用fb_open(),传进来的inode就是要打开的设备的设备号。Fb_open()首先通过iminor()取得次设备号,然后查全局数组registered_fb得到设备的fb_info信息,并通过其成员fb_ops来对LCD进行具体操作。

在具体的LCD驱动程序中其流程为:内核初始化时首先调用XXXXfb_probe(),该函数动态分配XXXXfb_info(用来表示LCD控制器的硬件资源,如寄存器、中断号、时钟、调色板等)空间,通过XXXXfb_map_video_memory()申请DMA内存(即显存),初始化控制寄存器和硬件寄存器。当用户调用mmap()映射内存的时候,framebuffer将刚才设置好的显存区域映射给用户。

当启动ARM-Linux时,系统以动态加载模块的形式完成触摸屏驱动程序的初始化和中断分配。当用户程序打开触摸屏驱动程序时,完成打开触摸屏并初始化。当有触摸动作时,立即产生硬件中断,中断处理程序工作,读出触摸屏相应位置的A/D转换值。用户空间的GUI程序调用驱动程序读取A/D转换值到用户空间。在用户空间将A/D转换值转换为具体的X和Y方向的坐标值,赋予图形库中的framebuffer处理程序,借助于图形库的framebuffer功能程序便可在图形界面上实现触摸功能。

3) 虚拟文件系统层

虚拟文件系统是ARM-Linux内核实现的一个软件层,是文件系统共性的抽象,由超级块、索引节点、文件、目录对象组成,每个对象用数据结构进行描述。它通过系统调用向用户空间提供了API操作文件系统,通过对象操作函数API调用具体文件系统的函数进行读写文件操作,如图5所示。

MiniGUI在开发中引入了输入抽象层和图形抽象层(IAL和GAL)的概念,他们和ARM-Linux的VFS共同为上层提供统一的抽象接口。抽象层的概念类似Linux内核虚拟文件系统的概念。它定义了一组不依赖于任何特殊硬件的抽象接口,所有顶层的图形操作和输入处理都建立在抽象接口之上。系统维护一个已注册图形引擎数组,保存每个图形引擎数组的指针,利用一个指针来保存当前使用的图形引擎。

整个GUI信息框架如图6所示。

从图6可以看出,user通过GUI系统信息架构与外界进行交互的流程如下:

1) user通过在touchscreen不同区域的触点,将自己的意愿传达给GUI系统。

2) touchscreen驱动提取user触摸信息,之后提供给上层的MiniGUI。

3) MiniGUi的Input abstract layer将该请求转化成相应的事件和消息,投递给MiniGUI的事件和消息处理模块。

4) MiniGUI Application依据投递来的事件和消息对用户的请求进行响应与决策处理。

5) MiniGUI Application 通过对MiniGUI提供的显示元素(lable、edit、button、menu等)进行有效组织,向user反馈决策处理结果。

6) MiniGUI将显示元素分解,之后将其通过Graphics abstract layer投递给ARM-Linux操作系统。

7) 内核的framebuffer接收MiniGUi提交的显示元素,把通过LCD驱动提供的fb_ops接口将要显示的内容提交给LCD。

8) LCD收到LCD驱动的显示请求,在响应的区域显示响应颜色的点,用户从LCD的显示中得到信息反馈。

2 基于ARM-Linux和MiniGUI的应用设计

本文要构建的具体嵌入式GUI系统主要组成为:LCD (型号LQ080V3DG01)、触摸屏(型号SX-080-W4R-FB)、s3c2410 microprocessor、ARM-Linux(版本号2.6.14)、MiniGUI(版本号1.6.10)、GUI应用程序。使用的交叉编译工具链为arm-linux-gcc-3.4.1。此项目为校企合作项目,为智能小区提供服务。

LCD由color TFT-LCD panel、driver ICs、control circuits、power supply、backlight unit构成。图像和文字可以在640×RGB×480点阵面板上显示,它用18位(6bit/each)数据信号来表示RGB[][4]。S3c2410微处理器上集成LCD控制器,它由DMA控制器、输入FIFO、输出FIFO、调色板RAM和TMED抖动组成,负责将LCD的图像数据从系统内存中的显示缓冲区中传送到LCD完成显示。S3c2410的调色板是256个16位的存储单元,每个单元中存储16位的颜色值。根据16位颜色数据中RGB分量所占位数的不同,调色板还可以采用5:6:5(R:G:B)和5:5:5:1(R:G:B:1)两种格式。在进行图像编程时,可以将图像对象赋予所需的颜色索引值。程序运行时,由s3c2410的LCD控制器查找调色板,按相应的值进行输出[5]。

触摸部分由10-bit CMOS A/D转换器和触摸屏组成[5]。整个GUI信息系统构建流程为:

1) 定制ARM-Linux并编写LCD、touchscreen、key等驱动

首先基于上述基本硬件定制相应的ARM-Linux,添加LCD和触摸屏驱动模块,此部分内容已在文献中说明[6]。

2) 移植MiniGUI相关依赖库

MiniGUI的依赖库有zlib-1.2.3、libpng、jpeg、freetype-1.3.1、tslib。

Zlib是由Jean-loup Gailly与Mark Adler共同开发的提供数据压缩的库。它采用DEFLATE算法,最初为libpng库所写,后来普遍为许多软件使用。Libpng是用来支持PNG图像格式的库。Freetype库是一个开源、高质量且可移植的字体引擎,它为多种字体格式文件提供统一的接口,支持单色位图、反走样位图的渲染。虽然它使用ANSI C开发,但是采用面向对象的思想。Tslib能够为触摸屏驱动获得的采样提供诸如滤波、去抖、校准等功能,通常作为触摸屏驱动的适配层,为上层的应用提供了一个统一的接口。

将以上依赖库用arm-linux-gcc-3.4.1交叉编译。

3) 移植和部署MiniGUI

为了让MiniGUI支持触屏,需要移植输入抽象层IAL,提供核心接口函数如下:

(1) mouse_getxy:返回由其他函数准备好的鼠标坐标信息,并做适当的边界检查。

(2) mouse_getbutton:返回触摸屏状态。

(3) Init2410Input:打开触摸屏设备,初始化相关接口函数和事件队列。

(4) Term2410Input:关闭触摸屏设备。

之后需要编写触摸屏校准程序和触摸屏驱动程序[7,8]。接着在IAL engine options 选项中加入[SMDK2410 Touch Screen]。通过#make menuconfig调用图形界面对MiniGUI图形库进行配置,此时可看到之前添加的[SMDK2410 Touch Screen]选项。

由于嵌入式设备资源有限,在进行部署时只拷贝编译后生成的.so共享库文件,并利用交叉编译器的arm-linux-strip 工具来去掉调试信息,以便缩小空间占用。最后根据实际环境修改相应的配置文件MiniGUI.cfg、profile、ts.conf等。MiniGUI.cfg指定MiniGUI运行时配置,如果使用内建资源方式并编译MiniGUI,则运行时配置选项将直接编译到函数库中。主要配置项设置如下:

(1) profile

……

export QWS_MOUSE_PROTO=Tpanel:/dev/input/event0

export TSLIB_CALIBFILE=/tslib/etc/pointercal

export LD_LIBRARY_PATH=/tslib:LD_LIBRARY_PATH

export TSLIB_CONSOLEDEVICE=none

export TSLIB_FBDEVIDE=/dev/fb0

export TSLIB_TSDEVICE=/dev/input/event1

export TSLIB_CONFFILE=/etc/ts.conf

export TSLIB_PLUGINDIR=/tslib/share/ts/plugins

(2) ts.conf

module variance xlimit=50 ylimit=50 pthreshold=3

module dejitter xdelta=10 ydelta=10 pthreshold=3

module linear

(3) MiniGui.cfg

gal_engine=fbcon

ial_engine=SMDK2410

mdev=/dev/input/event1

mtype=none

……

Defaultmode=640x480-16bpp

……

4) 编写MiniGUI应用程序

由于所设计的GUI系统是针对智能小区室内机的,所以在注重功能性之余,更加注重用户体验,为小区用户量身定做了许多贴心服务(如实时天气预报、生活资讯等),为他们带来良好的身心体验。此款GUI为小区智能系统与小区用户之间进行沟通的窗口,不仅为小区用户提供美观大方的沟通界面,而且将小区智能系统所提供的服务组织成有效的信息提供给小区用户,方便小区用户享受小区智能系统所提供的服务,并与其进行有效交互。

基于上面建立起来的GUI系统开发环境实现的智能小区室内机GUI效果图如图7所示(相关编程接口参阅文献[9,10,11])。

依据1.1节中阐述的GUI核心设计理念,此款GUI系统为小区智能系统与用户之间进行有效沟通的门户。它将小区智能系统所提供的各种服务(实时天气预报、实时生活资讯、滚动新闻等)通过GUI元素的有效组织,通过LCD上的点显示给小区用户,并且通过触摸屏提供给用户与其交互的接口,让小区用户自由定制和选择智能系统所提供的服务(视频对讲、空调场景设置、智能灯光控制等)。GUI系统除了用来进行有效沟通外,还担负着为用户提供美好生活体验的使命。在此款GUI系统设计中,所有区域都使用美观的半透明图片为背景,并在适当地方放置gif动画,美观大方;实时天气预报采用gif动画模拟相应的天气状况,同时使用数字时钟(右上角)和模拟时钟(屏幕正中),满足不同人的喜好;同时采用快捷菜单(屏幕显眼位置)和系统菜单(屏幕左下角,左拉式)来满足不同用户的使用习惯。综上,此款GUI系统在为小区用户提供有效服务的同时也为用户创造了美妙的生活体验。

3 结 语

文中深入阐述了GUI系统核心设计理念,并依据该设计理念深入分析了基于ARM-Linux的嵌入式GUI系统实现原理及其体系架构,并给出了基于ARM-Linux和MiniGUI的具体应用设计,旨在帮助广大研究人员理解嵌入式GUI系统实现流程并实现他们自己的嵌入式GUI系统。

摘要:实现一个表现良好的嵌入式GUI系统要求开发者对操作系统及底层硬件的各个组件及其之间的交互都十分清楚。阐述GUI的核心设计理念,并对基于ARM-Linux的GUI的实现原理和体系结构进行了详尽的分析探讨,最后给出基于MiniGUI的具体应用设计,对研究人员开发嵌入式GUI系统具有指导意义。

关键词:GUI系统核心设计理念,嵌入式GUI基本实现原理,MiniGUI,嵌入式GUI系统

参考文献

[1]http://www.minigui.org.

[2]Hu Fei,Li Lixia.GUIDesign:from Information Architecture to Interac-tive Experience[J].Computer-Aided Industrial Design and ConceptualDesign,2008.

[3]Linux Framebuffer How-To[EB/OL].http://tldp.org/HOWTO/Frame-buffer-HOWTO/.

[4]Sharp.LQ080V3DG01 TFT-LCD Module[S].日本:夏普,2003.

[5]Samsung Electronics Co.Ltd.S3C2410X 32-RISC Microprocessor us-er’s manual,Revision 1.2[M].韩国:三星电子,2003.

[6]杨水清,张剑,施云飞,等.ARM嵌入式Linux系统开发技术详解[M].北京:电子工业出版社,2008.

[7]林学祥,李伟鹏.基于MiniGUI的IAL定制及触摸屏驱动程序开发[J].计算机工程与设计,2008(12).

[8]唐敏,宋杰,李敬仕.基于MiniGUI的触摸屏驱动程序开发应用[J].微计算机信息,2010(35).

[9]韩超.嵌入式GUI开发设计-基于MiniGUI[M].北京:电子工业出版社,2009.

[10]魏永明.嵌入式软件开发及C语言实现-MiniGUI剖析[M].北京:电子工业出版社,2008.

上一篇:在旅游饭店工作会议经验交流材料下一篇:风轻轻吹,我醉了作文