MiniGUI是一款面向嵌入式系统的高级窗口系统(Windowing System)和图形用户界面(Graphical User Interface,GUI)支持系统,由魏永明先生于 1998 年底开始开发。2002 年,魏永明先生创建北京飞漫软件技术有限公司,为 MiniGUI 提供商业技术支持,同时也继续提供开源版本,飞漫软件是中国地区为开源社区贡献代码最多的软件企业。最后一个采用 GPL 授权的 MiniGUI 版本是 1.6.10,从 MiniGUI 2.0.4 开始 MiniGUI 被重写并增加商业授权。
经过十几年的发展, MiniGUI 已经支持Linux/uClinux、eCos、 uC/OS-II、VxWorks、ThreadX、Nucleus 、pSOS、OSE 等操作系统和数十种 SoC 芯片,已验证的硬件平台包括 ARM-based SoCs 、MIPS based SoCs 、IA-based SoCs 、PowerPC、M68K(DragonBall /ColdFire)、Intel x86 等,广泛应用于通讯、医疗、工控、电力、机顶盒、多媒体终端等领域。
使用 MiniGUI 成功开发产品的企业有华为、中兴通讯 等。这些用户广泛分部在中国大陆、台湾、新加坡、韩国、美国、德国、意大利、印度、以色列等国家和地区。
在 MiniGUI 的基础上,飞漫软件研发了 mDolphin (基于开源的浏览器核心 WebKit 的嵌入式浏览器)、mPeer (为使用 Java 技术的嵌入式设备提供高效的 J2SE AWT/Swing 实现支持),并且开发了基于 Eclipse CDT 的可视化集成开发环境,为开发人员提供所见即所得(WYSIWYG)的界面设计环境。
2010年,飞漫软件把最新版的 MiniGUI、mDolphin、mPeer、mStudio 等系统集成在一起,推出了合璧操作系统(HybridOS)解决方案。
截止2010年9月,MiniGUI 的最新版本是3.0.10, MiniGUI 将作为合璧操作系统(HybridOS)的一个组成部分而不断演进。
MiniGUI 为嵌入式 Linux 系统提供了完整的图形系统支持,是全球针对嵌入式 Linux仅有的两个商用嵌入式GUI系统之一。MiniGUI为嵌入式Linux 系统提供了完整的多进程支持;可以 MiniGUI-Processes、MiniGUI-Threads或者MiniGUI-Standalone 三种运行模式运行。
MiniGUI 的主要技术特性描述如下:
MiniGUI 的技术优势 和其它针对嵌入式产品的图形系统相比,MiniGUI 在对系统的需求上具有如下几大优势:
总之,将现代窗口和图形技术带入到嵌入式设备的MiniGUI,是一个非常适合于实时嵌入式设备的高效、可靠、可定制、小巧灵活的图形用户界面支持系统,其主要优点可以总结如下:
MiniGUI V3.0 在以前版本的基础上新增了如下新特性:
MiniGUI 由如下几个模块组成: MiniGUI软件架构图
在 MiniGUI 核心(Core)接口之上,还为应用程序提供若干组件,这些组件分别为应用程序提供某些特殊的功能特性:
和 Linux 这样的类 UNIX 操作系统相比,一般意义上的传统嵌入式操作系统具有一些特殊性。举例而言,诸如 uClinux、uC/OS-II、eCos 等操作系统,通常运行在没有 MMU(内存管理单元,用于提供虚拟内存支持)的 CPU 上;这时,往往就没有进程的概念,而只有线程或者任务的概念,这样,MiniGUI 的运行环境也就大相径庭。因此,为了适合不同的操作系统环境,可将 MiniGUI 配置成三种不同的运行模式:
一般而言,MiniGUI-Standalone 模式的适应面最广,可以支持几乎所有的操作系统(目前只用来提供对 Linux/uClinux 操作系统的支持);MiniGUI-Threads 模式的适用面次之,可运行在支持多任务的实时嵌入式操作系统,或者具备完整 UNIX 特性的普通操作系统;MiniGUI-Processes 模式的适用面较小,它仅适合于具备完整 UNIX 特性的嵌入式操作系统,比如 Linux。但不论采用哪种运行模式,MiniGUI 为上层应用软件提供了最大程度上的一致性;只有少数几个涉及初始化的接口在不同运行模式上有所不同。
MiniGUI 4.0 正在设计开发当中。
MiniGUI hello world以C撰写,这支程序含有视窗,标题为"Hello, World".
#include <stdio.h>#include <minigui/common.h>#include <minigui/minigui.h>#include <minigui/gdi.h>#include <minigui/window.h>int MiniGUIMain (int argc, const char* argv){ MSG Msg; HWND hMainWnd; MAINWINCREATE CreateInfo;#ifdef _MGRM_PROCESSES JoinLayer(NAME_DEF_LAYER , "helloworld" , 0 , 0);#endif CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION; CreateInfo.dwExStyle = WS_EX_AUTOSECONDARYDC; CreateInfo.spCaption = "Hello, World"; CreateInfo.hMenu = 0; CreateInfo.hCursor = GetSystemCursor(0); CreateInfo.hIcon = 0; CreateInfo.MainWindowProc = DefaultMainWinProc; CreateInfo.lx = 0; CreateInfo.ty = 0; CreateInfo.rx = g_rcScr.right; CreateInfo.by = g_rcScr.bottom; CreateInfo.iBkColor = COLOR_lightwhite; CreateInfo.dwAddData = 0; CreateInfo.hHosting = HWND_DESKTOP; hMainWnd = CreateMainWindow(&CreateInfo); if (hMainWnd == HWND_INVALID) return -1; while (GetMessage(&Msg, hMainWnd)) { TranslateMessage(&Msg); DispatchMessage(&Msg); } MainWindowThreadCleanup (hMainWnd); return 0;}