1.1 嵌入式GUI系统
GUI系统的含义为图形用户接口(Graphic User Interface)系统,它是计算机系统和用户的接口。在嵌入式领域,随着用户需求的增加和技术的发展。GUI系统已经有了越来越广泛的应用。
1.1.1 嵌入式GUI系统的作用
在20世纪90年代,作为人机交互的接口,GUI系统在桌面计算机系统中就已经有了很广泛的应用,其中具有代表性的是:微软的Windows系列(包括Windows95、Windows98、WindowsMe等)和WindowsNT系列(包括Windows NT 4.0、Windows 2000、Windows XP等)系统,桌面Linux的Gnome系统和KDE系统。相比传统的命令行接口(Command Line Interface)方式。GUI系统为用户提供了更友好的界面,将用户从枯燥界面中解脱出来。同时,GUI系统也让计算机系统的使用更加简单。
在嵌入式系统发展的初级阶段,GUI系统的应用相对较少。例如,在相对简单的、以单片机为核心的简单工控系统中,人机交互通常以LED(发光二极管)和按键相结合的方式,随后才有了简单的屏幕。这些只是简单的输入、输出系统,不能被称为“GUI系统”。
GUI系统在早期的嵌入式系统中应用较少的主要原因有两个:一个方面,功能角度考虑,很多传统的嵌入式系统逻辑相对简单,人需要从系统获取的信息较少,人对系统的操作也较少;另一个方面,从技术角度,嵌入式处理器的计算能力较低、嵌入式系统内存较少等现实和缺少适用于嵌入式系统的GUI系统,使得嵌入式系统中实现图形化的人机交互界面有一定的技术难度。
随着嵌入式系统的发展和普及,GUI在嵌入式系统中的作用越来越突出。当智能手机、PDA等系统出现后,嵌入式系统已经不是仅仅给个别专业操作人员所使用的,而需要适用于很广泛的群众。虽然在传统的嵌入式控制领域,人机交互的内容并不是很复杂,但是使用者同样需要更友好的界面。因此,GUI在嵌入式系统中的普及是大势所趋。
GUI系统需要最终向用户提供输出和输入两个方面。在输出方面,GUI系统向用户提供一个图形化的界面,在输入方面,GUI系统需要接受用户的操作,从而达到通过界面控制系统的目的。
1.1.2 嵌入式GUI系统的层级结构
嵌入式系统的设计一般秉承精简、高效的原则,其软件的层次结构相对简单。自下而上,一般可以分为硬件层、操作系统层、中间件、应用层等几个层次,如图1-1所示。
图1-1 嵌入式系统的软件架构
嵌入式系统的硬件分为处理器(通常包含CPU和片内设备)、内存、板级硬件几个部分。CPU涉及了特定体系结构的运算和控制单元,例如ARM、MIPS等,在整个系统的软件开发中,一般都要基于该体系结构的编译工作。片内设备是处理器内部的硬件模块,比较重要的包括内存管理器、中断控制器、定时器、GPIO等。嵌入式系统的内存的RAM主要通过SRAM和SDRAM实现,可固化的存储器主要应用Nor Flash和Nand Flash。板级的硬件包含了嵌入式系统中需要,但是处理器片内没有集成的部分,通常包括片内部件的外围硬件、总线扩展、GPIO扩展几种形式。
嵌入式的操作系统建立在硬件之上。操作系统通常具有进程(任务)调度、进程间通信、内存管理等方面。嵌入式系统的操作系统一般都具有一定的可移植性,可以建立在不同的硬件平台上。操作系统的移植层通常包括对某种体系结构CPU的支持,需要涉及定时器、中断控制器、系统内存等硬件。驱动程序是操作系统和硬件的接口,大量的硬件需要通过操作系统框架内的驱动程序,向上层提供控制硬件的接口。
提示:关于操作系统和上层软件的关系,某些操作系统被称为内核空间(Kernel Space),而操作系统以上的部分被称为用户空间(User Space)。按照功能,操作系统以上的部分可以分为中间件和上层应用两个部分。
中间件一般提供了一些相对底层的软件层次的功能。它的实现一般不包括应用程序的逻辑,而是向上层软件提供了各种方便的应用程序接口(API)。中间件需要通过对操作系统的调用来建立,常常需要控制硬件。在嵌入式系统中,常用的中间件包含文件系统(File System)、网络协议(Net protocol)、图形用户系统(GUI)等几种,它们一般都需要控制特定的硬件来实现。此外,数据库(Database)等不需要控制硬件的下层软件,通常也作为中间件的形式出现。
应用层包含了应用程序的逻辑,它通过调用中间件和操作系统来实现。应用层的软件程序也可以由上下若干层和不同的模块组成。
注意:图1-1是一个嵌入式系统软件相对通用的结构图,并没有依赖特定的硬件平台和操作系统。
uC/OS是一种简单的操作系统,操作系统内核的功能比较简单,只有任务调度、任务通信和简单的内存管理功能,其内核空间和用户空间的界限也不是很明显。文件系统、网络协议、图形系统均通过的中间件的形式实现。
在Linux操作系统中,文件系统和网络协议集成在操作系统内核中。Linux的文件系统包含了上层通用的虚拟文件系统(Virtual File System)和下层的操作系统实现(如ROMFS、JIFFS),建立在下层的RAM等Flash硬件上。Linux的网络模块也是操作系统组成部分,提供了对TCP/IP栈的支持,网络模块建立的硬件基础是网络设备的驱动程序。然而,Linux操作系统没有包括对GUI的支持,因此Linux的GUI系统通常以中间件的方式实现。
在Linux中,GUI系统的实现如图1-2所示。
在Linux中,GUI系统具有中间件典型的特点:核心实现提供了界面、控件等功能,API层是为上层应用提供的接口、移植层适应不同的硬件的需求。GUI系统核心通常需要建立在C库和移植层的基础上。GUI核心通常依赖操作系统提供的一些机制,如多线程支持等。GUI系统的移植实现基础包含输出设备和输入设备两个部分。输出设备在Linux中通常需要通过对帧缓冲区驱动(例如:/dev/fb0)的调用来实现,输出设备的移植通常是GUI系统的重点。与之相比,输入设备是多种多样的,包括鼠标、键盘、触摸屏、按键等设备,对不同输入设备的支持是GUI系统的难点和重要特性。
GUI系统的核心库通常作为嵌入式系统的中间件,而使用GUI核心库的GUI应用程序属于应用程序层的程序。
图1-2 Linux中GUI系统的软件结构