首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

面向实时嵌入式系统的图形用户界面支持系统――MiniGUI特色

面向实时嵌入式系统的图形用户界面支持系统――MiniGUI特色

2.1 设计目标:小巧和可配置
MiniGUI最初是为了满足一个工业控制系统(计算机数控系统)的需求而设计和开发的。这个工业控制系统是清华大学为一台数控机床设计的计算机数控系统(CNC)。在比较DOS、Windows 98、Windows NT、Linux 等系统之后,该项目组决定选择RT-Linux 作为实时操作系统,以便满足 2ms甚至更高的实时性。但是图形用户界面是一个问题,因为 X Window不适合于实时控制系统,并且当时 X Window系统的本地化也不尽人意。因此,决定自己开发一套图形用户界面支持系统。这就是MiniGUI 产生的背景。显然,MiniGUI一开始就针对实时系统而设计,因此,在设计之初就考虑到了小巧、高性能和高效率。目前,这个数控系统的开发已近尾声,MiniGUI在其中担当了非常重要的角色。
在考虑到其他不同于数控系统的嵌入式系统时,为了满足千变万化的需求,必须要求GUI 系统是可配置的。在 CNC 系统中得到成功应用之后,我们立即着手于MiniGUI 可配置的设计。我们通过 Linux 下的 automake 和 autoconf接口,实现了大量的编译配置选项,通过这些选项可指定 MiniGUI库中包括哪些功能而同时不包括哪些功能。
因此,MiniGUI是一个非常适合于工业控制实时系统以及嵌入式系统的可定制的、小巧的图形用户界面支持系统。
2.2 重要特色
2.2.1 多线程和多窗口
MiniGUI中的窗口基本分四类,分别为主窗口、对话框、控件和主窗口中的子窗口。
MiniGUI 中的主窗口和 Windows应用程序的主窗口概念类似,但有一些重要的不同,MiniGUI中的每个主窗口及其附属主窗口对应于一个单独的线程,通过函数调用可建立主窗口以及对应的线程。每个线程有一个消息队列,属于同一线程的所有主窗口从这一消息队列中获取消息并由窗口过程(回调函数)进行处理。
VCOnGUI,即 Virtual Console On MiniGUI,是 MiniGUI上的虚拟控制台,即运行在 MiniGUI 上的 Linux 控制台仿真器,见图1。从图1可以看到,MiniGUI应用程序能够同时创建多个窗口,并且运行在不同的线程。
图 1 VConGUI -- MiniGUI 上的 Linux控制台仿真器2.2.2 对话框和标准控件
MiniGUI中的对话框是一种特殊的窗口,对话框一般和控件一起使用,这两个概念和Windows 或 X Window 中的相关概念是类似的。MiniGUI支持的控件类型有:
静态框:文本、图标或矩形框等。
文本框:单行或多行的文本编辑框。
按钮:单选钮、复选框和一般按钮等。
列表框。
进度条。
工具栏。
HappyLinux 是国内某公司开发的中文 Linux发行版,该发行版的安装程序就建立在 MiniGUI 之上。图 2 和图 3 是HappyLinux 安装程序的典型屏幕。
图 2 HappyLinux 的软件包选择界面图 3 HappyLinux的分区界面2.2.3 其他 GUI 元素
MiniGUI 还支持弹出式菜单、插入符、定时器、光标、快捷键等常见的GUI 元素。图 4 和图 5 说明了其他 GUI 元素的应用情况。图 4 是 Bomb游戏,是 Windows 扫雷游戏的克隆。图 5 是经典的俄罗斯方块游戏的MiniGUI 版本,见图 5。
图 4 扫雷游戏的克隆:Bomb 游戏图图 5俄罗斯方块游戏的 MiniGUI 版本2.2.4 消息和消息循环
在任何 GUI系统中,均有事件或消息驱动的概念。在MiniGUI中,我们使用消息驱动作为应用程序的创建构架。
在消息驱动的应用程序中,计算机外设发生的事件,例如键盘键的敲击、鼠标键的按击等,都由支持系统收集,将其以事先的约定格式翻译为特定的消息。应用程序一般包含有自己的消息队列,系统将消息发送到应用程序的消息队列中。应用程序可以建立一个循环,在这个循环中读取消息并处理消息,直到特定的消息传来为止。这样的循环称为消息循环。一般地,消息由代表消息的一个整型数和消息的附加参数组成。
应用程序一般要提供一个处理消息的标准函数。在消息循环中,系统可以调用此函数,应用程序在此函数中处理相应的消息。
2.2.5 图形和输入抽象层
在 MiniGUI 0.3.xx 的开发中,我们引入了图形和输入抽象层(Graphicsand Input Abstract Layer,GAL 和 IAL)的概念。抽象层的概念类似Linux内核虚拟文件系统的概念。它定义了一组不依赖于任何特殊硬件的抽象接口,所有顶层的图形操作和输入处理都建立在抽象接口之上。而用于实现这一抽象接口的底层代码称为"图形引擎"或"输入引擎",类似操作系统中的驱动程序。这实际是一种面向对象的程序结构。利用GAL 和 IAL,MiniGUI 可以在许多图形引擎上运行,比如 SVGALib 和LibGGI,并且可以非常方便地将 MiniGUI 移植到其他 POSIX系统上,只需要根据我们的抽象层接口实现新的图形引擎即可。目前,我们已经编写了基于SVGALib 和 LibGGI 的图形引擎。利用 LibGGI, MiniGUI应用程序可以运行在 X Window上,将大大方便应用程序的调试。我们目前正在进行 MiniGUI私有图形引擎的设计开发。通过 MiniGUI的私有图形引擎,我们可以最大程度地针对窗口系统对图形引擎进行优化,最终提高系统的图形性能和效率。
GAL 和 IAL 的实现,大大提高了 MiniGUI 的可移植性。我们不需要对MiniGUI 的上层代码进行丝毫修改,只需实现新的 GAL 和 IAL引擎,就可以让 MiniGUI 运行在其他基于不同硬件的嵌入式 Linux系统上。比如,蓝点公司在两周内就将 MiniGUI 移植到了基于 StrongARM的两款嵌入式系统之上。图 6 就是蓝点公司开发的运行于 StrongARM之上的智能信息家电产品。
图 6 正在进行网上购物的蓝点信息家电客户端2.2.6 多字体和多字符集支持
在成功引入 GAL 和 IAL之后,我们又在处理字体和字符集的模块当中引入了逻辑字体的概念。逻辑字体是MiniGUI用来处理文本(包括文本输出和文本分析)的顶层接口。逻辑字体接口将各种不同的字体(比如宋体、黑体和揩体)和字体格式(比如等宽字体、变宽字体等光栅字体和TrueType、Type1等矢量字体),以及各种不同字符集(ISO-8859、GB2312、Big5、UNICODE等)综合了起来,从而可以通过统一的接口显示不同字符集的不同字体的文本,并且还可以分析各种字符集文本的组成,比如字符、单词等。在多字体和多字符集的支持中,我们也采用了面向对象的软件技术,使得添加新的字体支持和新的字符集支持非常方便。目前,MiniGUI能够支持各种光栅字体和 TrueType、Type 1 等矢量字体,并能够支持GB2312、Big5 等多字节字符集,UNICODE的支持正在开发当中。有了这一技术,我们就可以在 MiniGUI的同一窗口中显示属于不同字符集的、不同字体的文本。
图 7 给出了 MiniGUI 的高级字体支持功能。第一个界面采用 TTF字体,以旋转方式输出"MiniGUI ISGREAT!";第二个界面给出了多种字体文字的居中、右对齐等输出效果。
图 7 MiniGUI 的高级字体支持3 MiniGUI 近期开发情况
从 1998 年下半年开始 MiniGUI 的开发以后,就一直得到了来自Internet的自由软件程序员的鼓励和支持。到目前为止,国内外已经有多家嵌入式系统厂商开始在MiniGUI上开发其嵌入式产品,其中也包括清华大学、中科院等科研单位。因此可以说,MiniGUI的开发已经从最初的孤军作战发展到包括企业、科研单位、个人在内的市集式开发模式,真正体现出了自由软件的强大生命力。目前,正在进行的MiniGUI 开发包括:
1.针对 GUI 系统开发 MiniGUI私有的图形引擎,以便进一步提高图形操作的性能,同时为添加高级的光栅操作函数打下基础。        
2.在多窗口处理上进一步开发,以便完善现有的窗口机制。比如目前已进入测试状态的控件嵌套功能。        
3.进一步开发 MiniGUI 上的控件,比如工具栏、高级列表框等。        
4.提供基于传统 UNIX 系统 IPC机制的客户/服务器体系,以便支持大型应用程序。        
5.开发基于 MiniGUI 的 GPL应用程序,比如小型字处理程序、电子邮件客户程序等。
返回列表