linux GUI-嵌入式常用GUI系统
这一节主要主流的GUI进行系统进行一个介绍,内容也偏向于科普,大部分内容都摘自网上。
一、Linux GUI介绍
1.1 概念
GUI英文Graphical User Interface,中文图形用户界面。图形用户界面是指采用图形方式显示的计算机操作环境用户接口,与早期计算机使用的命令行界面相比,图形界面对于用户来说更为简便易用。GUI的广泛应用是当今计算机发展的重大成就之一。
我们知道Unix/Linux刚开始的时候是没有图形界面的,随着时代的发展,排版、制图、多媒体应用越来越普遍了,这些需求都需要用到图形用户界面。为此,MIT在1984年开发出了X Window System,X在字母表中是W(indows)的下一个字母,寓意“下一代GUI”的意思。目前为止,Unix/Linux上几乎所有的发行版都采用X Window System来作为自己的图形界面,它已经成为事实上的Unix/Linux图形界面标准。
1.2 X Window System
X Window System又名X11(现在主要的X Window System大都基于其第11个版本),是一个能够跨网络和操作系统平台的图形界面。开发者在开发X时就希望,这个窗口界面不要与硬件有强烈的相关性,这是因为如果与硬件的相关性高,那就等于开发一个操作系统了,如此一来其应用性就要受到限制。故此,X是一套软件体系,而不是操作系统中的组成部分,就像浏览器不是操作系统的组成部分一样。
X Window System可以分为三部分:X Server、X Client、X Protocol。
X Server:每个需要显示图形界面的主机都要运行一个X Server,它负责主机中各个与图形界面有关硬件设备的管理,如在显示器中显示输出,从鼠标、键盘接受输入等;
X Client:X Client指那些需要图形界面的应用程序,如浏览器、终端、视频播放器等。
比如说你键入一个字母c,X Server得到这个事件后,会将该事件转发给对应的程序处理(应用程序就是client),client接收到事件后,知道要显示一个字母,然后就会发一个请求给X Server,要求在xx,xx地方显示一个大小为xx颜色为xx,字体为xx的字母,X Server收到请求后,就按照要求把字母c画出来了。
X Server和X Client之间所使用的X Protocol通信协议对网络来说是透明的,所以client和server可以运行在相同机器上,也可以运行在不同机器上,甚至机器本身的硬件架构和操作系统也可以不一样(如windows上的xmanager就是一个X Server,它可以远程连接Linux上的主机为Linux上的X Client提供服务)。
由于X Window System效率较低的原因,目前已经逐渐使用Wayland来取代它,关于Wayland可以参考:
1.3 GUI系统架构
按照X的逻辑,Linux的GUI系统架构大致可以划分为X Server、Graphic Library(底层绘画函数库)、Toolkits(如QT、Gtk+等)、Window Manager、桌面环境、Internationlization(I18N)。
1.3.1 X Server
X Server上面已经介绍过了,负责显示,传递使用者的输入事件,包括键盘以及鼠标等硬件装置的输入。
1.3.2 Graphic Library
我们可以把一幅图案想象是由成千上个细微小点所组成,这种小点的单位通常为像素,在同一平方单位里头这些小点越多图案就越清晰、画质就越好,专业一点的解释便是分辨率越高。
我们要设计出一个窗口当然不可能一点点的画上去,这样太过于旷日费时,基于这样的观念我们就会开始设计出高阶一点的函数来帮助我们完成这些繁琐的步骤,于是就出现了画点、画线、画矩形、画圆形、画不规则形、上色等高阶函数。通过这些高阶函数使得程序设计者不用去管画一条线要点几个点以及如何让显示器显示零零总总低阶的工作,我们称绘图相关的一组函数库为GUI的基本:Graphic Library。
1.3.3 Toolkits
有了点、线、面的函数之后,虽然已经除了大半的无聊工作,但是就开发窗口程序来说,还是显得非常没有效率,怎么办呢?
只能继续将窗口的组成部分的抽象为组件(它们被称作构件Widgets,在Windows下的对应术语为控件),例如按钮、滚动条等抽离出来,重新定义一组更高阶的函数库,再配合一些联系的语法函数就成了Toolkits这东西,目前以Qt、Gtk+等较为流行。
1.3.4 Window Manager
有了Toolkits我们可以很轻松的建立窗口软件(X Client),但是每个窗口软件只负责自己软件内的事务,那不同窗口间的沟通、协调(例如:窗口的切换、放大、缩小等),就没人管了,于是窗口管理器(Window Manager)就应运而生了。
1.3.5 桌面环境
在一个Linux系统,光有窗口管理器还是不够的,总的有东西给它管才行。桌面环境提供一整套图形界面下使用的程序。比如浏览器、邮件客户端、文件管理器、图形化桌面配置工具、桌面应用程序、办公软件等。
在桌面Linux系统,有两个主流的桌面环境:KDE、GNOME。
1.3.6 Internationalization
国际化通常是我们东方语系国家的人比较关心的议题,但是很多软件一开始都由西方国家所主导开发,因此这点常常受到忽略,这个问题牵扯的层面非常广泛,上从语文的显示。输入,中至语文习惯,下到文字位元的处理,完整的解决是必须从头到脚彻底配合才能达成,只处理一半都只能说是一个跛脚的系统。
随着东方国家使用GNU/Linux的人口越来越多,I18N(之所以如此简称是因为 Internationalization 这个单词除去首尾两个字母后,还有 18个字母)也就日益受到重视,目前底层libc部分已经有完整的支持,剩下来便是GUI系统的问题,由于处理一个字符时使用双字节所耗的资源较大、西方国家主导的系统多的情况下,有时候在一些取舍上,I18N就被牺牲了。整体而言Embedded Linux GUI系统在I18N的程度通常都没PC端的好,只有在有需求时才会特别调校。
1.3.7 总结
上述几点就是借X Window System的分层架构,来指出一般的GUI系统所必须具备的功能,虽说X架构不错,但却不甚适用于嵌入式环境底下,因为相关程序过于庞大,因此有很多Embedded Linux GUI系统会把上述几点合并,甚至全部绑在一块,当然这样会失去很多弹性与功能,但是却也是一种权衡的做法。
二、桌面Linux中的GUI
对于Linux的GUI系统,我们首先接触的是桌面的GNOME、KDE等。它们是什么概念呢?在了解嵌入式Linux GUI之前,先了解一下桌面Linux GUI系统的发展过程,这对于选择合适的嵌入式Linux GUI软件也会有所帮助。
自由软件圣战一KDE/OTVS.Gnome/Gtk 一文非常生动地了桌面Linux GUI的两大流派KDE(基于Qt toolkit)和GNOME(基于Gtk+ toolkit)的发展和竞争过程。
2.1 Qt
Qt是一个跨平台的C++图形用户界面库,由挪威TrollTech 公司出品,目前包括Ot、基于Framebuffer 的Qt Embedded(现已改名为Qtopia)、快速开发工具Ot Designer、国际化工具Qt Linguist等部分。Qt具有下列优点:
- 优良的跨平台特性:Qt支持下列操作系统: Microsoft Windows 95/98, Microsoft Windows NT, Linux, Solaris, SunOS, HP-UX, Digital UNIX (OSF/1, Tru64), Irix, FreeBSD, BSD/OS, SCO, AIX, OS390,QNX 等等。使用Qt开发的软件,相同的代码可以在任何支持的平台上编译与运行,而不需要修改源代码。会自动依平台的不同,表现平台特有的图形界面风格;
- 面向对象:Qt的良好的封装机制使得Qt的模块化程度非常高,可重用性较好,对于用户开发来说是非常方便的;
- Qt提供了一种称为signals/slots的安全类型来代替callback,这使得各个元件之间的协同工作变得十分简单;
- 丰富的API、支持2D/3D图像渲染等;例如,你不再需要研究STL,不再需要C++的头文件,不再需要去找解析XML、连接数据库、Socket 的各种第三方库,这些 Qt 都已经内置了;
- 大量的开发文档;
但是真正的使得Qt在自由软件界的众多Widgets(如Lesstif、Gtk+、EZWGL、Xforms、FLTK等) 中脱颖而出的还是基于Qt的重量级软件KDE。
2.2 Gtk+
Gtk+(GIMP Tool Kit,GIMP工具包)是一个图形用户界面库。Gtk+是基于LGPL授权的,因此可以用Gtk+开发开放源码软件、自由软件,甚至商业的、非自由的软件,并且不需要为授权费或版权费花费一分钱。Gtk+已在大量软件项目,包括GNOME中得到了广泛应用。
Gtk+图形库使用一系列称为“构件”的对象来创建应用程序的图形用户接口。它提供了窗口、标签、命令按钮、开关按钮、检查按钮、无线按钮、框架、列表框、组合框、树、列表视图、笔记本、状态条等构件。可以用它们来构造非常丰富的用户界面。
Gtk+本质上是面向对象的应用程序编程接口(API)。GObject 也就是这种面向对象的机制可以为Gtk+绑定很多种开发语言。虽然完全是用C写成的,但它仍然是用类和回调函数(指向函数的指针)的方法实现的。因为Gtk+是用C语言编写的,所以在开发Linux下的GUI程序时使用C语言是非常方便的。 在Gtk+下还可以使用图形化编程工具Glade,一种GUI生成器,可以快速生成创建界面的C源程序。
三、嵌入式Linux中的GUI
KDE(基于Qt toolkit)和GNOME(基于Gtk+ toolkit)的竞争从桌面GUI系统扩展到嵌入式GUI系统,分别有Qt/Embeded和GtkFB。在嵌入式领域、GUI种类繁多,比如Microwindows、miniGUI等。
3.1 Qte
前面说过Ot是一个图形界面库,它需要配合底层的X Server、X Lib等才能运行图形程序。Trol1Tech公司也针对嵌入式环境推出了“Ot/Embedded”产品,简称为Ote。与桌面版本不同,Qte已经直接取代掉X Server及X Lib等角色,将所有的功能全部整合在一起。它有如下特色:
- 与桌面Ot库使用相同的API接口:开发者只需要学习与套API接口,基于Qt或Qte开发的程序只需要维护一套代码,就可以运行于多种桌面环境(比如Windows、X11、Mac OS X)或者嵌入式Linux环境下;
- 针对嵌入式系统专门设计:使用 Ote,可以设计出占用内存、Flash更少的程序;
- Qte包含自己的窗口系统:Ote不再需要其他底层库的支持,它已经包含了一切,可以直接在它上面开发、运行图形程序;
- 可配置的外观:Ote的GUI是可以高度配置的,这有利于客户开发自己独特的程序;
- 完全的模块化设计:可以将不需要的功能模块去掉,这可以节省系统资源,这样的弹性让Ote更适合在嵌入式环境底下生存;
- 源代码完全开放:这使得用户可以深入调节Ote,或是了解它的具体实现;
- 与Qtopia 完美整合:Otopia 是Trolltech公司在Qte的基础上针对PDA和手机开发的应用平台和用户界面。基于Qte开发的应用程序可以轻易地迁移到基于Qtopia开发的设备上;
注意:Qt/Embeded:它是用于嵌入式Linux的Qt版本,简称Qte或Qt/E,所以其本质上还是一个库。Qtopia是一个基于Qte的类似于桌面系统的应用环境,即Qtopia是用Qte这个库开发出来的应用程序,而且这个程序比较特别,类似于PC上的KDE,我们看到的很多开发板或者Linux设备的界面,就是Qtopia。Qtopia在Android出现之前应用,但是2009年之后就不再更新。如果不是有特定的需求,不建议学习和使用Qtopia。
3.2 GtkFB
自从Qt 推出了嵌入式版本之后,虽然 Gtk+并非商业公司所发展,但也加紧脚步推出了GtkFB 方案,其宗旨就是要为嵌入式系统推出一套基于 Gtk+的GUI解决方案。与 Qte类似,GtkFB也跳过X层直接与FrameBuffer沟通,因此也具有Qte的几项优点。
- GtkFB 的最大优点是可以使用强大的Gtk+库,基于Gtk+库的软件极大丰富,并且 GtkFB 跳过了巨大的X,适用于PDA等嵌入式设备。GtkFB所用的API与桌面系统所用 API完全一样,这使得在桌面PC和嵌入式设备间移植软件、共享代码非常容易;
- 另一个优点是GtkFB是完全免费、完全公开的,它鼓励程序员进行修改以切合实际需要。它基于LGPL协议,用户无需公开他自己的代码,当然,被修改的库文件是要公开的。
- 另外,由于GtkFB不使用X协议,得以消除一些X协议所特有缺点;
缺点:
- GtkFB的最大缺点是它只能运行在单处理器系统上,这意味着无法使用其他处理器来分离、保护系统的不同部分,也很难使用GtkFB来设置大型的系统;
- 有些基于Gtk+的程序直接调用X,如果不修改代码,它们无法在 GtkFB 上直接运行。 GNOME 库有一些对X的直接调用,所以基于GNOME 库的程序需要一些修改;
- X拥有大量成熟的驱动程序,有极好的硬件加速功能。GtkFB也支持硬件加速,但是目前这方面的工作进展很小。这意味着GtkFB在某些方面运行得比较慢,特别是大屏幕情况下;
- Framebuffer不支持X的一些特性,比如网络透明、DGA等;
3.3 Microwindows
Microwindows 是一个著名的开放式源码嵌入式GUI 软件,遵循MPL协议,目的是把图形视窗环境引入到运行Linux 的小型设备和平台上。
作为X Window System的替代品,Microwindows可以使用更少的RAM 和文件存储空间(100K-600K)提供与X Window System相似的功能。
Microwindows 允许设计者轻松加入各种显示设备、鼠标、触摸屏和键盘等。Microwindows 的可移植性非常好,基本上用C语言实现,只有某些关键代码使用了汇编以提高速度。Microwindows支持ARM芯片。尽管Microwindows 完全支持linux,但是它内部的可移植结构是基于一个相对简单的屏幕设备接口,可在许多不同的RTOS和裸机上运行。
Microwindows中使用两种流行的图形编程接口:Microsoft Windows Win32/WinCE图形显示接口(GDI)和Xlib-like接口。前者应用于所有的Windows CE和Win32应用程序,后者就象Nano-X,应用于所有Linux X插件集的最底层。这样做可以让大量的Windows程序员开发图形应用程序,类似地也可以让Linux图形程序员用X接口开发图形应用程序。
3.4. MiniGUI
MiniGUI是我国做得比较好的自由软件之一,它是在Linux控制台上运行的多窗口图形操作系统,可以在以Linux为基础的应用平台上提供一个简单可行的MiniGUI支持系统。
小是MiniGUI的特色,MiniGUI可以应用在电视机顶盒、实时控制系统、掌上电脑等诸多场合。由于这是由我国自己开发的GUI 系统,所以MiniGUI对于中文的支持最好。它支持GB2312与BIG5 字符集,其他字符集也可以轻松加入。
MiniGUI支持跨操作系统具体包括普通嵌入式 Linux/uClinux、VxWorks、eCos、uC/OS-II、pSOS、ThreadX、Nucleus、OSE 等,同时还提供Win32平台上的SDK开发包,方便嵌入式应用程序的开发和调试。并且非常适合 eCos/uCOS-II/ThreadX 等无文件系统支持的实时嵌入式操作系统。
3.5 TouchGFX
非开源;以界面华丽,流畅以及强劲的 TouchGFX Designer著称;界面非常炫,堪比手机的APP界面。已经被ST收购,在ST MCU、MPU上可免费使用。
使用TouchGFX开发STM32界面,有两种方法。
- 一是利用TouchGFX Designer软件,支持图片和控件拖拽、可快速生成在KEIL或IAR等IDE中可打开的项目工程;
- 另一种方法是,STM32CUBEMX 5.0版本增加了对TouchGFX的支持,可以使用CubeMX开发TouchGFX应用;
3.6 emWin(uCGUI,STemWin)
老牌的嵌入式 GUI 了,有着十几年的历史,软件架构和功能比较成熟了。主要是SEGGER(没错就是做仿真器的那个)来开发和维护。但是做出来比较炫的效果非常麻烦,且不支持较为复杂的控件。
ucGUI是Segger公司为Micrium公司(ucos所属公司)定制的emWin,使用的时候都需要向该公司交纳版权费。
而STemWin是Segger公司为ST公司定制的emWin;如果我们使用的ST的芯片,则可以免费使用STemWin。
3.7 Embedded Wizard
德国TARA System公司开发的一个使用舒适、灵活的嵌入式系统GUI开发工具。出现较晚,在emWin和TouchGFX之后,以华丽,流畅的界面和强劲的GUIBuilder 著称。官方号称支持几乎任意平台。也是要收费的。
3.8 选型
小型的嵌入式系统不同于桌面级的Windows、Linux显示、也不同于移动终端(手机、平板)上的Android、IOS显示。小型嵌入式系统的GUI通常可能是定制的,要显示的内容比较有限,也没有复杂、丰富的应用。而且小型嵌入式系统的硬件平台通常是MCU(Microcontroller Unit,微控制器),显示时没有GPU、3D渲染等硬件单元,也无法运行大型操作系统,桌面级和移动端的成熟GUI无法与其适配,也无法在这类系统上运行。
小型嵌入式系统GUI选型时需要考虑如下几个问题:
- 应用场景,主要需要显示什么,显示的是否复杂;
- 与使用的操作系统的结合,移植难度;
- 硬件平台,是否已经有现成可用的GUI与其适配;
- GUI的开源协议,是否收费;
参考文章
[2]嵌入式linux常用GUI系统(推荐)
[3]嵌入式系统的GUI分类及介绍——面向MCU微控制器硬件平台的GUI
[5]嵌入式linux应用开发完全手册.pdf