文档介绍:第9章嵌入式Linux用户图形界面编程
Linux图形开发基础
本节在介绍图形用户界面一般构架的基础上,详细讨论嵌入式图形用户界面开发常见的底层支持库和高级函数库。这些内容都是Linux图形界面开发的基础知识。
GUI的一般架构
图形用户界面GUI(Graphics User Interface)是迄今为止计算机系统中最为成熟的人机交互技术。一个好的图形用户界面的设计不仅要考虑到具体硬件环境的限制,而且还要考虑到用户的喜好等。
由于图形用户界面的引入主要是从用户角度出发的,因此用户自身的主观感受对图形用户界面的评价占了很大比重,比如,易用性、直观性、友好性,等等。另外,从纯技术的角度看,仍然也会有一些标准需要考虑,比如,跨平台性、对硬件的要求等。在嵌入式系统开发和应用中,我们所考虑的问题主要集中在图形用户界面对硬件的要求,以及对硬件类型的敏感性方面,在提供给用户的最终界面方面只是要求简单实用就够了。
虽然不同的GUI系统因为其使用场合或服务目的不同,具体实现互有差异,但是总结起来,一般在逻辑上可以分为以下几个模块:底层I/O设备驱动(显示设备驱动、鼠标驱动、键盘驱动等)、基本图形引擎(画点、画线、区域填充)、消息驱动机制、高层图形引擎(画窗口、画按钮),以及GUI应用程序接口(API)。
底层I/O设备驱动,例如,显示驱动、鼠标驱动、键盘驱动等构成了GUI的硬件基础。由于此类设备的多样性,需要对其进行抽象,并提供给上层一个统一的调用接口;而各类设备驱动则自成一体,形成一个GUI设备管理模块。当然,从操作系统内核的角度看,GUI设备管理模块则是操作系统内核的I/O设备管理的一部分。
基本图形引擎模块完成一些基本的图形操作,如画点、画线、区域填充等。它直接和底层I/O设备打交道,同时,多线程或者多进程机制的引入也为基本图形模块的实现提供了很大的灵活性。
消息不仅是底层I/O硬件和GUI上层进行交互的基础,同时也是各类GUI组件如窗口、按钮等相互作用的重要途径。一个GUI系统的消息驱动机制的效率对该系统的性能,尤其是对响应速度等性能的影响很大。
高级图形引擎模块则在消息传递机制和基本图形引擎的基础上完成对诸如窗口、按钮等的管理。
GUI API则是提供给最终程序员的编程接口,使得他们能够利用GUI体系所提供的GUI高级功能快速开发GUI应用程序。
另外,为了实现GUI系统,一般需要用到操作系统内核提供的功能,如线程机制、进程管理。当然,不可避免地需要用到内存管理、I/O设备管理,甚至还可能有文件管理。
从用户的观点来看,图形用户界面(GUI)是系统的一个至关重要的方面:由于用户通过GUI与系统进行交互,所以GUI应该易于使用并且非常可靠。此外,它不能占用太多的内存,以便在内存受限的微型嵌入式设备上无缝执行。由此可见,它应该是轻量级的,并且能够快速装入。
嵌入式GUI要求简单、直观、可靠、占用资源小且反应快速,以适应系统硬件资源有限的条件。另外,由于嵌入式系统硬件本身的特殊性,嵌入式GUI应具备高度可移植性与可裁减性,以适应不同的硬件条件和使用需求。总体来讲,嵌入式GUI具备以下特点:
体积小;
运行时耗用系统资源小;
上层接口与硬件无关,高度可移植;
高可靠性;
在某些应用场合应具备实时性。
一个能够移植到多种硬件平台上的嵌入式GUI系统,应至少抽象出两类设备:基于图形显示设备(如VGA卡)的图形抽象层GAL(Graphic Abstract Layer)和基于输入设备(如键盘,触摸层等)的输入抽象层IAL(Input Abstract Layer)。GAL层完成系统对具体的显示硬件设备的操作,最大限度地隐藏各种不同硬件的技术实现细节,为程序开发人员提供统一的图形编程接口。IAL层则需要实现对于各类不同输入设备的控制操作,提供统一的调用接口,。GAL层与IAL层设计概念的引入,可以显著提高嵌入式GUI的可移植性。
嵌入式GUI底层支持库
Window
。由于Linux工作在保护模式,所以用户态进程无法像DOS那样使用显卡BIOS里提供的中断调用来实现直接写屏,Linux抽象出FrameBuffer这个设备来供用户态进程实现直接写屏。在使用Framebuffer时,Linux是将显卡置于图形模式下的。Framebuffer就是模仿显卡的功能,相当于抽象的显卡硬件结构,实现了通过Framebuffer的读写直接对显存进行操作。用户可以将Framebuffer看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反映在屏幕上。这种操作是