您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据库 > 第十一章 嵌入式Linux图形界面设计
第十章嵌入式Linux图形界面设计9.1Linux图形开发基础本节在介绍图形用户界面一般构架的基础上,详细讨论嵌入式图形用户界面开发常见的底层支持库和高级函数库。这些内容都是Linux图形界面开发的基础知识。GUI的一般架构图形用户界面GUI(GraphicsUserInterface)是迄今为止计算机系统中最为成熟的人机交互技术。一个好的图形用户界面的设计不仅要考虑到具体硬件环境的限制,而且还要考虑到用户的喜好等。由于图形用户界面的引入主要是从用户角度出发的,因此用户自身的主观感受对图形用户界面的评价占了很大比重,比如,易用性、直观性、友好性,等等。另外,从纯技术的角度看,仍然也会有一些标准需要考虑,比如,跨平台性、对硬件的要求等。在嵌入式系统开发和应用中,我们所考虑的问题主要集中在图形用户界面对硬件的要求,以及对硬件类型的敏感性方面,在提供给用户的最终界面方面只是要求简单实用就够了。虽然不同的GUI系统因为其使用场合或服务目的不同,具体实现互有差异,但是总结起来,一般在逻辑上可以分为以下几个模块:底层I/O设备驱动(显示设备驱动、鼠标驱动、键盘驱动等)、基本图形引擎(画点、画线、区域填充)、消息驱动机制、高层图形引擎(画窗口、画按钮),以及GUI应用程序接口(API)。底层I/O设备驱动,例如,显示驱动、鼠标驱动、键盘驱动等构成了GUI的硬件基础。由于此类设备的多样性,需要对其进行抽象,并提供给上层一个统一的调用接口;而各类设备驱动则自成一体,形成一个GUI设备管理模块。当然,从操作系统内核的角度看,GUI设备管理模块则是操作系统内核的I/O设备管理的一部分。基本图形引擎模块完成一些基本的图形操作,如画点、画线、区域填充等。它直接和底层I/O设备打交道,同时,多线程或者多进程机制的引入也为基本图形模块的实现提供了很大的灵活性。消息不仅是底层I/O硬件和GUI上层进行交互的基础,同时也是各类GUI组件如窗口、按钮等相互作用的重要途径。一个GUI系统的消息驱动机制的效率对该系统的性能,尤其是对响应速度等性能的影响很大。高级图形引擎模块则在消息传递机制和基本图形引擎的基础上完成对诸如窗口、按钮等的管理。GUIAPI则是提供给最终程序员的编程接口,使得他们能够利用GUI体系所提供的GUI高级功能快速开发GUI应用程序。另外,为了实现GUI系统,一般需要用到操作系统内核提供的功能,如线程机制、进程管理。当然,不可避免地需要用到内存管理、I/O设备管理,甚至还可能有文件管理。从用户的观点来看,图形用户界面(GUI)是系统的一个至关重要的方面:由于用户通过GUI与系统进行交互,所以GUI应该易于使用并且非常可靠。此外,它不能占用太多的内存,以便在内存受限的微型嵌入式设备上无缝执行。由此可见,它应该是轻量级的,并且能够快速装入。嵌入式GUI要求简单、直观、可靠、占用资源小且反应快速,以适应系统硬件资源有限的条件。另外,由于嵌入式系统硬件本身的特殊性,嵌入式GUI应具备高度可移植性与可裁减性,以适应不同的硬件条件和使用需求。总体来讲,嵌入式GUI具备以下特点:体积小;运行时耗用系统资源小;上层接口与硬件无关,高度可移植;高可靠性;在某些应用场合应具备实时性。一个能够移植到多种硬件平台上的嵌入式GUI系统,应至少抽象出两类设备:基于图形显示设备(如VGA卡)的图形抽象层GAL(GraphicAbstractLayer)和基于输入设备(如键盘,触摸层等)的输入抽象层IAL(InputAbstractLayer)。GAL层完成系统对具体的显示硬件设备的操作,最大限度地隐藏各种不同硬件的技术实现细节,为程序开发人员提供统一的图形编程接口。IAL层则需要实现对于各类不同输入设备的控制操作,提供统一的调用接口,如图9.2所示。GAL层与IAL层设计概念的引入,可以显著提高嵌入式GUI的可移植性。嵌入式GUI底层支持库1.XWindow2.FrameBufferFrameBuffer是出现在2.2.xx内核中的一种驱动程序接口。由于Linux工作在保护模式,所以用户态进程无法像DOS那样使用显卡BIOS里提供的中断调用来实现直接写屏,Linux抽象出FrameBuffer这个设备来供用户态进程实现直接写屏。在使用Framebuffer时,Linux是将显卡置于图形模式下的。Framebuffer就是模仿显卡的功能,相当于抽象的显卡硬件结构,实现了通过Framebuffer的读写直接对显存进行操作。用户可以将Framebuffer看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反映在屏幕上。这种操作是抽象的、统一的。用户不必关心物理显存的位置、换页机制等具体细节,因为这些都是由Framebuffer设备驱动来完成的。FrameBuffer设备还提供了若干ioctl命令,通过这些命令,可以获得显示设备的一些固定信息(例如显示内存大小)、与显示模式相关的可变信息(例如,分辨率、像素结构、每扫描线的字节宽度),以及伪彩色模式下的调色板信息等。通过FrameBuffer,还可以获得当前内核所支持的加速显示卡的类型(通过固定信息得到),这种类型通常是和特定显示芯片相关的。例如,目前最新的内核(2.4.9)中,就包含有对S3、Matrox、nVidia、3Dfx等流行显示芯片的加速支持。在获得了加速芯片类型之后,应用程序可以将PCI设备的内存I/O(memio)映射到进程的地址空间。这些memio一般是用来控制显示卡的寄存器,通过对这些寄存器的操作,应用程序可以控制特定显卡的加速功能。但由于Framebuffer本身不具备任何运算数据的能力,只是一个提供显示内存和显示芯片寄存器从物理内存映射到进程地址空间中的设备。所以,对于应用程序而言,如果希望在FrameBuffer之上进行图形编程,还需要自己动手完成其他许多工作。举个例子来讲,FrameBuffer就像一张画布,使用什么样的画笔、如何画画,还需要用户自己动手完成。在这种机制下,尽管Framebuffer需要真正的显卡驱动的支持,但由于所有显示任务都由CPU完成,因此CPU负担很重。3.SVGALibSVGALib是Linux系统中最早出现的非X图形支持库,是Linux下的VGA驱动函数库。虽然它的品质有点低,支援显卡种类也不多,但是有许多的游戏及程序都是用它来做开发,可以算是非官方的标准了。这个库从最初对标准VGA兼容芯片的支持开始,已经发展到对老式SVGA芯片,以及现今流行的高级视频芯片的支持。它为用户提供了在控制台上进行图形编程的接口,使用户可以在PC兼容系统上方便地获得图形支持。但该系统也存在一些不足:SVGALib从最初的vgalib发展而来,保留了老系统的许多接口,而这些接口却不能良好地适应新显示芯片的图形能力。未能较好地隐藏硬件细节。许多操作,不能自动使用显示芯片的加速能力支持。可移植性差。SVGALib目前只能运行在x86平台上,除Alpha平台,对其他平台的支持能力较差。SVGALib作为一个老的图形支持库,目前的应用范围越来越小,尤其在Linux内核增加了FrameBuffer驱动支持之后,有逐渐被其他图形库替代的趋势。4.LibGGILibGGI是一个跨平台的绘图库,可以建立一个一般性的图形接口,这个抽象接口连同相关的输入(鼠标、键盘、游戏杆等)接口一起,可以方便地运行在XWindow、SVGALib、FrameBuffer等之上。建立在LibGGI之上的应用程序,不经重新编译,就可以在上述这些底层图形接口上运行。在Linux上,LibGGI是通过调用FrameBuffer或SVGALib来完成图形操作的,可能速度比较慢。但在某些不支持FrameBuffer或vga的系统上,采用LibGGI仍然是一种不错的选择。嵌入式GUI高级函数库1.Xlib及其他相关函数库在XWindow系统中进行图形编程时,可以选择直接使用Xlib。Xlib实际上是对底层X协议的封装,可通过该函数库进行一般的图形输出。如果用户的XServer支持DGA,则可以通过DGA扩展直接访问显示设备,从而获得加速支持。2.SDL(SimpleDirectMediaLayer)SDL是一个跨平台的多媒体游戏支持库。其中包含了对图形、声音、游戏杆、线程等的支持,目前可以运行在许多平台上。SDL支持图形的功能强大,高级图形处理能力尤为突出,可以实现Alpha混合、透明处理、YUV覆盖、Gamma校正等。在SDL环境中能够非常方便地加载支持OpenGL的Mesa库,从而提供对二维和三维图形的支持。3.AllegroAllegro是一个专门为x86平台设计的游戏图形库。最初的Allegro运行在DOS环境下,目前也可运行在LinuxFrameBuffe控制台、LinuxSVGALib、XWindow等系统上。Allegro提供了丰富的图形功能,包括矩形填充和样条曲线生成等,而且具有较好的三维图形显示能力。由于Allegro的许多关键代码是采用汇编编写的,所以该函数库具有运行速度快、占用资源少的特点。4.Mesa3DMesa3D是一个兼容OpenGL规范的开放源码函数库,是目前Linux上提供专业三维图形支持的惟一选择。Mesa3D也是一个跨平台的函数库,能够运行在XWindow、XWindowwithDGA、BeOS、LinuxSVGALib等平台上。5.DirectFBDirectFB是特别为LinuxFrameBuffer加速的一个图形库,正在尝试建立一个兼容GTK(GIMPToolkit)的嵌入式GUI系统。9.2嵌入式Linux图形用户界面简介Qt/Embedded(简称QtE)是一个专门为嵌入式系统设计的图形用户界面的工具包,由挪威Trolltech公司开发,最初作为跨平台的开发工具用于Linux台式机。它支持各种有UNIX和MicrosoftWindows特点的系统平台。Qt/Embedded以原始Qt为基础,许多基于Qt的XWindow程序可以非常方便地移植到Qt/Embedded上,因此,自从Qt/Embedded以GPL条款形式发布以来,就有大量的嵌入式Linux开发商转到了Qt/Embedded系统上,比如,韩国的Mizi公司。Qt/Embedded通过QtAPI与LinuxI/O设备直接交互,是面向对象编程的理想环境。面向对象的体系结构使代码结构化、可重用并且运行快速,与其他GUI相比,QtGUI非常快,没有分层,这使得Qt/Embedded成为基于Qt的程序的最紧凑环境。Qt/Embedded延续了Qt在X上的强大功能,在底层摒弃了Xlib,仅采用FrameBuffer作为底层图形接口。同时,将外部输入设备抽象为keyboard和mouse输入事件,底层接口支持键盘、GPM鼠标、触摸屏,以及用户自定义的设备等。Qt/Embedded类库完全采用C++封装,丰富的控件资源和较好的可移植性是Qt/Embedded最为突出的优点。它的类库接口完全兼容于同版本的Qt-X11,使用X下的开发工具可以直接开发基于Qt/Embedded的应用程序GUI。Qt/EmbeddedMicrowindows/Nano-XMicrowindows是CenturySoftware的开放源代码项目,设计用于带小型显示单元的微型设备。它有许多针对现代图形视窗环境的功能部件,可被多种平台支持。Microwindows体系结构是基于客户机/服务器(Client/Server)分层设计的。最底层是屏幕和输入设备,通过驱动程序来与实际硬件交互;中间层提供底层硬件的抽象接口,进行窗口管理;最上层支持两种API:第一种支持Win32/WinCEAPI,称为Microwindows,另一种支持的API与GDK(GTK+DrawingKit)非常相似,用在Linux上称为Nano-X,用于占用资源少的应用程序。Microwindows支持1、2、4和8bpp(每像素的位
本文标题:第十一章 嵌入式Linux图形界面设计
链接地址:https://www.777doc.com/doc-3272870 .html