Integrate MiniGui & D-Bus
时间:2009-07-03 来源:klutercoco
1. MiniGui 介绍
MiniGUI(http://www.minigui.com)是根据嵌入式系统应用特点量身定做的图形支持系统。MiniGUI 为应用程序定义了一组轻量级的窗口和图形设备接口。利用这些接口,每个应用程序可以建立多个窗口并在这些窗口中创建各种控件。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、VxWorks 6 等。该运行模式在 MiniGUI V2.0.3 中提供,有关该模式的详细介绍将在下面阐述。
③ MiniGUI-Standalone。这种运行模式下,MiniGUI 可以以独立任务的方式运行,既不需要多线程也不需要多进程的支持,这种运行模式适合功能单一的应用场合。比如在一些使用 uClinux 的嵌入式产品中,因为各种原因而缺少线程支持,这时,就可以使用 MiniGUI-Standalone 来开发应用软件。
Linux/uClinux 支持上述三种运行模式。关于运行模式的详细内容请参考《MiniGUI 技术白皮书》。 2. MiniGUI 的软件架构 MiniGUI 能够在如此众多的嵌入式操作系统上运行是因为 MiniGUI 具有良好的软件架构,通过抽象层将 MiniGUI 上层和底层操作系统隔离开来。如图所示,基于 MiniGUI 的应用程序一般通过 ANSI C 库、操作系统和驱动程序接口以及 MiniGUI 自身提供的 API 来实现自己的功能;MiniGUI 中的“可移植层”可将特定操作系统及底层硬件的细节隐藏起来,而上层应用程序则无需关心底层的硬件平台输出和输入设备。
********************************************************************************* * MiniGUI Applications * ********************************************************************************* * MiniGUI * * ********************************************** ANSI C Library * * Portable Layer * *
********************************************************************************* * Devices * Linux/uClinux, VxWorks, ThreadX, Nucleus, OSE, eCos, uC/OS-II, pSOS * ********************************************************************************* * ix86, ARM, MIPS, PowerPC, M68K… *
*********************************************************************************
图 MiniGUI 和嵌入式操作系统的关系 3. MiniGUI的通讯机制 MiniGUI 下的通讯是一种类似于 Win32 的消息机制,对于运行在线程模式的 MiniGUI 版本,线
程间的消息传递模型如下图所示,其中的 Desktop 线程充当一个微服务器,所有的消息在 Event 线
程获取出来以后就会投递给 Desktop 线程,然后再分发到目的应用程序主窗口上面, 500)this.width=500;" border=0> 对于运行在进程版的 MiniGUI 来说,应用程序的消息传递则通过套接字来进行,相应的处理模型
如图 4.4 所示。 500)this.width=500;" border=0> 4. 消息和消息循环 在任何 GUI 系统中,均有事件或消息驱动的概念。在MiniGUI中,我们使用消息驱动作为应用程序的创建构架。 在消息驱动的应用程序中,计算机外设发生的事件,例如键盘键的敲击、鼠标键的按击等,都由支持系统收集,将其以事先的约定格式翻译为特定的消息。应用程序一般包含有自己的消息队列,系统将消息发送到应用程序的消息队列中。应用程序可以建立一个循环,在这个循环中读取消息并处理消息,直到特定的消息传来为止。这样的循环称为消息循环。一般地,消息由代表消息的一个整型数和消息的附加参数组成。应用程序一般要提供一个处理消息的标准函数。在消息循环中,系统可以调用此函数,应用程序在此函数中处理相应的消息。 图 2 是一个消息驱动的应用程序的简单构架示意。 500)this.width=500;" border=0> 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、VxWorks 6 等。该运行模式在 MiniGUI V2.0.3 中提供,有关该模式的详细介绍将在下面阐述。
③ MiniGUI-Standalone。这种运行模式下,MiniGUI 可以以独立任务的方式运行,既不需要多线程也不需要多进程的支持,这种运行模式适合功能单一的应用场合。比如在一些使用 uClinux 的嵌入式产品中,因为各种原因而缺少线程支持,这时,就可以使用 MiniGUI-Standalone 来开发应用软件。
Linux/uClinux 支持上述三种运行模式。关于运行模式的详细内容请参考《MiniGUI 技术白皮书》。 2. MiniGUI 的软件架构 MiniGUI 能够在如此众多的嵌入式操作系统上运行是因为 MiniGUI 具有良好的软件架构,通过抽象层将 MiniGUI 上层和底层操作系统隔离开来。如图所示,基于 MiniGUI 的应用程序一般通过 ANSI C 库、操作系统和驱动程序接口以及 MiniGUI 自身提供的 API 来实现自己的功能;MiniGUI 中的“可移植层”可将特定操作系统及底层硬件的细节隐藏起来,而上层应用程序则无需关心底层的硬件平台输出和输入设备。
********************************************************************************* * MiniGUI Applications * ********************************************************************************* * MiniGUI * * ********************************************** ANSI C Library * * Portable Layer * *
********************************************************************************* * Devices * Linux/uClinux, VxWorks, ThreadX, Nucleus, OSE, eCos, uC/OS-II, pSOS * ********************************************************************************* * ix86, ARM, MIPS, PowerPC, M68K… *
*********************************************************************************
图 MiniGUI 和嵌入式操作系统的关系 3. MiniGUI的通讯机制 MiniGUI 下的通讯是一种类似于 Win32 的消息机制,对于运行在线程模式的 MiniGUI 版本,线
程间的消息传递模型如下图所示,其中的 Desktop 线程充当一个微服务器,所有的消息在 Event 线
程获取出来以后就会投递给 Desktop 线程,然后再分发到目的应用程序主窗口上面, 500)this.width=500;" border=0> 对于运行在进程版的 MiniGUI 来说,应用程序的消息传递则通过套接字来进行,相应的处理模型
如图 4.4 所示。 500)this.width=500;" border=0> 4. 消息和消息循环 在任何 GUI 系统中,均有事件或消息驱动的概念。在MiniGUI中,我们使用消息驱动作为应用程序的创建构架。 在消息驱动的应用程序中,计算机外设发生的事件,例如键盘键的敲击、鼠标键的按击等,都由支持系统收集,将其以事先的约定格式翻译为特定的消息。应用程序一般包含有自己的消息队列,系统将消息发送到应用程序的消息队列中。应用程序可以建立一个循环,在这个循环中读取消息并处理消息,直到特定的消息传来为止。这样的循环称为消息循环。一般地,消息由代表消息的一个整型数和消息的附加参数组成。应用程序一般要提供一个处理消息的标准函数。在消息循环中,系统可以调用此函数,应用程序在此函数中处理相应的消息。 图 2 是一个消息驱动的应用程序的简单构架示意。 500)this.width=500;" border=0> MiniGUI 支持如下几种消息的传递机制。这些机制为多线程环境下的窗口间通讯提供了基本途径:
- 通过 PostMessage 发送。消息发送到消息队列后立即返回。这种发送方式称为“邮寄”消息。如果消息队列中的邮寄消息缓冲区已满,则该函数返回错误值。
- 通过 PostSyncMessage 发送。该函数用来向不同于调用该函数的线程消息队列邮寄消息,并且只有该消息被处理之后,该函数才能返回,因此这种消息称为“同步消息”。
- 通过 SendMessage 发送。该函数可以向任意一个窗口发送消息,消息处理完成之后,该函数返回。如果目标窗口所在线程和调用线程是同一个线程,该函数直接调用窗口过程,如果处于不同的线程,则利用 PostSyncMessage 函数发送同步消息。
- 通过 SendNotifyMessage 发送。该函数向指定的窗口发送通知消息,将消息放入消息队列后立即返回。由于这种消息和邮寄消息不同,是不允许丢失的,因此,系统以链表的形式处理这种消息。
- 通过 SendAsyncMessage 发送。利用该函数发送的消息称为“异步消息”,系统直接调用目标窗口的窗口过程。
相关阅读 更多 +