GUI ( Graphic User Interface ) 系统已行之多年,自从苹果的麦金塔计算机问世之后,世界立刻掀起一阵图形化的使用者接口热潮,随之而起的微软 Windows 系统,让这份流行立于不败之地,而人们对计算机生硬的刻板印象也逐渐消逝,由于 GUI 的出现让 PC 更容易的融入每个家庭。 GUI 的系统很多,有我们熟知的微软 Windows 操作系统、苹果计算机的 Mac OS 、UNIX 底下的 X Window System 等 PC GUI 系统,Embedded 领域里头也有不少的 GUI 系统如 QNX Photon microGUI 等等,这些都不是我们所要探讨的主题,本文将把重点置于『 Embedded Linux 』上的 GUI 系统。 GUI 系统本身的复杂度绝对不是一两篇文章所能探讨的,笔者将尽可能的介绍目前较为成熟的几种 GUI 系统架构,帮助建立读者一些基本观念,如要实作则得另辟单元专栏介绍啰。
嵌入式系统的应用面非常广泛,在导论里头笔者已经提过,很多的场合底下 GUI 都是不可或缺的系统,最显眼的例子当然就是 PDA。一套良好的 GUI 系统可能影响一项产品的成败,由其是在这个注重包装的时代。 与 PC 环境不同的是嵌入式系统通常是安装在体积较小、资源有限的装置,所以能够成为嵌入式的 GUI 系统一定要具备以下的条件: • 体积小 谈到『嵌入』,真的是除了小还是小,现在 PC 的硬件动不动就是以GB论,以现在Distribution 常用的两片光盘安装片来选择全部安装都还不能塞满整颗硬盘。对于嵌入式硬件来说根本是不可能的奢求,大部分嵌入式系统用的 flash 大都以 16mb 或 32mb 为主,与 PC 简直是天壤之别,所以这样苛刻的环境底下只有把软件尽量压小啰。 牵扯到图形处理的系统都不会是一件轻松的事情,复杂的程度不是三言两语能带过,所以制作嵌入式 GUI 系统的方式大致可分为两大类: o 精简既有的系统 在某个角度来看,精简既有的系统是最快速的方式,缺点是效能不好控制、体积只能缩小到一定的程度。 o 重新打造一套 最好的情况当然是重新打造一套,优点是系统掌握度高、效能及体积都能调整到最佳状态,但是所需的时间、人力都是很大的成本。 • 耗系统资源少 o 手持式设备 这类嵌入式系统如:PDA、手机,最注重的就是系统资源及省电功能,在省电的前提下 CPU 速度不能太高,运算速度越快越耗电而且散热也会成为大问题。 o 非手持式设备 如:Set Top Box、部份 WebPAD,这类系统主要考虑点在于硬件成本。 o 结论 结论是嵌入式系统的 CPU 都不会比 PC 上的好,内存也是少的多,因此 GUI 系统面临了另一项挑战,必须审慎使用系统资源,不能做无谓的浪费。 • 系统独立 嵌入式系统的一大特 {MOD}就是硬件差异大,并不像 PC 一般全都 x86 架构。纵使底层硬件差异大,上层 GUI 系统依旧需要表现出统一的接口,所以担任嵌入式 GUI 系统必须尽量与硬件划清界线,最好的情形是在 GUI 系统与硬件中间有一层系统负责隔离,所幸已经有 Linux kernel 可以扮演这个角 {MOD}。
2. Embedded Linux 底下几种 GUI 系统架构
即使是到了嵌入式环境底下,GUI 整体架构跟 PC Desktop 相去不远,举凡绘图函式库、字型、事件处理..等等课题都是 GUI 系统所要面临到的不管是 PC 或 Embedded,但是嵌入式系统本身有笔者前面章节所提到的种种限制,所以在整体设计上必须较为严谨,必须顾虑的条件更多,彷佛会到 Dos 底下制作游戏的年代,对于软件所占内存锱铢必较。 UNIX 环境底下的图形窗口标准为 X Window System,Linux 算是 UNIX Like 的系统,上头跑的 GUI 系统是兼容于标准 X 的 XFree86 系统,所以 Embedded Linux GUI 系统自然参照现有 PC Desktop 架构具体而微,笔者以 X Window System 架构的思维来介绍各个系统,希望这样的介绍能够让您有清楚的观念。 依照 X 的逻辑,我大致划分了即 X Server ( 包括 Display、Input.. )、Graphic Library ( 底层绘图函式库 )、Toolkitss ( 如 QT、GTK+..等等 )、Window Manager、Internationalization ( I18N )..等几大类来剖析。 底下有几个 X 的专有名词,笔者顺便简略的介绍 X Window System 的架构,如果想要更彻底的了解 X 则必须找寻相关专书阅读。 • X Server X Window System 架构上有一项特点是别的 GUI 系统所没有的,这个特点就是 Client / Server 架构,请注意这跟一般我们熟知的某某服务器 ( Server 端 )跟 PC 端 ( Client 端 )相连结的情形不同。唯一类似的是 X Window System 本身也是采网络架构设计。具体而白话一点的介绍,X Client 就是我们在 X 上执行的软件,X Server 则是负责显示、及传递使用者输入事件 ( 包括键盘及鼠标..等等硬件装置的输入 )。 • Graphic Library 我们可以把一幅图案想象成是由成千上万个细微小点所组成,这种小点的单位通常为pixel,在同一平方单位里头这些小点素越高图案就越清晰、画质就越好,专业一点的解释便是分辨率高。我们要设计出一个窗口当然不可能一点一点的画上去啰,这样太过于旷日费时,基于这样的观念我们就会开始设计出高阶一点的函式来帮助我们一些繁琐的步骤,于是可能就会出现画点、画线、画矩形、画圆形、画不规则形、上 {MOD}..等等的高阶函式。透过这些高阶函式使得程序设计者不用去管画一条线要点几个点以及如何让显示器显示等零零总总低阶的工作,我们称绘图相关的一组函式库为 GUI 的基本 Graphic Library。 • Toolkits 有了点、线、面的函式之后,虽然已经去除大半的无聊工作,但是就开发窗口程序来说,还是显得非常没有效率,怎么办呢?只有继续将构成窗口的抽象组件例如:按钮、滚动条..等等,抽离出来,重新定义一组更高阶的函式库,再配合上一些联系的语法函式就成了 Toolkits 这东西,目前以 QT、GTK+..等较为流行。 • Window Manger 有了 Toolkits 我们可以很轻松的建立窗口软件 ( X Client ),但是每个窗口软件只负责自己软件内的事务,那不同窗口间的沟通、协调例如:窗口的切换、放大、缩小..等等,就没人管了,于是窗口管理员 ( Window Manager ) 就应运而生了。 • Internationalization 国际化通常是我们东方语系国家的人比较关心的议题,但是很多软件一开始都由西方国家所主导开发,因此这点常常受到忽略,这个问题牵扯的层面非常广泛,上从语文的显示、输入,中至语文习惯,下到文字位的处理,完整的解决是必须从头到脚彻底配合才能达成,只处理一半都只能说是一个跛脚的系统。 随着东方国家使用 GNU/Linux 的人口越来越多,I18N 也就日益受到重视,目前底层 libc 部份已经有完整的支持,剩下来便是 GUI 系统的问题,由于处理双位所耗的资源较大、西方国家主导的系统多的情况下,有时候在一些取舍上,I18N 就被牺牲了,整体而言 Embedded Linux GUI 系统在 I18N 的程度通常都没 PC 端的好,只有在有需求时才会特别调校。 上头几点就是笔者藉 X Window System 的分层架构,来指出一般的 GUI 系统所必须具备的功能,虽说 X 架构不错,但坦白说却不甚适用于嵌入式环境底下,因为实作起来实在太过于庞大,因此有很多 Embedded Linux GUI 系统会把上述几点合并,甚至全部绑在一块,当然这样会失去很多弹性与功能,但却也是不得不的作法。
2.1 Qt Embedded
• 概说 Qt 是 Trolltech这家商业公司所开发的一个跨平台FrameWork环境,在 X 底下可以看作是一套功能完整的 UI Toolkits,采用类似 C++ 的语法以及具备对象导向功能,跨平台的特性可以让使用 Qt 撰写的软件,只写一次程序却可以在 Microsoft Windows 95/98/2000, Microsoft Windows NT, MacOS X, Linux, Solaris, HP-UX, Tru64 (Digital UNIX), Irix, FreeBSD, BSD/OS, SCO and AIX 这些平台执行。虽然是商业公司的产品,但是 Qt 走的却是 Open Source 的路子,并遵循同样的游戏规则,除了提供免费下载以外,全部都是开放原始码,非商业用途亦采用 GPL 的版权宣告,著名的 Open Source 『 KDE 』 Project 便是采用 Qt 所发展。 • Qt / Embedded for embedded system Trolltech 也针对了嵌入式环境推出了『 Qt / Embedded 』产品。与 Desktop 版本不同 ,Qt / Embedded 已经直接取代掉 X Server 及 X Library 等等角 {MOD},所有的功能全部整合在一起。 • 特 {MOD} o 跨平台 Trolltech 公司承诺会维持同样的 API ,不管是在 Windows 底下的 Qt 或是 X11 底下的 Qt,这样的好处是什么?今天你只要用 Qt 写了一套软件,然后在不同平台下重新编译过就可以立即使用,省掉了不少移植软件的功夫自然也省掉了许多宝贵的时间,这样的概念与 Java 十分接近。 o 模块化设计 模块化设计最大的好处就是弹性,Linux kernel 不也因为模块化而弹性十足,Qt / Embedded 号称最小可以缩到 800 Kb 左右,最多则可以长到 3 Mb ( for Intel x86 ),这样的弹性让 Qt / Embedded 更适合在嵌入式环境底下生存。 o 开放原始码 开放原始码的优点应该是不言而谕的。如果你愿意你可以深入了解 Qt 到底是如何运作的。 o 接口简洁漂亮 安装过 KDE 吧!是不是对它爱不释手,界面真的挺美的。 o 执行速度快 跟 X11 比起来,剃除了许多累赘,Qt / Embedded 执行速度增快许多。 o Trolltech 公司支持 公司采购软件最需要的就是完整的支持,只要您跟 Trolltech 购买 Qt 就可以得到他们最完整的支持。 o 参考文件丰富 Qt 诞生也好几年了,透过 Trolltech 及全世界网友的努力,Qt 的文件可说是相当完整而丰富。 • 参考网站 o http://www.trolltech.com/products/qt/embedded/