鉴定说明书认股鉴定表合同书调查报告市场调查自查报告调查表案例

最新文档

北京邮电人学硕!一学位论文Jk于嵌入式Linux操作系统的...


  文件类型:PDF/Adobe Acrobat   文件大小:字节

更多搜索:北京  邮电  一学  论文  Jk  嵌入式  Linux  操作系统  ..  
北京邮电人学硕!一学位论文Jk于嵌入式Linux操作系统的GUI 6)I究ij实现
摘要
近年来,嵌入式系统得到了飞速的发展,产品形态多种多样口由于嵌入式产
品更加商品化,对图形用户界面(GUI)的要求也越来越高,但是多受到本身硬
件条件的限制.随着嵌入式设备硬件性能的不断提高,消费者对产品功能的要求
也愈加完备,象越来越多的嵌入式系统,包括PDA,机顶盒,WAP手机等,均要
求提供全功能的Web浏览器.而这一切,都离不开一个功能完备的GUI系统的支
持. 因此,如何开发一个适合于自己硬件条件的GUI系统,成了嵌入式系统开
发的一个重要工作内容.本文结合我们实验室与北京平治东方科技有限公司联合
开发的基于嵌入式Linux操作系统的智能商务电话项目,对GUI系统方案的选
型,分析,设计与实现等方面做了详细的论述.
论文首先对当今嵌入式系统以及图形用户界面发展概况做了简单的介绍,并
说明了课题的背景与工作内容.第二章对嵌入式Linux操作系统和我们开发板采
用的uClinux系统做了分析和介绍,论述了uClinux在针对嵌入式处理器(我们
采用的是MC68LZ328)没有MMU处理单元的情况下对内存的管理模式和特点.
第三章简要介绍了本课题的系统开发环境.第四章结合我们开发板的软硬件环
境,介绍了本人对MiniGUI详细的分析,并提出了适合开发板条件的设计方案.
第五章是介绍我最终确定的GUI方案,在开发板上的详细实现情况,其中重点
论述了几个与开发板硬件特点相关的几个模块.最后是对阶段成果的一些总结和
展望.关键词:图形用户界面,嵌入式系统,图形引擎
北;Il9fil1人学硕I厂学位论文基于嵌入式t.inur操作系统的GUI研究与实现
Abstract
in lately years, embedded system have made. a fast development and formed
various type of productions. And as it is more commercialization, more and more
requiremnets on its GUI are produced.. But restricted勿its poor hardware in old
days, user interface we can see is very simple. Now with the development of
embedded hardware, consumer expect a perfect function on embedded product. I%4ore
and more embedded system ,such as, PDA,WAP mobile, will supply a full function
Web browser.
Consequently, how to develop a graphical user interface with perfect function
and suitable for specific hardware is becoming to be more and more important in the
development of embedded system. This thesis demonstrate the design and realization
on the architecture of GUI in the development of intelligent telephone terminal with
PDA function,which is developed together勿our laboratory and Beijing Pease-East
Technology Ltd.
At first,小e thesis outlines触history证embedded systems and user interface,
demonstrates the architecture model, characteristic and design principle of GUI
system, and point out the background and content of the thesis. Then we introduce
Linux operation system, especially on uClinux, which is designed for embedded
processor without MMU. In chapter 3 we make a brief introduce of our development
environment both on hardware and software platform. In chapter 4, we make a
detailed analysis on MiniGUI considering our development environment, give a
solution suitable for our hardware platform, and in chapter 5 we can see the detail记
design and realization on our platform of several important module. Finally, chapter b
make air introduce of the successful result of GUI on our platform
Graphical User Interface, Embedded System, Graphics Engine
第一章嵌入式系统与图形用户界面综述
1.1嵌入式系统概述
1.1.1嵌入式系统的历史
在当前的数字信息技术和网络技术高速发展的后PC (Post-PC)时代,嵌入
式系统已经广泛的渗透到科学研究,工程设计,军事技术,各类产业和商业文化
艺术,娱乐业以及人们的日常生活等方方面面中.随着国内外嵌入式产品如车载
电脑,机顶盒等等的进一步开发和推广,嵌入式技术越来越和人们的生活紧密结
合.在PC时代,可能有人从来没有接触过计算机;但是在Post-PC时代,他就
不可能会接触不到嵌入式系统,因为嵌入式系统可能存在于生活的方方面面中,
从家里的洗衣机,电冰箱,到作为交通工具的自行车,小汽车,到办公室里的远
程会议系统等等,都属于可以使用嵌入式技术开发和改造的产品.
实际上嵌入式系统这个概念很早以前就己经存在了.在通讯方面,嵌入式系
统在1960年就被用于对电子机械电话交换的控制,当时被称为"存储式程序控
制系统"(Stored Program Control).那个时候,计算机一词却还不是很普遍,而
存储式程序主要是指用于存储程序及日常讯息的内存部分.存储这些逻辑数据,
而不是将其写入硬盘,这个概念的确具有突破性的意义.
这个时候还没有出现操作系统的概念,对每一个应用都需要提供一整个计算
机的设计.后来微处理器的出现,它用来提供一个中央计算引擎.利用微处理器,
组成了一个基于由总线连接起来的计算机硬件体系结构,并且提供了一个通用功
能的编程模型,从而简化了编程.
嵌入式系统的概念是在1970年左右出现的.不过在当时,大部分都是由汇
编语言完成的,而且这些汇编程序只能用于某一种固定的微处理器.当这种微处
理器过时之后,这种嵌入式系统就没有用了;并且还要开始对新的微处理器写新
的嵌入式系统.
这个时候的嵌入式系统很多都不是操作系统,他们只是为了实现某个控制功
能,使用一个简单的循环控制对外界的控制请求进行处理.不可否认,这对一些
简单的系统而言是足够的.但是当我们的系统越来越复杂,利用的范围越来越广
泛的时候,没有操作系统就成为了一个最大的缺点了,因为需要添加一项新功能
都可能需要从头开始设计,否则只能增加开发成本和系统复杂度.
C语言的出现使得我们的操作系统开发变得越来越简单.我们可以利用C
语言很快的写出一个小型的,稳定的操作系统.众所知之,C语言的作者Dennis
M. Ritchie和Brian W. Kemighan利用它写出了著名的UNIX操作系统,直接影
响了这三十年计算机业的发展.同时,对开发嵌入式系统来说,在效率和速度上
都提高了很多.
从上世纪八十年代开始,开始出现各种各样的商业用嵌入式操作系统,这些
操作系统大部分都是为专有系统而开发,从而形成了现在多种形式的商用嵌入式
操作系统百家争鸣的局面.如VxWorks, pSOS> Neculeus和Windows CE等等.
现在,网络在人们生活中的应用越来越广泛,自然而然,在嵌入式系统中使
用网络系统也成为了一项基本的要求.把网络协议栈实现在嵌入式系统中,对日
常生活中的需要极有意义.利用嵌入式系统中的网络功能,可以实现下面我将要
描述的信息电器这一即将取代PC在后PC时代占据市场主体的商品.我们知道,
如果在上面所说的那种采用循环控制的嵌入式系统中加入网络协议栈,复杂度会
呈指数级增长.这种情况下,在嵌入式操作系统中增加网络协议模块要方便得多,
并且还能方便各种网络应用程序的不同平台移植.
在未来的社会里面,使用嵌入式系统的情形会越来越多,人可以不接触电脑,
但是不接触嵌入式系统的情况是不存在的.嵌入式系统可能存在于您生活的各个
角落:您家里可能就是通过一个嵌入式系统控制的中心,管理您家里的所有家电,
控制家庭和外界网络的连接,让您的生活更为方便:在坐车的时候,汽车电脑可
以通过GPS(全球卫星定位系统)来判断自己的具体位置,利用嵌入式智能系统
判断应该走哪条路比较方便..而且随着Internet的飞速发展以及Internet技术与
信息家电,工业控制技术等结合日益密切,嵌入式设备与Internet的结合将代表
着嵌入式技术的真正未来.
1.1.2嵌入式系统的特点
嵌入式系统一般指非PC系统,它包括硬件和软件两部分.硬件包括处理器/
微处理器,存储器及外设器件和I/O端口,图形控制器等.软件部分包括操作系
统软件(Os)(要求实时和多任务操作)和应用程序编程.有时设计人员把这两种
软件组合在一起.应用程序控制着系统的运作和行为;而操作系统控制着应用程序
编程与硬件的交互作用.
嵌入式系统的核心是嵌入式微处理器.处理器一般具备以下4个特点1121.
1)对实时多任务有很强的支持能力,能完成多任务并且有较短的中断响应时
间,从而使内部的代码和实时内核心的执行时间减少到最低限度.
2)具有功能很强的存储区保护功能.这是由于嵌入式系统的软件结构已模块
化,而为了避免在软件模块之间出现错误的交叉作用,需要设计强大的存
储区保护功能,同时也有利于软件诊断.
3)可扩展的处理器结构,'以能最迅速地开展出满足应用的最高性能的嵌入式
微处理器.
4)嵌入式微处理器必须功耗很低,尤其是用于便携式的无线及移动的计算和
通信设备中靠电池供电的嵌入式系统更是如此,如需要功耗只有mw甚至
wW级.
嵌入式处理器的应用软件是实现嵌入式系统功能的关键.对嵌入式处理器系
统软件和应用软件的要求也与同用计算机有所不同.
1)软件要求固化存储.为了提高执行速度和系统可靠性,嵌入式系统中的软
件一般都固化在存储芯片或单片机中,而不是存储在磁盘等载体中.
2)软件代码高质量和高可靠性.尽管半导体技术的发展,使处理器速度不断
提高,芯片上存储容量不断增加,但在大多数应用中,存储空间仍然是宝贵的,
还存在实时性的要求.为此,要求程序编写和编译工具的质量要高,以减少程序
二进制代码长度,提高执行速度.
3)许多应用要求系统软件(OS)具有实时处理能力.在多任务嵌入式系统
中,对重要性各不相同的任务进行统筹兼顾的合理调度是保证每个任务及时执行
的关键.单纯通过提高处理器速度是无法完成和没有效率的.这种任务调度只能
由嵌入式操作系统来完成,因此要求操作系统具有实时处理能力.
1.2图形用户界面综述
1.2.1图形用户界面的历史
计算机用户界面是指计算机与其使用者之间的对话接口,是计算机系统的重
要组成部分.计算机的发展史不仅是计算机本身处理速度和存储容量飞速提高的
历史,而且是计算用户界面不断改进的历史.早期的计算机是通过面板上的指示
灯来显示二进制数据和指令,人们则通过面板上的开关,扳键及穿孔纸带送入各
种数据和命令.50年代中,后期,由于采用了作业控制语言((JCL)及控制台打字
机等,使计算机可以批处理多个计算任务,从而代替了原来笨拙的手工扳键方式,
提高了计算机的使用效率.
1963年,美国麻省理工学院在709/7090计算机上成功地开发出第一个分时
系统CTSS,该系统连接了多个分时终端,并最早使用了文本编辑程序.从此,
以命令行形式对话的多用户分时终端成为70年代乃至80年代用户界面的主流.
80年代初,由美国Xerox公司Alto计算机首先使用的Smalltalk-80程序设
计开发环境,以及后来的Lisa. Macintosh等计算机,将用户界面推向图形用户
界面的新阶段.随之而来的用户界面管理系统和智能界面的研究均推动了用户界
面的发展.用户界面己经从过去的人去适应笨拙的计算机,发展到今天的计算机
不断地适应人的需求.
用户界面的重要性在于它极大地影响了最终用户的使用,影响了计算机的推
广应用,甚至影响了人们的工作和生活.由于开发用户界面的工作量极大,加上
不同用户对界面的要求也不尽相同,因此,用户界面已成为计算机软件研制中最
困难的部分之一.当前,Internet的发展异常迅猛,虚拟现实,科学计算可视化
及多媒体技术等对用户界面提出了更高的要求.
1.2.2图形用户界面的主要特征
图形用户界面(GUI)的广泛流行是当今计算机技术的重大成就之一,它极
大地方便了非专业用户的使用,人们不再需要死记硬背大量的命令,而可以通过
窗口,菜单方便地进行操作.到目前为止,虽然业界还没有对图形用户界面这
一概念形成一个严格的定义,但图形用户界面一些主要的特征己经为人们所接受
[15]:
1) WIMP其中:
W(Windows)指窗口,是用户或系统的一个工作区域一个屏幕上可以有多
个窗口. I(Icons)指图符,系形象化的图形标志,易于人们隐喻和理解.
M(Menu)指菜单,可供用户选择的功能提示.
P(Pointing Devices)指鼠标器等,便于用户直接对屏幕对象进行操作
2)直接操作图形用户界面采用的是位映象图形显示技术,用户对应用
程序的控制主要是通过操纵显示在屏幕上的图形对象来完成,这些图形对象如窗
口,菜单和按钮等,都是软件控制下的位映象图形实现.
3)用户控制应用程序的运行不再由编程安排好的过程来驱动,而是由
用户通过图形用户界面引入的输入设备来移动光标或者点触图形对象,实现对应
用程序的直接操纵:这是一种事件驱动方式,它体现了人在控制应用程序运行中
的中心地位.
4)界面定制图形用户界面一方面提供了可视的(如窗口,滚动条,控
制面板等)和不可视的(如屏幕,颜色,字体等)界面对象,另一方面又允许用
户根据需要对应用程序的界面进行剪裁和定制,如移动,缩小或放大窗口,设置
颜色,字体或者鼠标键等.
5)信息反馈图形用户界面的帮助机制能为用户操作界面提供导航,而
它的保护机制又为系统的可靠运行提供容错排错,这两者都有大量的信息反馈.
6)界面一致图形用户界面系统作为一个完整的运行环境,应该提供一
个不依赖于具体问题的界面设计标准,使得在该环境下运行的各种应用程序的界
面风格与用户交互的方式都具有良好的一致性.
1.2.3图形用户界面的结构模型
一个图形用户界面系统通常由三个基本层次组成,即显示模型,窗口模型和
用户模型.用户模型包含了显示和交互的主要特征,因此图形用户界面这一术语
有时也仅指用户模型.下表给出了图形用户界面系统的层次结构.
桌面管理系统
用户模型
窗口模型
显示模型
操作系统
硬件平台
表中的最低层是计算机硬件平台,硬件平台的上层是操作系统.大多数图形
用户界面系统都只能在一两种操作系统上运行.
操作系统之上是图形用户界面的显示模型,它决定了图形在屏幕上的基本显
示方式.不同的图形用户界面,系统所采用的基本显示模型各不相同.
窗口模型确定窗口如何在屏幕上显示,如何改变大小,如何移动及窗口的层
次关系等.通常包括两部分,即编程工具及如何移动,输出和读取屏幕显示信息
的说明. 窗口模型之上是用户模型,,图形用户界面的用户模型又称为图形用户界面的
视感.它也包括两部分:一是构造用户界面的工具;二是对于在屏幕上组织各种
图形对象,以及这些对象之间如何交互的说明.
1.2.4图形用户界面的一般设计原则
在图形用户界面的开发中,不同的程序员往往有不同的GUI设计风格,但
是为了得到风格严谨,高效,友好的界面,在GUI的设计中,一般都遵循以下
的原则和规范:
1)以用户为中心
GUI的一个重要设计原则是以用户为中心,在软件的整个运行过程中,用户
处于主动地位,由用户来决定何时来运行软件的各项功能,即要使用户感觉到他
是软件的控制者,而不能使用户感到他被软件所控制.以用户为中心的另一个方
面是要使用户能够个性化界面的各个方面,以满足具有不同文化背景,便好,技
桌面管理系统
用户模型
窗口模型
显示模型
操作系统
硬件平台
表中的最低层是计算机硬件平台,硬件平台的上层是操作系统.大多数图形
用户界面系统都只能在一两种操作系统上运行.
操作系统之上是图形用户界面的显示模型,它决定了图形在屏幕上的基本显
示方式.不同的图形用户界面,系统所采用的基本显示模型各不相同.
窗口模型确定窗口如何在屏幕上显示,如何改变大小,如何移动及窗口的层
次关系等.通常包括两部分,即编程工具及如何移动,输出和读取屏幕显示信息
的说明. 窗口模型之上是用户模型,,图形用户界面的用户模型又称为图形用户界面的
视感.它也包括两部分:一是构造用户界面的工具;二是对于在屏幕上组织各种
图形对象,以及这些对象之间如何交互的说明.
1.2.4图形用户界面的一般设计原则
在图形用户界面的开发中,不同的程序员往往有不同的GUI设计风格,但
是为了得到风格严谨,高效,友好的界面,在GUI的设计中,一般都遵循以下
的原则和规范:
1)以用户为中心
GUI的一个重要设计原则是以用户为中心,在软件的整个运行过程中,用户
处于主动地位,由用户来决定何时来运行软件的各项功能,即要使用户感觉到他
是软件的控制者,而不能使用户感到他被软件所控制.以用户为中心的另一个方
面是要使用户能够个性化界面的各个方面,以满足具有不同文化背景,便好,技
能水平和硬件配置的用户的要求.为此,界面必须在颜色,字体和打印设置等方
面提供不同的选项.
z)一致性
一致性是指界面的同类操作和交互方式是大致相同的.一致性可以使用户在
进行新操作或使用新软件时能够运用己学会的交互知识,并且能使用户更快地学
习新的交互知识.如果软件的界面具有较强的一致性,用户可以将更多的精力用
于掌握软件本身的功能而不必记忆交互式的差异.一致性包括同一软件中的一致
性与操作系统界面的一致性两个方面.
3)简洁性
界面应该是简洁的,它只包含使用户能与软件进行正确交互的最少信息,而
不应该保护其他无关的信息.如果界面上的信息过多过杂,用户就难以从中找到
与操作有关的,关键的信息,从而造成操作上的困难.保持界面简洁性的一个重
要技术是逐步显示.逐步显示是指不把要显示的信息一次性地显示出来,而是随
着用户的操作进程的进行逐步将信息显示出来.例如,在菜单设计中使用级联菜
单,或者将相关的菜单项合并成一个对话框,点击某个菜单项将弹出这个对话框.
通过上述方法,一个复杂的菜单将变的简洁和易于使用.
4)可恢复性
用户在使用软件时是很难避免不犯错误的,因此界面必须在用户易犯错误的
部分出现相关的警告信息,并且尽可能地提供从所犯错误中恢复的功能.例如用
户在退出时忘记保存文件,这时应该出现一个消息框提示用户保存文件;再如在
编辑软件菜单中提供"撤销"选项,使用户能够取消前几次对文件的编辑或者
修改. 5)美观性
可视化设计是软件界面设计的一个关键方面,软件各个部分的可视化要素为
用户提供了有关该部分交互特征的重要信息.但是,出现在屏幕上的所有可视化
要素都在吸引用户的注意力.因此界面设计必须美观大方,否则就给人以杂乱无
章之感,并且千扰软件和用户为了达到界面的美观性,在可视化要素的空间位置
选择上应分清主次,将重要要素放在显著位置:界面上不要使用太多种类的颜色,
避免过于花哨;根据软件的不同特点选择界面颜色,例如游戏软件应该选择较鲜
艳的颜色,商业软件应选择稳重的颜色;在界面设计上可引入三维效果,但不宜
过多. 6)提供反馈
为了增强软件的交互性,GUI必须为用户的每一个动作提供视觉或者听觉的
反馈,通过这样的反馈,用户可以得知软件的运行状态.有效的反馈因该是及时
的,并且尽量靠近引起反馈的界面部分.如果软件要用较长时间完成一段任务,
应该用进程显示器的方式向用户提供取消选项.根据所提供信息量的大小合理选
择反馈方式,简单的反馈包括鼠标指针的改变,按钮状态的变化,状态栏信息等;
复杂的反馈可以在需要时产生一个对话框.
7)提供帮助
在线用户帮助是软件设计的不可缺少的部分,只有提供多样的帮助,用户才
会知道正确的使用软件.典型的在线用户帮助分为上下文帮助,参考帮助和用户
向导三部分.
1.3课题背景
嵌入式设备可以分为信息家电,移动计算设备,网络设备和工控仿真设备等
几类.我们着重谈信息家电.在信息家电的概念中,如果从智能办公,智能家居
的角度看,已经深入延升到工作,生活各个角落的固定电话,无疑是一个应该引
起重点关注的角色.固定电话自诞生以来,基本是以传输语音为主要功能,而随
着互联网,信息技术的飞速发展,人们最大限度获取需要的信息,成为了一种迫
切的需求.在这种需求下,固定电话如果按照功能需求进行细分,经过改造设计
成为一种新的信息终端,从成本,可操作性,可普及性,灵活性等方面来看,与
电脑相比,具有价格低,易操作,便携,普及性强等优势,在信息,娱乐,多媒
体,电子商务尤其是电信增值服务方面,将具有巨大的市场,中国电信推出的固
网短信已经解开这个巨大市场的序幕一角.
在这种背景下,北京邮电大学微机电实验室与北京平治东方科技有限公司决
定合作开发基于具有PDA功能的智能商务电话,并于2001年开发出第一代产品.
在产品设计上,这是一种概念独特的智能通信终端,集电话,PDA,网络功能于
一体.它既有有来电显示电话的功能,又因为增加了处理芯片,还可以对来电,
去电进行有效的数据处理.不仅集成了目前PDA的多数功能,而且还可以通过
名片管理将PDA与电话功能结合到一起.在网络功能上,可以收发电子邮件,
通过第三方网站群发手机短信息,在后期产品中,还将包括全功能的WEB浏览
器.显示屏采用大屏幕LCD (320x240),十六级灰度背光显示,手写板输入,
采用汉王手写识别系统.在推向市场后,受到了消费者极大的欢迎.
但是第一代产品没有操作系统的支持,所以也就没有API编程接口,
TCP/IP, PPP等网络协议需要自己开发,而且在图形用户界面(GUI)的实现上,
将GUI与应用程序混在一起,从而造成了一定的代码重复,使得整个系统的移
植性较差.由于这些缺点的存在,促使项目组考虑进行第二代产品的开发工作.
经过详细的调用与论证,最终确定在第二代产品中,采用uClinux操作系统,并
将GUI作为一个单独的层从应用程序中剥离出来,从而实现良好的移植性,为
在后续产品不同的硬件平台上的实现奠定基础.
在第二代产品研发中,本实验室承担了uClinux系统的研究,开发,移植,
文件系统,GUI系统以及部分应用模块的开发工作,其中本人则主要负责GUI
系统的方案确定与设计实现,这也是本篇论文的主题所在.
尽管嵌入式系统对GUI的需求越来越明显,但目前开发方法各不相同
1)自己开发较为简单的GUI系统.
2)某些大型厂商有能力自己开发满足自身需要的功能完备的GUI系统.
3)采用某些比较成熟的GUI系统,EL如MiniGUL MicroWindows或者
其他.
在上述实现方法中,第一种方法可以说是一种临时解决方案'就像我们的第
一代产品,利用这种手段编写的程序,无法将显示逻辑和数据处理逻辑划分开来,
从而导致程序结构不好,不便于调试,并导致大量的代码重复,移植性差.其实,
GUI是一种类似于操作系统的基础软件,这种软件系统应该遵循一定的标准,
并且应该是开放源码的自由软件,从而可以让开放商集中精力开发自己的应用程
序.目前看来,在Linux之上进行嵌入式系统开发的厂商,一般选择如下几种
GUI系统:紧缩的X Window系统,MiniGUI, MicroWindows, OpenGUI,
QT/Embedded等,这样做,一是这些系统由于开放源代码,经过了许多人的补
充,功能完备,稳定性好;二是可以节省自己的开发成本,效率较高.所以我决
定采用第三种方法,从现在几种成熟的GUI系统中,选择一种比较合适的来在
我们开发板上实现.
第二章嵌入式Linux操作系统与uClinux
2.1嵌入式操作系统的相关产品,水平,现状和技术发展
趋势 从八十年代起,国际上就开始进行一些商用嵌入式系统和专有操作系统的开
发.他们开发嵌入式系统己经有二十多年的经验,目前的应用范围也比较广泛,
下面介绍一些著名的嵌入式系统.
.Windows CE:
Microsoft Windows CE是一个简洁的,高效率的多平台操作系统.它不是削
减的Windows95版本,而是从整体上为有限资源的平台设计的多线程,完整优
先权,多任务的操作系统.它的模块化设计允许它对于从掌上电脑到专用的工业
控制器的用户电子设备进行定制.操作系统的基本内核需要至少200K的ROM.
从SEGA的DreamCast游戏机到现在大部分的高价掌上电脑,都采用了Windows
CE,但是无奈价格太高,使得整个产品的成本急剧上升.
.VxWorks:
去年VxWorks所在的公司WindRiver兼并了PSOS的ISI公司,使得该公司
现在有两大RTOS系统.VxWorks是目前嵌入式系统领域中使用最广泛,市场占
有率最高的系统.它支持多种处理器,如x86, i960, Sun Sparc, Motorola MC68xxx,
MIPS RX000, POWER PC等等.使用的是和UNIX不兼容的环境,大多数的
VxWorks API是专有的.采用GNU的编译和调试器.
.QNX:
QNX是一个实时的,可扩充的操作系统,它遵循POSIX 1(程序接口)和
POSIX.2 (Shell和工具),部分遵循POSIX.Ib(实时扩展).它提供了一个很小的微
内核以及一些可选的配合进程.其内核仅提供4种服务:进程调度,进程间通信,
底层网络通信和中断处理,其进程在独立的地址空间运行.所有其它OS服务,
都实现为协作的用户进程,因此QNX内核非常小巧(QNX4.x大约为12Kb)而且
运行速度极快.这个灵活的结构可以使用户根据实际的需求将系统配置成微小的
嵌入式操作系统或是包括几百个处理器的超级虚拟机操作系统.
.Palm OS:
3Com公司的Palm OS在PDA市场上占有很大的市场份额,它有开放的操
作系统应用程序接口(API),开发商可以根据需要自行开发所需要的应用程序.
目前已经有总共3500多个应用程序可以运行在Palm Pilot上,其中大部分应用
程序均为其他厂商和个人所开发,使得Palm Pilot的功能得以不断增多.这些软
件包括计算器,各种游戏,电子宠物,地理信息等等.在开发环境方面,可以在
Windows 95/98, Windows NT以及Macintosh下安装Palm Pilot Desktop; PlamPilot
可以与流行的PC平台上的应用程序如Word, Excel等进行数据交换.
.LynxOS:
Lynx Real-time Systems的LynxOS是一个分布式,嵌入式,可规模扩展的实
时操作系统,它遵循POSIX.Ia, POSIX.lb和POSIX.Ic标准.LynxOS支持线程
概念,提供256个全局用户线程优先级;提供一些传统的,非实时系统的服务特
征;包括基于调用需求的虚拟内存,一个基于Motif的用户图形界面,与工业标
准兼容的网络系统以及应用开发工具.
.Linux:
Linux是一套以UNIX为基础发展而成的操作系统.自1991年诞生至今,
Linux在很多方面己经赶上甚至超过了很多商用的UNIX系统.它充分利用了
x86CPU的任务切换机制,实现了真正的多任务,多用户环境.而近年来Linux
在嵌入式系统中的应用可以说是如火如茶,有关详细情况,我们在下节详细论述.
2.2嵌入式Linux的优势
嵌入式Linux则是按照嵌入式操作系统的要求而设计的一种小型操作系统.
由一个Kernel(内核)及一些根据需要进行定制的系统模块组成.其Kernel很小,
一般只有几百KB左右.即使加上其他必须的模块和应用程序,所需的存储空间
也很小.一个小型的嵌入式Linux系统只需要引导程序,Linux微内核,初始化进
程3个基本元素.运行嵌入式Linux的CPU可以是x86, Alpha, Spare, MIPS, PPC
等.与这些芯片搭配的主板都很小,与一张PCI卡大小相当,有的甚至更小.嵌
入式Linux所需的存储器不是软磁盘,硬盘,Zip盘,CD-ROM, DVD这些众所周
知的常规存储器,它使用Rom, CompactFlash, M-Systems的DiskOnChip, Sony
的MemoryStick. IBM的MicroDrive等体积极小—与主板上的BIOS大小相近,
存储容量不太大的存储器.它的内存可以使用普通的内存,也可以使用专用的
RAM. Linux作为嵌入式操作系统的另外一个优势是:内核提供对多种处理器的支
持,并且正在进一步增加对嵌入式微处理器的支持,可应用于多种硬件平台.
Linux目前的内核支持Intel x86, Motorola/IBM PowerPC, Compaq(DEC)Alpha,
IA 64, S/390, SuperH等处理器体系结构,并且已经被成功移植,这对受开销,
时间限制的研究与开发是很有吸引力的.原型可以在标准平台上开发后移植到具
体的硬件上,加快了软件与硬件的开发过程.Linux采用一个统一的框架对硬件
进行管理,从一个硬件平台到另一个硬件平台的改动与上层应用无关.
而且可以说Linux是网络的代名词.没有网络,就不可能产生世界各地高手
云集的情况,也就不可能产生高手们共同开发出来的操作系统—Linux. Linux
的产生条件是网络,Linux的生存条件也是网络,这就是这一网络操作系统的关
键特性. Linux内核对网络协议栈的设计是从简洁实用的角度出发,实现出一整套的
网络协议模块.Linux不仅可以支持一般用户需求的ftp (file transfer protocol),
telnet和rlogin协议,还能提供对网络上其他机器内文件的访问(NFS,网络文件
系统). Linux还可以支持SLIP (Serial Line Interface Protocol)和PLIP (Parallel Line
Interface Protocol)协议,使得通过串口和并口线进行连接成为可能.通过AX.25
协议,Linux可以提供通过无线电进行连接的方式:通过在Linux上开发Novell标
准的IPX协议,Linux可以访问Netware网络.如果在Apple机的世界里面,可以通
过AppleTalk协议访问Apple的网络.在Windows9x/NT局域网里面,可以通过
Samba协议进行Linux和Windows之间的文件共享.通过Apache公司开发的免费网
络服务器,可以利用Linux系统作为强大的网络服务器,提供Internet上电子商务
和数据提供服务.
当然,最重要的是Linux不是某个公司的私有财产,它是一个开放软件,是
免费的和源代码公开的.Linux在这几年不断成熟,越来越多的人加入了Linux
的行列,以前Linux只是一群黑客的玩具和专家的实验用操作系统,而现在即使
是电脑的普通用户也在用Linux.为Linux提供服务的公司也开始出现,为客户
提供专业化的技术支持.但实际上不用花钱也可以通过Internet新闻组得到强大
的Linux技术支持和帮助.对Linux的支持绝大部分是通过用户团体在Usenet
新闻组上提供的.这上面广泛收集有大量的FAQ,其内容包括Linux安装,配置
和故障定位的方方面面.在Usenet上提供的许多这方面的材料现在已经被一些
出版商如Walnus Creek等公开出版了.所有的这些,都是现有的嵌入式操作系
统所无法比拟的.
在嵌入式Linux产品中,应用最为广泛的是uClinux和RT-Linux.前者主
要用于微控领域,后者更侧重于实时系统.由于我们的开发板采用的是uClinux,
所以有必要对它的特点进行一下详细的分析.
2.3 uClinux分析
uClinux是Linux 2.0版本的一个分支,它被设计用来应用于微控制领域.我
们都知道,Linux是一种很受欢迎的操作系统,它与UNIX系统兼容,开放源代码.
它原本被设计为桌面系统,现在广泛应用于服务器领域.而更大的影响在于它正
逐渐地应用于嵌入式设备.uClinux正是在这种氛围下产生的.
uClinux最大的特征就是没有MMU(内存管理单元模块).它很适合那些没
有MMU的处理器,例如mc68ez328,而这也正是本课题所采用的处理器.这
种没有MMU的处理器在嵌入式领域应用地相当普遍.
由于没有MMU,这意味着uClinux不能使用处理器的虚拟内存管理技术.
但是仍然采用存储器的分页管理,系统在启动时把实际存储器进行分页.在加载
应用程序时程序分页加载,但是由于没有MMU管理,所以实际上uClinux采用
实存储器管理策略((real memory management).即:uClinux系统对于内存的访问
是直接的(它对地址的访问不经过MMU,而是直接送到地址线上输出),所有
程序中访问的地址都是实际的物理地址.操作系统对内存空间没有保护(这是很
多嵌入式系统的特点),各个进程实际上共享一个运行空间(没有独立的地址转
换表). 在uClinux中,一个进程在执行前,系统必须为进程分配足够的连续地址空
间,然后全部载入主存储器的连续空间中.与之相对应的是,标准Linux系统在
分配内存时没有必要保证实际物理存储空间是连续的,而只要保证虚存地址空间
连续就可以了.程序加载地址与预期(Id文件中指定的)通常都不相同,这样重
的Linux技术支持和帮助.对Linux的支持绝大部分是通过用户团体在Usenet
新闻组上提供的.这上面广泛收集有大量的FAQ,其内容包括Linux安装,配置
和故障定位的方方面面.在Usenet上提供的许多这方面的材料现在已经被一些
出版商如Walnus Creek等公开出版了.所有的这些,都是现有的嵌入式操作系
统所无法比拟的.
在嵌入式Linux产品中,应用最为广泛的是uClinux和RT-Linux.前者主
要用于微控领域,后者更侧重于实时系统.由于我们的开发板采用的是uClinux,
所以有必要对它的特点进行一下详细的分析.
2.3 uClinux分析
uClinux是Linux 2.0版本的一个分支,它被设计用来应用于微控制领域.我
们都知道,Linux是一种很受欢迎的操作系统,它与UNIX系统兼容,开放源代码.
它原本被设计为桌面系统,现在广泛应用于服务器领域.而更大的影响在于它正
逐渐地应用于嵌入式设备.uClinux正是在这种氛围下产生的.
uClinux最大的特征就是没有MMU(内存管理单元模块).它很适合那些没
有MMU的处理器,例如mc68ez328,而这也正是本课题所采用的处理器.这
种没有MMU的处理器在嵌入式领域应用地相当普遍.
由于没有MMU,这意味着uClinux不能使用处理器的虚拟内存管理技术.
但是仍然采用存储器的分页管理,系统在启动时把实际存储器进行分页.在加载
应用程序时程序分页加载,但是由于没有MMU管理,所以实际上uClinux采用
实存储器管理策略((real memory management).即:uClinux系统对于内存的访问
是直接的(它对地址的访问不经过MMU,而是直接送到地址线上输出),所有
程序中访问的地址都是实际的物理地址.操作系统对内存空间没有保护(这是很
多嵌入式系统的特点),各个进程实际上共享一个运行空间(没有独立的地址转
换表). 在uClinux中,一个进程在执行前,系统必须为进程分配足够的连续地址空
间,然后全部载入主存储器的连续空间中.与之相对应的是,标准Linux系统在
分配内存时没有必要保证实际物理存储空间是连续的,而只要保证虚存地址空间
连续就可以了.程序加载地址与预期(Id文件中指定的)通常都不相同,这样重
定址(relocation)过程就是必须的.此外磁盘交换空间也是无法使用的,系统执
行时如果缺少内存,将无法通过磁盘交换得到改善.
这个特点也就决定了开发人员不得不参与系统的内存管理,从编译内核开
始,需要告诉系统这块开发板到底有多少内存,从而系统将在启动的初始化阶段
对内存进行分页,并且标记已使用的和未使用的内存.系统将在运行应用程序时
使用这些分页内存.有关这方面的工作由其他同学完成,这里不再赘述.
从内存的访问角度看,开发人员的权利增大了,在编程时可以访问任意的地
址空间,这点可以在后面我采用的一个使用套接口通信传递地址指针,从而实现
进程间通信的小技巧中得以体现.
虽然uClinux的内存管理与标准Linux系统相比功能相差很多,但这是嵌入式
设备的特点所决定的.在嵌入式设备中,由于成本等敏感因素的影响,普遍采用
不带MMU的处理器,这决定了系统没有足够的硬件支持来实现虚拟存储管理技
术.从嵌入式设备实现的功能来看,嵌入式设备通常在某一特定的环境下运行,
只要实现特定的功能,内存管理的要求完全可以由开发人员来考虑.
同标准的Linux相比,由于uClinux不支持MMU,多任务的实现需要一定的
技巧.但是,在uClinux上运行的绝大多数的用户程序并不需要多任务.另外,
针对uClinux内核的二进制代码和源代码都经过了重新编写,紧缩和裁减了基本
的代码.这使得uClinux的内核同标准的Linux 2.0的内核相比非常小,但是却仍
然保留了Linux操作系统的主要优点,如稳定性,强大的网络功能和出色的文件
系统支持等.uClinux有一个完整的TCP/IP协议栈,同时对其它许多的网络协议
都提供支持.这些网络协议都在uClimix上得到了很好的实现,可以说uClinux是
一个针对嵌入式系统的优秀网络操作系统.uClinux支持的文件系统有多种,其
中包括了常用的NFS(网络文件系统),ext2(第二扩展文件系统,它是Linux
文件系统的实际上的标准),
以上所提及的特点和优点MS-DOS及FAT16/32等.
,也正是智能商务电话项目采用uClinux的原因所
在.
2.4系统开发环境
建立系统开发环境的工作由其他开发人员完成,这里进行一下简单的介绍
1.宿主机
安装Redhat6.2操作系统.
运行linuxconf,配置NFS.
安装uClinux系统.
安装PERL模块.
目标板
将目标板和宿主机如上图进行连接.在linux操作系统下通过PERL程序,
或者在Win98下通过摩托罗拉的Bbug烧写程序,将在宿主机上uClinux
下编译好的linux内核(带有一个小的文件系统)烧写到开发板的第一片
Flush中.'
烧写完后,启动目标板,通过minicom, ping命令测试串口和网口是否
连通.
通过运行nfsmount,登陆到宿主机上,并运行其上的测试例程,如果成
功执行,则说明一切良好,至此,整个开发环境建立成功.
3.3应用程序的编译和调试工具
在嵌入式Linux的开发中,一般首选GNU系列工具.GNU开发套件作为通
用的开放套件,包括一系列的开发调试工具石我们使用的主要组件有:
1. C编译器:根据我们板子所选CPU,选用m68k-gcc-elf,可以做成交叉
编译的形式,即在宿主机上开发编译目标板上可运行的二进制文件;
2. Binutils:一些辅助工具,包括m68k-gcc-objdump(可以反编译二进制文
件),m68k-gcc-ar(生成静态库),m68k-gcc-Id(链接器)等;
3. GDB调试器:用于在PC上调试.
需要指出的是,上述使用的编译器,链接器和定址器等都是在宿主机上运行
的,而最终经过编译一调试一重新定址所得到的二进制可执行文件是在目标板上
运行的,此即"交叉调试"
4. AUTOCONF. AUTOMAKE工具:用于自动生成Makefile文件.由于源
代码文件较多,单个手工书写.Makefile文件是不现实的,使用该工具,可以根
据目录结构,以及相互关系,自动生成所需的Makefile文件,而且易于进行版
本控制
22
第三章GUI体系结构设计
3. 1 GU工系统选型
目前比较成熟的GUI系统,以下几种较为多见:紧缩的X Window, OpenGUI,
QT/Embedded, Microwindows和MiniGUI.下面对这些系统进行简单介绍,并对
它们的优缺点进行比较.
紧缩的X Window是Linux以及其他类UNIX系统的标准GUI. X
Window的特点是网络透明.它的体系结构是建立在US模型基础上的,由
X-server (X服务器)来创建并操纵屏幕上的图形和字符的显示以及输入事件.
X Window将系统依赖硬件的大部分细节都隐蔽在X-server中,这意味着两个特
点:一是使X Window程序具有设备独立性;另一方面降低了效率,增加了本身
的大小,这是其在嵌入式系统中实现的最大障碍,X-server的实现要占用超过IM
的ROM, 2M-4M的RAM,而我们的开发板的RAM一共才4M.
OpenGUI在Linux系统上存在已经很久了,功能强大,运行速度快,使用方
便.支持鼠标和键盘事件,可以基于Framebuffer实现绘图.但是其内核使用汇
编语言实现,移植性较差,而且只提供C++接口.
QT[Embedded是著名的QT库开发商Trolltech正在进行的面向嵌入式系统
的QT版本.这个版本的主要特点是可移植性较好,许多基于QT的X Window
程序可以非常方便地移植到嵌入式系统.但是该系统不是开放源码的,如果要使
用这个库,可能需要支付昂贵的授权费用.
Microwindows是一个开放源代码项目,提供了现代图形窗口系统的一些特
性.它不需要其他图形系统的支持,在Linux操作系统上,Microwindows也可
以充分利用Linux提供的Framebuffer机制来进行图形显示.Mcrowindows的移
植性很强,它支持很多软硬件.但是Mcrowindows的开发重点在底层的图形引擎
上,窗口系统和图形接口方面的功能还比较欠缺,而且在多字符集的支持上尚没
有同一接口.
MiniGUI是国内做得较好的自由软件之一.它是在Linux控制台上运行的多
窗口图形用户支持系统,可以在以Linux为基础的应用平台上提供一个简单可行
的MiniGUI支持系统.MiniGUI使用类似于Win32API来获得简单的具有
Windows风格的图形用户界面.
MiniGUI的主要特色有:
1)遵循LGPL'条款的纯自由软件.
2)提供了完备的多窗口机制.这包括:多个单独线程中运行的多窗口,单个线
程中主窗口的附属,对话框和预定义的控件类(按钮,单行和多行编辑框,
列表框,进度条,工具栏等).
消息传递机制.
多字符集和多字体支持,目前支持IS08859-1, GB2312, Big5等字符集,
并且支持各种光栅字体和TrueType, Type 1等矢量字体.
BMP, GIF, JPEG, PCX等常见图像文件的支持.
Windows的资源文件支持,如位图,图标,光标,插入符,定时器,加速键
等.
,.JJ,es声
门J4
,,声,,J
一勺67)高稳定性和高性能.MiniGUI已经在Linux发行版安装程序,CNC系统,
蓝点嵌入式系统等关键应用程序中得到了实际的应用.
8)可移植性好.
Mcrowindows和MiniGUI的可移植性都非常好,而且都是开放源代码的自由
软件项目,但是MiniGUI在窗口系统和图形接口方面的功能更好,而且其类似
微软Windows的风格非常适合我们智能商务电话的界面设计需要.中科院EEOS
开发组已经成功地将MiniGUI移植到了他们的POSIX兼容系统上.蓝点软件
(北京)研发中心也己经成功地将MiniGUI移植到了两款基于StrongARM的
嵌入式系统上.基于此,本项目决定采用MiniGUI,分析并借鉴其特点进行自己
的GUI系统开发.
I
LGPL和MPL条款LGPL指Library
金会发布的专门针对函数库的自由软件条款
某个软件使用了遵循LGPL条款的自由软件
件可以不公开其源代码.这使得在LGPL
MPL指Mozilla Public License,是由
Mozilla的授权条款.
General Public License.是自由软件基
,它比著名的GPL条款的限制宽松.如果
,并且只以动态连接的形式连接,则该软
的自由软件之上建立商业应用软件成为可能.
Netscape所发布的用于其公开源码的浏览器
3.2总体分析
由于决定借鉴MiniGUI进行适合我们开发板GUI设计开发,所以有必要对之
进行详尽的分析,并结合我们开发板的具体情况找出不兼容的地方,提出解决的
方案.完成这个工作需要对上百个文件组成的源代码进行研读,工作艰苦而枯燥,
但这是确定我们最终方案的基础.我们重点谈谈以下几个方面.
1.分层设计
从整体结构上看,MiniGUI.是分层设计的.在最底层,图形抽象接口((GAL)
和输入抽象接口(工AL)提供底层图形接口以及鼠标和键盘的驱动;中间层是
MiniGUI的核心层,包括构成窗口系统的各个部分;最顶层是API,即应用程序
编程接口.
应用程序接口
核心层
图形抽象层输入抽象层pthread
图3.1 MiniGUI的分层设计
GAL和IAL为MiniGUI提供了底层的Linux控制台或者X Window上的
图形接口以及输入接口,而Pthread是用于提供内核级线程支持的C函数库.
这种设计具有明显的优点,对上层应用程序,它提供标准的接口,对底层,通过
图形抽象层和输入抽象层又可以屏蔽不同硬件之间的差异,从而使得GUI系统可
以具有良好的移植性,关于这点,我们在详细实现的章节将要重点介绍.
从其源文件中可以看到,关于GAL,目前己经注册了SVGA. LibGGI等多种
图形引擎,而且对于其它特殊的底层图形驱动以一种"私有引擎"(native)的
方式留有标准接口,根据实际情况的不同与这个接口对接,就可以实现图形引擎
的扩充.具体在我们的开发板上,由于uClinu的内核提供了基于framebuffer
的图形驱动,所以我们只要让这个图形驱动适合开发板的硬件条件,就可以通过
framebuffer实现与原来GUI系统的对接.
输入抽象层"AL)特点与图形抽象层有些类似,这是将输入设备抽象出来
的一个输入接口,其目的是要屏蔽具体输入设备之间的差别.但是在嵌入式设备
中,由于其体积小,便携性等特点的限制,输入设备的采用是多种多样的.像
PDA这样的便携设备就采用触摸屏和快捷键的方法,来实现输入,我们智能商务
电话的开发板也使用同样输入设备.MiniGUI系统在IAL上的实现,从源代码中
输入设备的数据结构可以看出,主要是针对鼠标和键盘这样的标准PC输入设备
的,而对于触摸屏,快捷键这样的输入设备并没有提供标准的接口,其实也不可
能实现面向千差万别的输入设备的统一接口.因此在输入抽象层上,我们需要重
新实现输入设备接口的数据结构以及与开发板设备相关的一些函数.
2微客户/服务器结构
客户/服务器模式更多的是用于借助网络实现的一种进程间数据交流的一种
机制.在MiniGUI中的实现其实是一种在本地单一主机同一进程的不同线程间来
交互数据,所以说它是微客户用及务器机制.
在多线程环境中,与多进程间的通讯机制类似,线程之间也有交互和同步的
需求.比如,用来管理窗口的线程维持全局的窗口列表,而其他线程不能直接修
改这些全局的数据结构,而必须依据"先来先服务"的原则,依次处理每个线程
的请求,这就是一般性的客户/服务器模式.
微客户/服务器机制的核心实现主要集中在消息队列数据结构上.比如,
MiniGUI中的desktop微服务器管理窗口的创建和销毁.当一个线程要求
desktop微服务器建立一个窗口时,该线程首先在desktop的消息队列中放置
一条消息,然后进入休眠状态而等待desktop处理这一请求,当desktop处理
完成当前任务之后,或正处于休眠状态时,它可以立即处理这一请求,请求处理
完成时,desktop将唤醒等待的线程,并返回一个处理结果.
当MiniGU工在初始化全局数据结构以及各个模块之后,MiniGUI要启动几
个重要的微服务器,它们分别完成不同的系统任务:
desktop用于管理MiniGUI窗口中的所有主窗口,包括建立,销毁,显示,
隐藏,修改Z-order,获得输入焦点等等.
parser线程用来从IAL(input abstract layer)中收集鼠标和键盘事件,
并将收集到的事件转换为消息而邮寄给desktop服务器.
timer线程用来触发定时器事件.该线程启动时首先设置
然后等待desktop线程的结束,
该线程处理该信号并向desktop
即处于休眠状态.当接收到
Linux定时器,
SIGALRM信号时,
服务器发送定时器消息.当desktop接收到定
时器消息时,desktop会查看当前窗口的定时器列表,如果某个定时器过期,则
会向该定时器所属的窗口发送定时器消息.
我们可以看到实现微客户/服务器机制的前提是操作系统支持多线程,但是
我们采用的uClinux是不支持多线程的,没有pthread库.而我们在智能商务电
话的远期产品的目标中有多用户多进程的需求,因此,我们有必要保留这种客户
/服务器机制,但是在具体实现上需要另行设计.商务电话的多数功能与PDA类
似,这种便携设备运行的一个特点就是,启动后程序就一直死循环中运行,在循
环中如果有事件发生,则处理事件和消息,否则就一直循环等待.我们可以这样
设计,系统在启动初始化后,启动一个程序(进程)在后台运行,作为服务器,
它来加载GUI系统所需的所有共享资源(位图,图标,字体等),并维护一个消
息队列.其它程序运行时作为客户端,与服务器交互.
但是继续分析MiniGUI中资源共享的实现,发现是通过共享内存方式的IPC
机制来进行的,而uClinxu对此同样不支持.不过我们上面在对uClinux进行分
析时已经提到,在没有MMU的处理器上,系统不存在内存保护.这为我如何实现
资源共享提供了思路,我们可以在服务器端加载共享资源结束后,得到资源加载
内存区的地址指针,然后通过套接口通信的方式传递给客户端,客户端直接到这
个地址去读取资源信息.而套接口正是GUI系统实现客户/服务器通信所采用的
机制,如果再加入一个对共享资源内存地址请求的处理,就可以实现.对于这个
想法能否实现,我做了一些实验,并获得了成功,详细细节将在下一掌具体阐述.
3.面向对象技术思想的应用
面向对象的技术在当今的软件编程中有着广泛的应用,其实现的数据封装,
代码可重用性,安全性以及可扩展性等等为很大程度地提高了软件各项性能.从
MiniGUI的代码中,这种思想在控件的实现中也具得到了一定的体现.
借用面向对象技术的术语,在GUI中,每个控件都对应一个子窗口类(控件
类),是控件类的一个实例.相同的控件具有相同的属性和行为,每个控件的消
息都由该控件所属控件类的回调函数进行处理,从而这样就保证每个属于统一控
件类的控件均保持有相同的用户界面和处理行为.如果想要使某个控件既有该控
件同样的行为,又具有其特殊衍生的行为功能,可以对其进行重载和派生.我们
只要在调用这个控件的回调函数函数之前,首先调用自己定义的处理函数即可实
现.这种面向对象的思想在控件类和控件中的体现可以用下图表示:
Edit控件类
二styleCallback P(OC
Button控件类
"Pt",
n.n.侣
style
Callback尸roc
n亡Xt
图3.2控件类和控件的关系
这种面向对象思想的应用,为我们根据智能商务电话需要来添加控件提供了
很大的方便性.比如,我们的输入设备是触摸屏,在字符输入时要用到软键盘,
我在设计中就将软键盘做成了一个控件,定义了它的属性和行为,从而实现字符
输入.
4.消息和消息循环
在面相对象的程序设计中有一个重要的概念就是"事件驱动",其含义就是
程序执行不再是面向过程的,即不再是一个入口和若干个出口组成的串行路线.
而是一直处于一个循环之中,在循环之中捕捉外设的某些事件,比如在我们的开
发板中触摸屏的点击,电话快捷键的按下,电话呼叫(来电显示)等事件.程序
在捕捉到这些事件后,对其进行处理,做出响应,从而完成一定的功能.
而与"事件驱动编程,,直接相关的概念就是"消息"和"消息循环',.消息
就是外设发生的事件按事先约定转换成一定的格式(即特定的消息),而后应用程
序建立和维护一个由消息组成的队列,系统在循环中取出消息,进行处理或者向
对应的窗口分发.MiniGUI在实现中,由于在微客户/服务器机制中采用了多线
程,其在消息循环的处理时,是每个线程对应一个消息队列.用下图可以简单表
不:
图3.3消息驱动应用程序的简单示意图
上面我们已经讲到,我们的开发板是不支持多线程的,所以在这个问题上的
处理上,我将做适当修改,只采用一个消息队列和消息循环.另外,在事件的定
义上,还需要增加触摸屏的笔点击事件和电话快捷键事件,以及相应的消息处理
以上我从四个主要的方面,结合我们开发板的具体软硬件情况对MiniGUI
做了分析,并提出了相应的适合开发板的解决方案.另外还存在一些情况,比如
我们的开发板以及最终产品使用的单色十六级灰度的LCD显示器,显然不适应原
GU工系统的彩色RGB机制,所以需要修改.通过对源代码的研究,我发现系统在
对不同的颜色进行RGB转换后,共有十六种不同取值,正好对应我们开发板的十
六级灰度(很巧合).所以我只要将这十六个值直接对应十六个灰度级别即可,
而LCD上每个点由四个比特来表示,与MiniGUI定义诸如亮灰,浅白,深蓝等风
格相对应,我给它定义成黑,浅黑,重灰,灰,浅灰,浅白等八个风格,以实现
不同的界面颜色风格以及立体感.实验显示的效果很好,富有层次感,完全满足
最终产品的要求.
再则,MiniGUI实现了多字体支持,处理字体和字符集的模块当中引入了逻
辑字体的概念.逻辑字体是MiniGUI用来处理文本(包括文本输出和文本分析)
的顶层接口.逻辑字体接口将各种不同的字体(比如宋体,黑体和揩体)和字体
格式(比如等宽字体,变宽字体等光栅字体和TrueType等矢量字体),以及各
种不同字符集(ISO-8859, . GB2312, Big5, UNICODE等)综合T起来,从而可
以通过统一的接口显示不同字符集的不同字体的文本.MiniGUI对多字体的支持
显然有助于我们满足以后升级产品的需要,但是对当前的产品并无多大用处.由
于LCD显示屏的大小,以及内存的限制,我们不可能,也没有必要加载和使用
全部字体.所以在调试实现时,我只采用了其中的两种,一种显示英文字符,一
种显示汉字,其余的则全部裁剪掉.实践证明,已经能够满足要求.
以上两中情况的实现不太复杂,所以我在这里进行了说明.
3. 3 GU工体系结构设计
通过以上分析,我最终确定的GUI分层结构如下:
图4.4 GUI层次结构
整体的设计分为三层,最低层是GAL和IAL层,分别提供底层图形接口和
触摸屏的驱动;中间层是GUI的核心层,包括窗口系统必不可少的各个模块;
最上层是编程接口API.分层的原则是保证GUI系统及上层应用模块的可移植
性,其一,图形抽象层和输入抽象层定义不依赖于任何特殊硬件的抽象接口屏蔽
底层不同硬件之间的差异,并为上层提供标准的接口,屏蔽各功能函数的实现细
节;其二,中间核心层实现窗口系统的功能,为上层应用提供标准编程接口,屏
蔽具体的实现细节,这样我们可以根据实际需要在中间层扩充GUI系统的功能,
比如添加控件,改变窗口风格等,而不需要重写上层应用模块的代码.各层之间
的关系概括说就是,下层为上层提供服务并屏蔽具体实现细节.
各主要模块功能确定如下:
1.图形抽象层GAL:
定义不依赖于任何特殊硬件的抽象接口,所有顶层的图形操作都建立在抽象
接口之上.用于实现这一抽象接口的底层代码我们可以称其为"图形引擎",类似
操作系统中的驱动程序.
因为uClinux提供了Framebuffer驱动支持,所以我们使用native型的私有
引擎.实现GAL所定义的各个接口,包括初始化和终止,图形上下文管理,画
点处理函数,画线处理函数,矩形框填充函数,调色板函数等等.
2.输入抽象层IAL:
同GAL类似,定义一个抽象接口,底层事件(包括触摸屏输入,电话快捷
键的输入)的处理建立在这个接口之上.主要完成底层事件的收集与数据采集.
3.核心KERNEL:
这部分是GUI的核心,主要包括以下子模块:
(1)共享资源模块RESOURCE:
共享资源是客户服务器模型中的重要元素,它由服务器负责创建和释放,而
提供所有客户程序共享的数据资源.本模块完成共享资源的初始化和加载,包括
位图,字体,图标等三个部分.
(2)窗口模块WINDOW:
完成窗口的创建,绘制与销毁:菜单的处理:定义主窗口的缺省处理过程;
窗口的拖动,尺寸改变等处理过程:定义小键盘,触摸屏等输入设备的缺省处理
函数等.
(3)事件处理模块EVENT:
完成对底层事件进行定义及初始化:死循环等待事件;底层事件发生后判断
事件类型;为消息提供参数等功能.
(4)消息处理模块MESSAGE:
消息和消息循环模块,定义消息和消息队列的数据结构;维护消息循环队列;
从消息队列中获取消息,并分发到相应窗口的消息处理函数中.
(5)控件类模块CONTROL:
定义各控件类;包括按钮,单,多行编辑区,列表框,菜单按钮,静态文本
框,工具条,软键盘等控件类的定义及相应的处理函数.控件类概念的使用,简
化了编程并且可以很方便地通过重载而扩展控件的个性化功能.
(6)套接口通信模块SOCKET:
该模块分为两部分:服务器端和客户端.服务器端建立套接口,并一直侦听
来自客户端的连接请求,处理客户端请求:客户端建立套接口并和服务器端连接,
侦听来自服务器端的消息,读取消息并分发消息.
(7)图形设备接口GDI:
图形设备接口(Graphics Device Interface),通过GDI, GUI程序就可以在
计算机屏幕上,或者其他的显示设备上进行图形输出,其中包括:设备上下文的
获取和释放;矩形操作和区域操作;基本绘图函数;位图操作函数;逻辑字体操
作函数等.
第四章GUI系统详细设计与实现
上一章我f#I分析并确定了开发板最终GLII系统的给构,本章对整体案裘程各
模块详细实现进行论述.
4.1主流程设计
}lL-用程序的入口点为maino数,而CUI定义应用程序的入口点为
GUIMain.在这两个入口点之间,是GUI的初始化部分和结束部分.如下图所
木二
MdInC ti开始
判断是否服务器端
InitGUIC) JM始化盛数
忘-~-一一J七ee~一~一
Gt3IM幽10刀用户程序入a
Tef mina'teoI3IQ II结束处琪
End刀结束
冬庵I主程序流程
4,2初始化流越
在系统初始化时,GUI菜统将区分两种情况:服务器(Server)和客户
(Client).针对这两种不同的情况,随后的各项操作均有不FE的处理.Ini tGC)I (}
是对GUI进行初m化OWA数,它主要负责:
I获取有关终端的信息.
2.初始化图形抽象层.
4.3主要结构模块的实现
4.3. 1图形抽象层(GAL)
GUI系统维护一个己注册图形引擎数组,保存每个图形引擎数据结构的指
针.系统利用一个指针保存当前使用的图形引擎.基于硬件平台的不同,通过当
前图形引擎指针,来选择合适的图形驱动.由于开发板使用的uClinux系统提供
了基于Framebuffer的图形驱动,所以我们选用Native图形引擎.如下图所示.
已注册的图形引鳌
图形引蟹LihGGT
当前图形弓I整----份
图形引擎Framebuffe
"Framebuffer'
InitGFX
Te rmGF X
Properties
GC加anagement
Pixel
Line
Box
Palette
图4.3使用framebuffer
实现图形引擎的数据结构定义如下
typedef struct tagGFX
{
char* id;
图形引擎的GAL示意图
刀初始化和终止函数
BOOL (*initgfx) (struct tagGFX*爵);
void (*termgfx) (struct tagGFX* gfx);
//Phisical graphics context
GAL GC phyge;
int bytes_per_phypixel;
int bits_per_phypixel;
int width_phygc;
int height_phygc;
int colors_phygc;
BOOL grayscale screen;
//GC properties
int (*bytesperpixel) (GAL- GC gc);
int (*bitsperpixel) (GALes GC gc);
int (*width) (GAL-GC 9c);
int (*height) (GAL GC gc);
int (*colors) (GAL-GC gc);
//Allocation and release of graphics context
int (*allocategc) (GALes GC gc, int width, int height, int depth,
GAL-GC* newgc);
void (*freegc) (GAL-GC gc);
void (*setgc) (GAL_ GC gc);
//Clipping of graphics context
void (*enableclipping) (GALes GC gc);
void (*disabledlipping) (GAL_GCgc);
int (*setclipping) (GAL-GC gc,. int x l, int y l, int x2, int y2);
int (*getclipping) (GAL_GC gc, int* xl, int* yl, int* x2, int* y2);
// Background and foreground colors
int (*getbgcolor) (GALes GC gc, gal_pixel* color);
int (*setbgcolor) (GALes GC gc, gal_pixel color);
int (*getfgcolor) (GAL-GC gc, gal-pixel* color);
int (*setfgcolor) (GAL_GC ge, gal_pixel color);
// Convertion between gal color and gal_pixel
gal_pixel (*mapcolor) (GAL-GC gc, gal color *color);
int (*unmappixel) (GALes GC gc, gal-pixel pixel, gal_ color*
color);
int (*packcolors) (GAL-GC ge, void* buf, gal color* colors, int
len);
int (*unpackpixels) (GAL一 GC gc, void* buf, gal color* colors,
int len);
// Palette operations
*getpalette) (GAL-GC go, int s, int len,
*setpalette) (GAL_GC gc, int s, int len,
gal color* cmap);
gal color* cmap);
(*setcolorfulpalette) (GAL-GC gc);
ninini// Box operations
广,了.,
size t*boxsize) (GAL_GC gc, int w, int h)
*fillbox) (GALes GC gc, int x, int y, int w, int h,
gal_pixel pixel);
(*putbox) (GALes GC gc, int x, int y, int w, int h, void* buf)
nini
(*getbox) (GAL-GC gc, int x, int y, int w, int h, void* buf);
(*putboxmask) (GAL_ GC gc, int x, int y, int w, int h, void* buf,
eal一ixel cxx):
(*putboxpart) (GAL GC gc, int x, int y, int w, int h, int bw,
int bh, void* buf, int xo, int yo);
(*putboxwithop) (GAL GC gc, int x, int y, int w, int h,
void* buf, int rasteres op);
(*scalebox) (GAL_ GC gc, int sw, int sh, void* srcbuf,
int dw, int dh, void* dstb峋;
ntnt爪ntntint (*copybox) (GAL GC gc, int x, int y, int w, int h, int nx, int
ny);
int (*crossblit) (GAL-GC src, int sx, int sy, int sw, int sh,
GA工esGC dst, int dx, int dy);
//Horizontal line operaions
int (*drawhline) (GAL-GC gc, int x, int y, int w, gal-pixel pixel);
int (*puthline) (GALes GC gc, int x, int y, int w, void* buf);
int (*gethline) (GAL_GC gc, int x, inty, int w, void* buf);
// Vertical line operations
int
im
(*drawvline) (GAL_GC gc, intx, int y, int h, gal_pixel pixel);
(*putvline) (GAL_GC gc, int x, int y, int h, void* buf);
int (*getvline) (GAL_ GC gc, int x, int y, int h, void* buf);
//Pixel operations
int (*drawpixel) (GAL一 GC gc, int x, int y, gal_pixel pixel);
int (*putpixel) (GAL_GC gc, int x, int y, gal_pixel color);
int (*getpixel) (GAL_GC gc, int x, int y, gal_pixel* color);
// Other drawing
int (*circle) (GAL-GC gc, int x, int y, int r, gal_pixel pixel);
int (*line) (GAI牡GC gc, int x1, int y1, int x2, int y2,
gal_pixel pixel);
int (*rectangle) (GAL_GC gc, int 1, int t, int r, int b,
gal_pixel pixel);
//Simple Character output
int (*putchar) (GAL_GC gc, int x, int y, char c);
int (*putstr) (GAL一 GC gc, int x, int y, coast char* str);
int (*getcharsize) (GAL_GC gc, int* width, int* height);
int (*setputcharmode) (GALee GC gc, int bkmode);
int (*setfontcolors) (GAL-GC gc,
gal_pixel fg, gal_pixel bg);
// Asynchronous mode support
void (*flush) (GALto GC gc);
void (*flushregion) (GAL-GC gc, int x, int y, int w, int h);
//Panic
void (*panic) (int exitcode);
}GFX;
其中主要定义了数据结构本身的初始化函数initgfxQ,以及与显示物理设备
相关的参数和图形相关的接口函数.initgfx()在当前图形引擎指针指向native图
形引擎时得到赋值.然后,在初始化流程InitGAL()中,initgfx()通过打开屏幕设
备,进而通过系统调用打开Linux内核中对应FramebufYer的设备文件/dev/fb0,
得到显示物理设备的参数,完成对整个数据结构的初始化.其过程则是依赖基于
Framebuffer的驱动程序,为了更清楚些,我们有必要说明与之相关的一个关键
数据结构SCREENDEV工CE,这里删除了一些次要的变量或者函数.
勿pedef struct_ screendevice{
Imxres;
mt yres;
int bpp;
int linelen;
int size;
gfx_pixel gr_foreground;
gfx_pixel gres background;
int gr-mode;
int flags;
void*addr;
PSD (*Open)(PSD psd);
void (*Close)(PSD psd);
void (*SetPalette)(PSD psd,int first,int count,gfx_color *cmap);
void (*GetPalette)伊SD psd,int first,int count,gfx_color *cmap);
PSD (*AllocateMemGC)(PSD psd);
BOOL (*MapMemGC)(PSD mempsd,int w int h,int planes,int bpp, int
linelen,int size,void *addr);
void (*FreeMemGC)(PSD mempsd);
void (*FillRect)(PSD psd,int x,int y int w,int h,gfx_pixel c);
void (*DrawPixel)(PSD psd, int x, int y, gfx_pixel c);
gfx_pixel (*ReadPixel)(PSD psd, int x, int y);
void (*DrawHLine)(PSD psd, int x, int y, int w, gfx_pixel c);
void (*PutHLine) (GAL gal, int x, int y, int w, void* buf);
void (*GetHLine) (GAL gal, int x, int y, int w, void* buf);
void (*DrawVLine)(PSD psd, int x, int y, int w, gfx_pixel c);
void (*PutVLine) (GAL gal, int x, int y, int w, void* buf);
void (*GetVLine) (GAL gal, int x, int y, int w, void* buf);
void (*Blit)(PSD dstpsd, int dstx, int dsty, int w, int h, PSD srcpsd, int srcx,
int srey);
vol任
VOI口
(*PutBox)( GAL gal, int x, int y, int w, int h, void* buf );
(*GetBox)( GAL gal, int x, int y, int w, int h, void* buf );
Vol呼
vuiu
(*PutBoxMask)( GAL gal, int x, int y, int w, int h, void *buf);
(*CopyBox)(PSD psd,int x1, int yl, int w, int h, int x2, int y2);
}SCREENDEVICE;
一个SCREENDEVICE代表一个屏幕设备,它既可以对应物理屏幕设备(我
们的LCD显示屏),也可以对应一个内存屏幕设备,内存屏幕设备的存在主要是
为了实现良好的绘图视觉效果.比如我们先在内存生成一幅位图,再画到屏幕上,
这样用户就不会在屏幕上感觉到整个绘图的过程,从而觉得很快.
下面介绍这个数据结构几个变量的含义.
1) xres:表示屏幕的宽(以像素为单位),我们开发板LCD是320;
2) yres:表示屏幕的高(以像素为单位)我们开发板LCD是240,;
3) planes:当处于平面显示模式时,planes用于记录所使用的平面数,
如平面模式相对的时线性模式,此时该变量没有意义.通常将其置为Oe
4) bpp:表示每个像素所使用的比特数,可以为1, 2, 4, 8, 15, 16,
24, 32.我们开发板是16级灰度,所以bpp应为4.
5) linelen:对与1, 2, 4, 8比特每像素模式,它表示一行像素使用的
字节数,对于大于8比特每像素模式,它表示一行的像素总数.
6) size:表示该显示模式下该设备使用的内存数.linelen和size的
存在主要是为了方便为内存屏幕设备分配内存.
7) gr_ foreground和gr一ackground:表示该内存屏幕的前景颜色和背
景颜色,主要被一些GDI函数使用.
8) gr_ mode:说明如何将像素画到屏幕上,可选值为:MODE_ SET MODE_ XOR
MODE_ OR MODE AND MODE MAX,E匕较常用的是MODE SET和MODE_ XOR.
9) flags:该屏幕设备的一些选项,比较重要的是PSFse MEMORY标志,表
示该屏幕设备代表物理屏幕设备还是一个内存屏幕设备.
10) addr:每个屏幕设备都有一块内存空间用来作为存储像素.该变量记
录这个空间的起始地址.
几个重要的接口函数的功能如下:
1) Open, Close:
基本的初始化和终止函数.Open通过系统调用fb_ open首先打开
Framebuffer的设备文件/dev/fbO,然后利用ioctl读出当前
Framebuffer的各种信息.填充到PSD结构中.并且根据这些信息选出子
驱动程序.然后将当前终端模式置于图形模式.并保存当前的一些系统信
息如调色板信息.最后,系统利用mmap将/dev/fb0映射到内存地址.以
后程序访问/dev/fb0就像访问一个数组一样简单.
2) SetPalette, GetPalette:
当使用8位或以下的图形模式时,要使用系统调色板.这里是调色板
处理函数,它们和Windows API中的概念类似,linux系统利用ioctl提供
了处理调色板的接口.
3) DrawPixel, ReadPixel, DrawHLine, DrawVLine, FillRect:
这些是底层图形函数.分别是画点,读点,画水平线,画竖直线,画
一个实心矩形.之所以在底层实现这些函数,是为了提高绘图效率.
4) PutHLine,GetHLine,PutVLine,GetVLine,PutBox,GetBox,PutBoxMask:
以Get开头的函数用于从屏幕拷贝像素到一块内存区,而以Put开头的
函数用于将存放于内存区的像素画到屏幕上.PutBoxMask与PutBox的区
别是要画的像素如果是白色,就不会被画到屏幕上,从而达到一种透明的
效果口
5) Blit, CopyBox:
Blit用于在不同的屏幕设备(物理的或者内存的)之间拷贝一块像素点,
CopyBox则用于在同一屏幕上实现区域像素的拷贝.
上面我们提到了子图形驱动程序的概念,设置子驱动的目的是用以支持各种
不同的显示模式.图形显示有个显示模式的概念,一个像素可以用一位比特表示,
也可以用2, 4, 8, 15, 16, 24, 32个比特表示,我们的开发板是十六级灰度,
每个象素点用4个比特(bpp=4)表示.所以即使是同样荃于Framebuffer的驱
动,不同的模式也要使用不同的驱动函数.
子图形驱动接口如下所示:
typedef struct{
int (*Init)(PSD psd);
void (*DrawPixel)(PSD psd, int x, int y, gfx_pixel c);
gfx_pixel (*ReadPixel)(PSD psd, int x, int y):
void
void
void
(*DrawHLine)(PSD psd,
(*PutHLine) (GAL gal,
(*GetHLine) (GAL gal,
y, int w, gfx_pixel c)
y, int w, void* buf);
y, int w, void* buf);
void (*DrawVLine) (PSD psd, int x, int y, int w, gfx_pixel c);
void (*PutVLine) (GAL gal, int x, int y, int w, void* buf):
void (*GetVLine) (GAL gal, int:,int y, int w, void* buf):
void (*Blit) (PSD dstpsd, int dstx, int dsty, int w, int h, PSD
srcpsd, int srcx, int srcy);
void (*PutBox)(GAL gal, int x, int y, int w, int h, vo记*buf);
void (*GetBox)(GAL gal, int x, int y, int w, int h, void* buf):
void (*PutBoxMask)(GAL gal, int x, int y, int w, int h, void *buf);
void (*CopyBox) (PSD psd,int xl, int yl, int w, int h, int x2, int
y2);
}SUBDRIVER, *PSUBDRIVER;
可以看到,其中除了Init函数指针外,其他的函数指针都与图形驱动程序接
口(SCREENDE VICE)中的函数指针一样的,而且一一对应.事实上,它们才是
最终的绘图功能函数.上面在介绍Open函数的时候我们己经提到,图形驱动程
序的初始化函数Open直接将子驱动程序的各功能函数赋到图形驱动程序的接
口函数指针,从而初始化结束就可以使用一个简单的图形驱动接口.
综合以上过程,我们可以用下图简明表示GAL的实现.
根据底层图形驱动选择图形引攀
打开相应的屏幕设备文件,得到设
备相关的各项参数
填充SCREENDEVICE的域
根据bpp的值,选择子图形驱动程

设里子图形驱动程序
完成对GFX的初始化
图4. 4 GAL实现流程
这样,通过GAL就实现了对底层不同硬件以及不同图形库的屏蔽,从而使
GU工系统具有很好的移植性,而这对于以后产品的升级带来极大的方便性.
4.3.2输入抽象层(IAL)
执L的作用与GAL类似,通过这个抽象接口来屏蔽输入设备的差异.我们
的开发板以及以后的产品使用的输入设备是触摸屏和与电话功能相关的几个快
捷键,相应的内核驱动程序由其他开发人员完成.这两个设备我们给它命名为
HANDPAD和TELKBDDEV,在Linux内核中则抽象为两个设备文件dev/handpad
和devltelkbddev.
下面通过几个关键的数据结构与函数实现来说明IAL的实现.
1,输入引擎INPUT
typedef struct tagINPUT
{
char* id;
//初始化和终止
BOOL (*init input) (struct tagINPUT *input, const char* mdev, const char*
-type);
void (*term_input) (void);
//鼠标
int (*update一 mouse) (void);
int (*get~ mouse- x) (void);
int (*getee mouse_y) (void);
void (*set mouse_xy) (int x, int y);
int (*get_mouse一 button) (void);
void (*set一 mouse~ range) (int minx, int miny,int maxx,int maxy);
void (*suspend一 mouse)(void);
void (*resume_mouse)(void);
//键盘
int (*updatees keyboard)(void);
char* (*getse ke如oard state) (void);
void (*s-pendes keyboard)(void);
void (*resume-keyboard) (void);
void (*set leds)(unsigned intleds);
刀触摸屏
int (*update- handpad)(void);
int (*get handpad_x) (void);
int (*get handpad_y)(void);
int (*set handpad- xy) (int x, int y);
void (*suspend handpad)(void);
void (*resumees handpad) (void);
刀电话快捷键
int (*updateee telkeyboard) (void);
char* (*get一elkeyboard- state) (void);
void (*suspend telkeyboard)(void);
void (*resume telkeyboard) (void);
//事件等待函数
int (*wait event) (int which, int maxfd, fd- set *in, fd- set *out, fd一 set
*except, struct timeval *timeout);
)INPUT;
正如所定义的接口函数的名称,输入引擎主要完成底层触摸屏和快捷键的事
件和数据采集功能.我们以触摸屏为例,说明所定义函数的功能:
1) update_ handpad:
由于笔点位置(X, Y)坐标由内核中的触摸屏驱动程序维护,输入引擎使用
该函数用于实现数据更新,保持数据同步.
2) get一 handpad~ x, get handpady:
获得当前笔点击的X, Y坐标位置.
3) set handpades xy:
该函数的功能类似于定位鼠标,不过考虑到目前在开发板上并不需要这个功
能,所以该函数暂时是置空的,如果以后需要再行填写.
4) suspend一 handpad, resumees handpad:
suspend用于空闲时挂起触摸屏,resume相反,用于恢复触摸屏.
电话快捷键,鼠标,键盘的功能函数的作用与触摸屏类似,之所以保留鼠标
和键盘,是为了以后的升级产品增加相应设备的需要.
触摸屏笔点击事件与鼠标左键的按下是类似的,当有笔触点击触摸屏时,事
件等待函数wait event捕捉到这一事件.ge吵andpades x和ge吵andpady通过
read函数得到笔点的X. Y坐标值,提供给上层应用程序.快捷键实现的原理与
触摸屏类似,只不过得到的是按键的状态.
2.触摸屏HANDPAD
typedef struct一andpaddevice{
int (*Open)(void);
void (*Close)(void);
int (*Read)(int *x,int *y, int *button);
void (*Suspend) (void);
int (*Resume) (void);
}HANDPAD;
该结构中的Open和Close主要通过系统调用实现和底层驱动的接口,完成
对触摸屏设备的初始化并采集笔点的坐标值.
3.快捷键TELKBDDEV
typedef struct telkbddevice{
int (*Open)(void);
void (*Close)(void);
int (*Read)(char *telkey);
void (*Suspend) (void);
int (*Resume) (void);
}TELKBDDEVICE;
与触摸屏HANDPAD类似,主要是通过系统调用实现和底层驱动的接口,
完成对被按下的快捷键类型的判断.
综上所述,我们通过IAL,实现了GUI系统的底层硬件无关性,与GAL一
起,完全屏蔽了底层硬件的细节,从而使得整个GUI系统具有了良好的移植性
和可扩展性.而这一切实现的前提,我们又不得不提到Linux内核的支持,感谢
那些为Linux这一自由软件默默奉献的人们!
4.3.3
4.3.3.1
核心层(KERNEL)
资源管理模块(RESOURCE)
共享资源是客户服务器模型中的重要元素,它由服务器负责创建和释放,提
供给所有客户程序共享的数据资源.在本课题中,这些资源包括位图(Bitmap ).
图标(Icon)和字体(Font).位图和图标都是窗口模型中的重要元素,比如我
们熟悉的最大化,最小化按钮,关闭按钮,存盘标志,展开文件夹等,都是用图
示的方式表示,使得整个窗口简洁美观,而表示的功能又十分明了,充分体现了
一种人性化的设计特点.字体是构成窗口菜单栏,标题栏等所必须的元素,同时
也是上层应用所必不可缺的.
在GUI系统中,共享资源的初始化过程用下图所示的调用流完成.
我们前面提到,uclinux系统不支持IPC(进程间通信)机制,因此我们无
法使用共享内存的方法来实现资源的共享.但是我们在分析uClinux时已经指出,
uclinux系统对于内存的访问是直接的,所有程序中访问的地址都是实际的物理
地址.操作系统对内存空间没有保护,各个进程实际上共享一个运行空间.这实
际上为我们提供了更大的权利,可以访问任意的地址空间.由此,如果客户端进
参考文献
[1]. RLinux C程序员指南》任永铮编著国防工业出版社
[2]. (嵌入式Linux设计与应用》邹思铱主编清华大学出版社
[3]. ((计算机图形学》孙家广,杨长贵编著清华大学出版社
[4]《现代软件工程》周之英编著科学技术出版社
[5]. ((Linux设备驱动程序》ALESSANDRO RUBINI著中国电力出版社
[6]. ((HHDREZ328一R2技术手册》华恒科技
尸]((MC68EZ328 Integrated Processor User's ManuaO摩托罗拉公司
[8]. (C/C++嵌入式系统编程》Micbael Barr著中国电力出版社
[9]. Minux下的C编程》贾明,严世贤编著人民邮电出版社
[10].《数据结构》殷人昆等编著清华大学出版社
[1l]实时嵌入式Linux系统上GUI的发展与展望魏永明微电脑世界2000年
第49期
[12]嵌入式系统在信息家电中的应用李小将樊夭晴计算机工程2002年第
四期
[13]嵌入式窗口系统在STOP上的设计与实现陈文智计算机工程与设计
2001年第六期
[14]基于PDA上嵌入式Linux的应用程序的开发陈青山郑鸿张文渊技术
交流2001年第十一期
[1习嵌入式的图形用户界面罗从难耿增强等测控技术2000年第四期
[16]图形用户界面及用户界面模型云红艳新疆石油学院学报1998年第二

[171.嵌入式计算机系统人机界面设计方志刚刘家海计算机世界1999年第
五期
[l8]. http://www.minigui.org
[19]. http://microwindows.censoft.com
[20]. http://www.gnu.org
致谢
衷心感谢我的导师邓中亮教授,衷心感谢邓老师对我在学业上的精心指导和
生活上的深切关怀.邓老师以他精益求精严谨治学态度,过人的工作热情和精力
潜移默化地感染着我,使我发现了潜心工作的价值.尤其值得一提的是,由于本
人本科的专业是工程机械,而从1993年毕业后的七年来一直从事机械设备的安
装与调试工作,计算机基础较为薄弱,邓老师经常给我加班加点的辅导,不厌其
烦的讲解,使我慢慢的适应了研究生期间繁重的学习,工作.
感谢杨福兴老师在百忙中抽出时间对我的论文提出许多中肯,宝贵的意见.
感谢自动化学院的领导,老师和工作人员,并向他们及所有默默奉献的教育
工作者致以最崇高的敬意.
感谢我年迈的双亲,还有我的妻子,她独自一人在石家庄承担家庭的重担,
照顾我们刚刚出生的女儿,没有他们的支持,我是很难完成这两年半的研究生学
业的. 感谢诸位师兄弟在校期间给予我的热情帮助,让我们记住他们的名字:黄明
吉博士,陈清金博士,李秋云硕士,赵再军硕士,汪照辉硕士,张振宇硕士,王
全利硕士,王永光硕士,刘亮硕士等.
感谢在北邮遇到和帮助过我的人.

·上一篇:QQ:243408630(留言)
·下一篇:如何选购你的PDA
下载链接
相关下载
最热搜索
<%=Components.Fun.GetTemplate(Components.Template.TemplateType.Foot)%>