ARM嵌入式系统开发完全入门与主流实践
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.8 用户界面

从用户角度来看,操作系统更重要的是用户界面。随着计算机硬件技术的飞速发展,计算机的计算能力在应付普通应用方面显得绰绰有余,这个时候,人们更关心的是人机交互的便易性、友好性等方面,并且用户界面逐渐成为任何一种操作系统不可或缺的一部分。正因为如此,微软的Windows操作系统尽管在性能方面无法和Linux相比,但是因为其用户界面的易用性而继续其对市场的垄断。当然,这其中也有上层应用软件的原因,不过,对一般性应用而言,Linux的上层应用已经足够丰富,并且有快速增长的势头。

最开始的计算机用户界面很容易让人们联想起控制板,上面有一些指示灯,还有一些按钮,甚至会只有跳线,这样的用户界面只有专业人士才能应用自如。随着计算机技术的发展,计算机的应用开始面向普通大众,于是字符型用户界面产生了。Linux的控制台、DOS的命令提示符状态等都是字符型用户界面的典型代表。在字符型用户界面中,界面的基本显示单元是ASCII编码的字符。当然,通过精细编程,字符型用户界面也可以达到很好的交互。但是,由于基本显示单元是字符,所以并不能得到灵活自然的效果。

图形用户界面的引入,使得计算机的交互能力得到显著增强。在苹果公司第一次引入图形用户界面的时候,人们因为它会消耗更多的计算机资源而为它的前途担忧,但是在微软公司的极力倡导下,图形用户界面技术得到了广泛的应用和完善,各类图形用户界面层出不穷,而微软公司也因为其采用了图形用户界面的Windows 95系统而开始登上操作系统领域的霸主地位。

人工智能技术的发展为计算机技术的进步不断注入了新的活力,这也表现在计算机用户界面上。语音识别、手写输入和Agent技术等为计算机用户界面的友好性、易用性的增强开辟了新的途径。可以预见,未来计算机用户界面的进步将主要集中在智能化方面。

由于字符型用户界面现在应用得越来越少,而且比较简单,下面将集中讲解图形用户界面和智能化用户界面。

2.8.1 图形用户界面

图形用户界面(GUI)是迄今为止计算机系统中最为成熟的人机交互技术,一个好的图形用户界面的设计不仅要考虑到具体硬件环境的限制,而且还要考虑到用户的喜好等。图形用户界面的引入主要是从用户角度出发的,因此用户自身的主观感受对图形用户界面的评价占了很大比重,比如说易用性、直观性、友好性等。另外从纯技术的角度看,仍然也会有一些标准需要考虑,比如说跨平台性、对硬件的要求等。在嵌入式系统的开发和应用中,我们所考虑的问题主要还是集中在图形用户界面对硬件的要求,以及对硬件类型的敏感性方面,在提供给用户的最终界面方面只要简单实用就够了。

虽然不同的GUI系统因为其使用场合或服务目的的不同,具体实现互有差异,但是总结起来,一般在逻辑上可以分为以下几个模块(图2-13):底层I/O设备驱动(显示设备驱动、鼠标驱动、键盘驱动等)、基本图形引擎(画点、画线、区域填充)、消息驱动机制、高层图形引擎(画窗口、画按钮),以及GUI应用程序接口(API)。另外,为了实现GUI系统,一般需要用到操作系统内核提供的功能,如线程机制、进程管理。当然,不可避免地需要用到内存管理、I/O管理,甚至还可能有文件管理。

图2-13 GUI的一般架构

2.8.2 关键技术

1. 模块化

计算机系统设计的一个大趋势,就是系统设计的模块化。模块化的初衷就是实现外部调用与内部实现的分离,从而在带来系统架构清晰化的同时,为系统的维护和改进也打下基础。

上面提到的GUI的一般架构事实上就是从模块化设计的思想出发对GUI体系结构进行逻辑上的划分,诸如显示驱动、鼠标驱动、键盘驱动等构成了GUI的硬件基础。由于此类设备的多样性,需要对其进行抽象,并提供给上层一个统一的调用接口,而各类设备驱动则自成一体,形成一个GUI设备管理模块。当然,从操作系统内核的角度看,GUI设备管理模块则是操作系统内核的I/O设备管理的一部分。

在GUI体系结构中,消息是一个非常重要的概念,它不仅是底层I/O硬件和GUI上层进行交互的基础,同时也是各类GUI组件如窗口、按钮等相互作用的重要媒介。一个GUI系统的消息驱动机制的效率对该系统的性能,尤其是对响应速度等性能的影响很大。基本图形引擎模块完成一些基本的图形操作,诸如画点、画线、区域填充等,它直接和底层I/O设备打交道,同时,多线程或者多进程机制的引入也为基本图形模块的实现提供了很大的灵活性。

高级图形引擎模块在消息传递机制和基本图形引擎的基础上完成对诸如窗口、按钮等的管理。GUI/API则是提供给最终程序员的编程接口,使得他们能够利用GUI体系所提供的GUI高级功能快速开发GUI应用程序。

2. 消息驱动机制

任何一个GUI系统都会有相应的消息驱动机制,在某些GUI系统中,消息驱动也被称为事件驱动。

在消息驱动的应用程序中,计算机外设发生的事件,如键盘击键、鼠标摁键等都由系统收集,并将其以事先约定的格式翻译成特定的消息。应用程序一般都包含有自己的消息队列,系统将消息发送到应用程序的消息队列中,应用程序可以建立一个消息处理循环,在这个循环中不断地读取消息并处理消息,直到有特定的消息传来为止。图2-14给出了消息驱动机制的一般流程。

图2-14 消息驱动机制的一般流程

一般地,消息由一个整型的标识和一些附加参数组成。应用程序一般提供一个处理消息的标准函数,在消息循环中,系统可以调用此函数,应用程序再在此函数中处理相应的消息。

3. GUI系统移植

随着计算机硬件的发展,各类GUI设备日益多样化,GUI系统的跨平台移植问题显得日益突出。例如,单单显示技术这一项,就有帧缓冲、VGA和SVGA等多种,而输入技术也有鼠标、键盘、触摸笔等。

为了尽可能地减少平台移植的代价,模块化技术得到了广泛应用。通过模块化技术可以将与硬件平台相关的部分在GUI系统中单列成一个模块,或者干脆就从GUI系统中独立出来,成为操作系统核心的一部分。GUI系统的上层结构则是建立在一个抽象的与平台无关的结构之上的,这样的话,就可以使得GUI系统移植仅仅局限在与硬件平台相关的部分上,这不仅能够减少移植的代价,而且也能够保护应用程序开发人员的利益,因为这样他们利用上层GUI API开发的应用程序不用做修改就可以运行在不同硬件平台上了。

4. GUI系统的微型化

GUI系统的微型化是在嵌入式系统开发中常常要遇到的。现在一般的GUI系统为了各方面的因素考虑,比如说为了程序员开发的便利性,常常会有很多冗余设计,这里所谓的冗余设计是指某些较高层次的API并非必须,而是可以由较低层的API组合而成的,GUI系统的微型化首先是拿这样的API开刀把它们给裁减掉。另外需要注意的是,在某些具体应用中,可能使用到的API函数很少,可能只是一个完整GUI API系统的一个很小的子集。在这种情况下,虽然说为了满足一般应用需要的API仍然很多,但是却可以根据某些特定应用的需要只取一般API集合的一个小的子集,从而实现GUI系统的微型化。