MiniGUI的软件架构

 

4.1 MiniGUI的软件架构

为什么 MiniGUI 能够在如此众多的嵌入式操作系统上运行?这是因为 MiniGUI 具有良好的软件架构,通过抽象层将 MiniGUI 上层和底层操作系统隔离开来。如图4.1 所示,基于 MiniGUI 的应用程序一般通过 ISO C 库、操作系统和驱动程序接口以及 MiniGUI 自身提供的 API 来实现自己的功能;MiniGUI 中的抽象层将特定操作系统及底层硬件的细节隐藏起来,因而上层应用程序无需关心底层的硬件平台输出和输入设备。另外,MiniGUI 特有的运行模式概念,也为跨操作系统的支持提供了便利。

 

MiniGUI的软件架构_第1张图片  图 4.1 MiniGUI 的软件架构图

如上图所示,从底至上,MiniGUI 由如下几个模块组成:

  • 图形抽象层(Graphics Abastract Layer,GAL)。图形抽象层将来自不同操作系统或设备的图形接口进行抽象,为 MiniGUI 上层提供统一的图形接口。在图形抽象层内,包含有针对 Linux FB 设备、eCos LCD 设备等的软件组成部分。这些软件组成部分通过调用底层设备的接口来实现具体的图形抽象层操作,如打开设备、设置分辨率及显示模式、关闭设备等。我们将这些用于适配图形抽象层接口的软件组成部分称为“引擎(engine)”,其概念和操作系统中的设备驱动程序类似。
  • 输入抽象层(Input Abstract Layer,IAL)。和 GAL 类似,输入抽象层将 MiniGUI 涉及的所有输入设备,如键盘(keyboard)、小键盘(keypad)、鼠标(mouse)、触摸屏(touch screen)等抽象了出来,为上层提供一致的接口。要支持不同的键盘、触摸屏或者鼠标接口,则通过为 IAL 编写不同的输入引擎实现。MiniGUI 通过 IAL 及其输入引擎,提供对 Linux 控制台(键盘及鼠标)、触摸屏、遥控器、小键盘等输入设备的支持。
  • 图形设备接口(Graphics Device Interfaces,GDI)。该模块基于图形抽象层为上层应用程序提供图形相关的接口,如绘制曲线、输出文本、填充矩形等等。图形设备接口中含包含其他比较独立的子模块,如字体字符集(font and charset)支持、图像(image)支持等。
  • 消息处理模块(Messaging Module)。该模块在输入抽象层基础上,实现了 MiniGUI 的消息处理机制,为上层提供了完备的消息管理接口。众所周知,几乎所有的GUI 系统本质上都是事件驱动的,系统自身的运行,以及GUI 应用程序的运行,都依赖于消息处理模块。
  • 多窗口处理模块(Windowing Module)和控件(Control 或 Widget)。基于图形设备接口和消息处理模块,MiniGUI 实现了多窗口处理模块。该模块为上层应用程序提供了创建主窗口和控件的基本接口,并负责维护控件类。控件类是用来实现控件代码重用的重要概念,利用控件类(control class),我们可以创建属于某个控件类的多个控件实例(instance),从而让这些控件实例使用同一个控件类的代码,这样,我们就实现了类似 C++ 那样的类和实例概念,从而可以最大程度上重复利用已有代码,并提高软件的可维护性。MiniGUI 的控件模块实现了常见的 GUI 控件,如静态框、按钮、编辑框、列表框、下拉框等等。
  • 外观支持(Look and Feel)。这个模块是 MiniGUI V3.0 提供给上层应用程序的接口,可用来定制 MiniGUI 窗口、控件的绘制。在 MiniGUI V3.0 之前的版本中,对主窗口和控件的定制能力,还没有被抽离出来形成独立的模块,但我们仍然可以通过配置选项让 MiniGUI 的主窗口、控件具有三种显示风格,分别是:类似 PC 的三维风格(PC3D)、平板风格(FLAT)、流行风格(FASHION)。在 MiniGUI 3.0 中,主窗口和控件的外观可完全由应用程序自行定制,在创建主窗口或者控件时,指定外观渲染器(renderer)的名称,就可以让主窗口或者控件具有各自不同的外观。

以上模块组成了 MiniGUI 的核心(core);在 MiniGUI 接口之上,我们还为应用程序提供若干组件:mGi mGp mG3d mGUtils mGPlus,这些组件分别为应用程序提供某些特殊的功能特性。我们将在后面详细介绍这些组件。

 

4.2 MiniGUI 运行模式

如前所述,和 Linux 这样的类 UNIX 操作系统相比,一般意义上的传统嵌入式操作系统具有一些特殊性。举例而言,诸如 uClinux、uC/OS-II、eCos 等操作系统,通常运行在没有 MMU(内存管理单元,用于提供虚拟内存支持)的 CPU 上;这时,往往就没有进程的概念,而只有线程或者任务的概念,这样,MiniGUI 的运行环境也就大相径庭。因此,为了适合不同的操作系统环境,我们可将 MiniGUI 配置成三种不同的运行模式:

  • MiniGUI-Threads。运行在 MiniGUI-Threads 上的程序可以在不同的线程中建立多个窗口,但所有的窗口在一个进程或者地址空间中运行。这种运行模式主要用来支持大多数传统意义上的嵌入式操作系统,比如 VxWorks、ThreadX、Nucleus、OSE、pSOS、uC/OS-II、eCos等等。当然,在 Linux 和 uClinux 上,MiniGUI 也能以 MiniGUI-Threads 的模式运行。
  • MiniGUI-Processes1 。和 MiniGUI-Threads相反,MiniGUI-Processes 上的每个程序是单独的进程,每个进程也可以建立多个窗口,并且实现了多进程窗口系统。MiniGUI-Processes 适合于具有完整 UNIX 特性的嵌入式操作系统,比如嵌入式 Linux。该运行模式在 MiniGUI V2.0.x 中提供,在MiniGUI V3.0中得到进一步增强,有关该模式的详细介绍将在下面阐述。
  • MiniGUI-Standalone5。这种运行模式下,MiniGUI 可以以独立任务的方式运行,既不需要多线程也不需要多进程的支持,这种运行模式适合功能单一的应用场合。比如在一些使用 uClinux 的嵌入式产品中,因为各种原因而缺少线程支持,这时,就可以使用 MiniGUI-Standalone 来开发应用软件。

一般而言,MiniGUI-Standalone 模式的适应面最广,可以支持几乎所有的操作系统2;MiniGUI-Threads 模式的适用面次之,可运行在支持多任务的实时嵌入式操作系统,或者具备完整 UNIX 特性的普通操作系统;MiniGUI-Processes 模式的适用面较小,它仅适合于具备完整 UNIX 特性的嵌入式操作系统,比如 Linux。

但不论采用哪种运行模式,MiniGUI 为上层应用软件提供了最大程度上的一致性;只有少数几个涉及初始化的接口在不同运行模式上有所不同。

4.2.1MiniGUI-Processes运行模式 MiniGUI-Processes 运行模式是 MiniGUI V2.0.x 在 MiniGUI-Lite 运行模式基础上为具有多进程支持的嵌入式操作系统提供的。MiniGUI V1.6.x 及以前版本为具有多进程特性的 Linux 操作系统提供 MiniGUI-Lite 运行模式,使之在高效的客户/服务器架构之上运行多个客户进程,从而充分利用进程地址空间保护这样的高级特性,有了这样的特性,可大大提高基于 MiniGUI 的嵌入式系统的灵活性、稳定性以及可扩展性。比如,我们可以在 MiniGUI-Lite 上运行多个 MiniGUI 客户进程,而单个进程的异常退出,不会影响其他的 MiniGUI 客户进程。而且在这种架构之上,我们可以非常方便地集成第三方应用程序。其实,这也是许多嵌入式设备开发商采用 Linux 操作系统的重要理由。

但是,MiniGUI-Lite 运行模式虽然提供了多进程支持,但无法同时管理来自不同进程间的窗口,因此,MiniGUI-Lite 用层的概念将不同的进程之间的窗口区分开来。这种实现方法虽然可适用于大多数屏幕分辨率较小的嵌入式设备,但仍然给应用程序的开发带来了不便。

MiniGUI V2.0.X 则彻底解决了上述问题。MiniGUI V2.0.X 在MiniGUI-Lite运行模式基础上,实现了完整的多进程环境中的窗口系统,来自不同进程的窗口可以在同一桌面上协调存在。MiniGUI V3.0不但完全继承了MiniGUI V2.0.X的MiniGUI-Processes运行模式,而且用户可自定义桌面上的图标并响应桌面事件,以方便实现桌面的定制。图4.2给出了 MiniGUI V1.6.x的 MiniGUI-Lite运行模式及MiniGUI V3.0的MiniGUI-Processes运行模式在运行相同应用程序情况下的界面效果。

 

 MiniGUI的软件架构_第2张图片 图 4.2 MiniGUI V1.6.x 的 MiniGUI -Lite 运行模式及 MiniGUI V3.0 的 MiniGUI -Processes 运行模式

图 4.2 中,第一个屏幕运行了 vcongui 和推箱子游戏这两个客户进程。可以看到,我们在运行推箱子程序之后,就看不到 vcongui 程序了;第二个屏幕运行 same、扫雷和推箱子游戏这三个客户进程,但我们可在桌面上看到所有的客户进程窗口。

相比 MiniGUI-Lite,MiniGUI-Processes 运行模式具有明显的优势。这使得 MiniGUI 不仅可适用于传统的嵌入式操作系统(MiniGUI-Threads),还可适用于具有多进程特性的嵌入式操作系统,比如 Linux 操作系统。另外,MiniGUI-Processes 也保留了 MiniGUI-Lite 的层概念,用户可以将来自不同客户进程的窗口放到不同的层中,从而实现类似 X Window 那样的工作区。有了 MiniGUI-Processes 运行模式,MiniGUI 的应用领域将进一步扩大,不仅可用于高端的嵌入式设备,还可能用于桌面环境。

 

4.2.2 各操作系统上可运行的 MiniGUI 运行模式

表 4.1 给出了 MiniGUI V3.0.x 、 MiniGUI V2.0.x /1.6.x 在各操作系统上可支持的运行模式。

表 4.1 MiniGUI 在操作系统上的运行模式
操作系统 MiniGUI 版本 所支持的运行模式
Linux MiniGUI V3.0.x MiniGUI-Processes
MiniGUI-Threads
MiniGUI-Standalone
Linux MiniGUI V2.0.x MiniGUI-Processes
MiniGUI-Threads
MiniGUI-Standalone
uClinux MiniGUI V1.6.x MiniGUI-Threads
MiniGUI-Standalone
VxWorks 6.x MiniGUI V1.6.x MiniGUI-Threads
VxWorks 5.x MiniGUI V1.6.x MiniGUI-Threads
ThreadX MiniGUI V1.6.x MiniGUI-Threads
Nucleus MiniGUI V1.6.x MiniGUI-Threads
OSE MiniGUI V1.6.x MiniGUI-Threads
eCos MiniGUI V1.6.x MiniGUI-Threads
uC/OS-II MiniGUI V1.6.x MiniGUI-Threads
pSOS MiniGUI V1.6.x MiniGUI-Threads

 

4.1 窗口系统

MiniGUI 中窗口组织为层次体系结构的形式。根窗口作为所有窗口的祖先,除了根窗口以外的所有窗口都有父窗口,每一个窗口都可能有子窗口、兄弟窗口、祖先窗口和子孙窗口等。在同一级的窗口可以重叠,但是某个时刻只能有一个窗口输出到重叠区域。

MiniGUI 中有三种窗口类型:主窗口、对话框和控件窗口(子窗口)。主窗口通常包括一些子窗口,这些子窗口通常是控件窗口,也可以是自定义窗口类。应用程序还会创建其它类型的窗口,例如对话框和消息框。对话框本质上就是主窗口,应用程序一般通过对话框提示用户进行输入操作。

 

4.2 通讯机制

MiniGUI 下的通讯是一种类似于Win32的消息机制,对于运行在线程模式的MiniGUI版本,线程间的消息传递模型如下图所示,其中的 Desktop 线程充当一个微服务器,所有的消息在Event线程获取出来以后就会投递给 Desktop 线程,然后再分发到目的应用程序主窗口上面,如图4.5所示。

 

 MiniGUI的软件架构_第3张图片 图 4.5 MiniGUI -Threads 运行模式的消息通讯机制

对于运行在进程版的MiniGUI来说,应用程序的消息传递则通过套接字来进行,相应的处理模型如图4.6所示。

 

 MiniGUI的软件架构_第4张图片 图 4.6 MiniGUI -Processes 运行模式的消息通讯机制

 

4.3 字体

MiniGUI 提供了对点阵字体及矢量字体的支持,到目前为止,MiniGUI已经实现了对RBF、VBF字体(这是 MiniGUI定义的两种点阵字体格式)、TrueType、Adobe Type1字体等的支持。同时MiniGUI还提供了对 QPF(Qt Pre-rendered Fonts)字体的支持。MiniGUI可以对点阵字体进行自动放大处理,并可针对电视等特殊显示设备实现防锯齿功能。

MiniGUI V3.0实现一种新的设备字体----位图字体,这种字体可以根据用户自己制做的位图来构建字型,可以与其它逻辑字体接口一样提供给应用程序及控件使用;VBF V3.0字体是对VBF V2.0的升级版本,不再限制只能用于支持Latin体系的字符集,单个VBF字体可包含的字型数目不再限制于255以内;UPF字体是QPF字体的优化版本,便于MiniGUI通过内存映射的方式使用,降低了MiniGUI-Processes模式下使用QPF字体时的内存占用。支持阿拉伯文,希伯莱文等双向文本的显示。

 

4.4 输入设备的支持

MiniGUI 支持各种通用的鼠标设备,对触摸屏的支持也非常出色,并针对触摸屏的校正为用户提供了校正接口。

MiniGUI 支持最多含 255 个键的各种键盘。此外,MiniGUI 还提供了对多种键盘布局的支持,如支持常见的美式 PC 键盘,法语、德语等西欧语种的键盘布局。

除了常见的输入设备类型,如 PC 键盘、鼠标、触摸屏之外,MiniGUI 的输入抽象层机制也允许支持遥控器、小键盘、按键等特殊的输入设备。

 

4.5 输入引擎

以前使用的图形引擎qvfb、wvfb 给MiniGUI的开发带来了一些便利,但毕竟作为独立的应用程序存在,导致了一些不方便,如虚拟帧缓冲区程序需要单独启动,且需要用户自行设定显示模式;在MiniGUI-Threads 和 MiniGUI-Standalone模式下,只能启动一个 MiniGUI 应用程序。理论上,应该是可以让不同的程序运行在不同的虚拟帧缓冲区程序中。为此最新MiniGUI V3.0解决了这个问题,统一了虚拟缓冲区图形引擎称为xvfb,实现了 xvfb将虚拟帧缓冲区中的数据刷新到窗口中的程序,使用户执行程序时更加简单易用。

你可能感兴趣的:(MiniGUI的软件架构)