自 MiniGUI 从 1998 年底推出以来,越来越多的人开始选择 MiniGUI 在 Linux 上开发实时嵌入式系统。为了帮助嵌入式软件开发人员使用 MiniGUI编写出更好的应用程序,我们将撰写一系列文章讲解基于 Linux 和 MiniGUI 的嵌入式系统软件开发,并冠名 基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南。本文是该系列文章的第一篇,将讲述如何针对具体项目选择使用 MiniGUI-Threads 或者 MiniGUI-Lite 版本,并比较不同版本对系统软件结构的影响。

引言

自 MiniGUI 从 1998 年底推出以来,越来越多的人开始选择 MiniGUI 在 Linux 上开发实时嵌入式系统。MiniGUI 系统也逐渐成熟,并在各种嵌入式系统中扮演了重要的角色。为了帮助嵌入式软件开发人员使用 MiniGUI编写出更好的应用程序,我们将撰写一系列文章讲解基于 Linux 和 MiniGUI 的嵌入式系统软件开发,并冠名"基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南"。该系列文章将讲述如何在基于 Linux 的系统上利用 MiniGUI 开发具有图形用户界面支持的嵌入式系统软件,其内容不仅仅限于 MiniGUI 的编程,还会涉及到一些 Linux 下嵌入式系统软件开发的技巧。系列文章的初步规划如下:

  • 如何针对特定项目选择 MiniGUI-Threads 和 MiniGUI-Lite
  • 理解消息循环和窗口过程
  • 对话框和控件编程
  • 使用 GDI 函数
  • MiniGUI 和 Linux 系统调用
  • MiniGUI-Lite 与进程间通讯
  • 将 MiniGUI 及应用程序移植到特定平台
  • 利用 autoconf 接口编写跨平台代码
  • 如何调试 MiniGUI 应用程序

本文是该系列文章的第一篇,将讲述如何针对具体项目选择使用 MiniGUI-Threads 或者 MiniGUI-Lite 版本,并比较不同版本对系统软件结构的影响。


回页首

MiniGUI-Threads 和 MiniGUI-Lite 的区别

大家都知道,我们可以将 MiniGUI 编译成两个截然不同的版本,一个是 MiniGUI-Threads,一个是 MiniGUI-Lite。这两个版本适用于不同的应用需求。在选择到底使用 MiniGUI-Threads 还是 MiniGUI-Lite 之前,我们首先需要了解这两个版本之间的区别。

MiniGUI-Threads 是 MiniGUI 的最初版本。MiniGUI 最初为一个工业控制系统开发的,该系统功能单一,但却需要非常高的实时性,因此考虑将 MiniGUI 开发成一个基于多线程的图形用户界面支持系统。因为在传统的 UNIX/Linux 系统上,典型的 GUI 系统(比如 X)采用传统的基于 UNIX 套接字的客户/服务器系统结构。在这种体系结构下,客户建立窗口、绘制等等都要通过套接字传递到服务器,由服务器完成实质工作。这样,系统非常依赖于 UNIX 套接字通讯。而大家都知道,UNIX 套接字的数据传递,要经过内核,然后再传递到另外一个程序。这样,大量的数据在客户/内核/服务器之间传递,从而增加了系统负荷,也占用了许多系统资源。这对许多嵌入式系统,尤其是实时性要求非常高的系统来说,是不可接受的。

为了解决这个问题,MiniGUI 首先采用了线程机制(类似Windows CE),所有的应用程序都运行在同一个地址空间,这样,大大提高了程序之间的通讯效率,并且特别适合于实时性要求非常高的系统。这就是 MiniGUI-Threads。基于 MiniGUI-Threads 的程序,可以具有多个线程,每个线程有不同的功能和任务,并且可以建立各自的窗口,不同的线程之间,可以通过 MiniGUI 提供的消息传递机制进行事件传送和同步。

但显然,这种基于线程的结构也导致了系统整体的脆弱?D?D如果某个线程因为非法的数据访问而终止运行,则整个进程都将受到影响。不过,这种体系结构对实时控制系统等时间关键的系统来讲,还是非常适合的。

为了解决 MiniGUI-Threads 版本因为线程而引入的一些问题,同时也为了让 MiniGUI更加适合于嵌入式系统,我们决定开发一个 MiniGUI-Lite 版本。这个版本的开发目的是:

  • 保持与原先 MiniGUI 版本在源代码级 99% 以上的兼容。
  • 不再使用线程库。
  • 可以同时运行多个基于 MiniGUI-Lite 的应用程序,即多个进程,并且提供前后台进程的切换。

显然,要同时满足上述三个目的,如果采用传统的 C/S 结构对MiniGUI-Threads 进行改造,应该不难实现。但前面提到的传统 C/S 结构的缺陷却无法避免。经过对 PDA 等嵌入式系统的分析,我们发现,某些 PDA 产品具有运行多个任务的能力,但同一时刻在屏幕上进行绘制的程序,一般不会超过两个。因此,只要确保将这两个进程的绘制相互隔离,就不需要采用复杂的 C/S 结构处理多个进程窗口之间的互相剪切。也就是说,在这种产品中,如果采用基于传统 C/S 结构的多窗口系统,实际是一种浪费。

有了上述认识,我们对 MiniGUI-Threads 进行了如下简化设计:

  • 每个进程维护自己的主窗口 Z 序,同一进程创建的主窗口之间互相剪切。也就是说,除这个进程只有一个线程,只有一个消息循环之外,它与原有的 MiniGUI 版本之间没有任何区别。每个进程在进行屏幕绘制时,不需要考虑其他进程。
  • 建立一个简单的客户/服务器体系,但确保最小化进程间的数据复制功能。因此,在服务器和客户之间传递的数据仅限于输入设备的输入数据,以及客户和服务器之间的某些请求和响应数据。
  • 有一个服务器进程(mginit),它负责初始化一些输入设备,并且通过 UNIX Domain 套接字将输入设备的消息发送到前台的 MiniGUI-Lite 客户进程。
  • 服务器和客户被分别限定在屏幕的某两个不相交矩形内进行绘制,同一时刻,只能有一个客户及服务器进行屏幕绘制。其他客户可继续运行,但屏幕输入被屏蔽。服务器可以利用 API 接口将某个客户切换到前台。同时,服务器和客户之间采用信号和 System V 信号量进行同步。
  • 服务器还采用 System V IPC 机制提供一些资源的共享,包括位图、图标、鼠标、字体等等,以便减少实际内存的消耗。

从传统 C/S 窗口系统的角度看,MiniGUI-Lite 的这种设计,无法处理达到完整的多窗口支持,这的确是一个结构设计上的不足和缺陷。不过,这实际是 MiniGUI-Lite 不同于其他窗口系统的一个特征。因为处理每个进程之间的互相剪切问题,将导致客户和服务器之间的通讯量大大增加,但实际上在许多嵌入式系统当中这种处理是没有必要的。在类似 PDA 的嵌入式系统中,往往各个程序启动后,就独占屏幕进行绘制输出,其他程序根本就没有必要知道它现在的窗口被别的进程剪切了,因为它根本就没有机会输出到屏幕上。所以,在 MiniGUI-Lite 当中,当一个进程成为最顶层程序时,服务器会保证其输出正常,而当有新的程序成为最顶层程序时,服务器也会保证其他程序不能输出到屏幕上。但这些进程依然在正常执行着,不过,服务器只向最顶层的程序发送外部事件消息。

表 1 给出了 MiniGUI-Threads 和 MiniGUI-Lite 的区别。从表中总结的区别看来,MiniGUI-Threads 适合于功能单一、实时性要求很高的系统,比如工业控制系统;而 MiniGUI-Lite 适合于功能丰富、结构复杂、显示屏幕较小的系统,比如 PDA 等信息产品。

表 1 MiniGUI-Threads 和 MiniGUI-Lite 的区别

MiniGUI-Threads MiniGUI-Lite
多窗口支持 完全 不能处理进程间窗口的剪切,但提供进程内多窗口的完全支持
字体支持 支持点阵字体(VBF、RBF)和矢量字体(Adobe Type1 和 TrueType) 目前尚不支持对 Adobe Type1 和 TrueType 等矢量字体的支持
线程间消息传递 通过 MiniGUI 的消息函数,可在不同的线程之间传递消息 未考虑多线程应用,不能直接通过 MiniGUI 消息函数在不同线程之间传递消息
多线程窗口 MiniGUI 能够处理不同线程之间的窗口层叠 不能处理多线程之间的窗口层叠
其他 基于线程的 C/S 结构,系统健壮性较差,因此要求系统经过严格测试 采用 UNIX Domain Socket 的基于进程的 C/S 结构,可建立健壮的软件架构。并提供了方便的高层 IPC 机制

除上表中列出的不同之外,MiniGUI-Threads 和 MiniGUI-Lite 的 API 是一致的。


回页首

MiniGUI-Threads 的典型应用和软件架构

本文介绍的基于 MiniGUI-Threads 典型应用是一个计算机数字控制(CNC)系统。这个系统是由清华大学基于 RT-Linux 建立的机床控制系统。该系统使用 MiniGUI-Threads 作为图形用户界面支持系统。图 1 是该 CNC 系统的用户界面。

图 1 清华大学基于 RT-Linux 和 MiniGUI 的数控系统主界面
清华大学基于 RT-Linux 和 MiniGUI 的数控系统主界面

图 2 是该系统的架构。在用户层,该系统有三个线程,一个作为 GUI 主线程存在,另一个作为监视线程监视系统的工作状态,并在该线程建立的窗口上输出状态信息,第三个线程是工作线程,该线程执行加工指令,并通过 RT-Linux 的实时 FIFO 和系统的实时模块进行通讯。

图 2 清华大学基于 RT-Linux 和 MiniGUI 的数控系统架构
清华大学基于 RT-Linux 和 MiniGUI 的数控系统架构


回页首

MiniGUI-Lite 的典型应用和软件架构

这里介绍的典型应用是一个基于 MiniGUI-Lite 的 PDA。该 PDA 由国内某公司基于 Linux 开发,其上可以运行各种 PIM 程序、浏览器以及各种游戏程序。图 3 是该 PDA 的用户界面。

图 3 某公司开发的基于 MiniGUI 的 PDA 软件界面
某公司开发的基于 MiniGUI 的 PDA 软件界面

该系统中的所有应用程序都以 Linux 进程的形式执行,mginit(即 MiniGUI-Lite)提供了输入法支持和应用程序管理功能。当应用程序之间需要通讯时,可以通过 MiniGUI-Lite 所提供的 request/response 接口实现。图 4 是该系统的架构。

图 4 某公司开发的基于 MiniGUI 的 PDA 软件架构
某公司开发的基于 MiniGUI 的 PDA 软件架构


回页首

小结

本文讲解了 MiniGUI-Threads 和 MiniGUI-Lite 之间的区别,并举例说明了基于这两个不同版本的不同软件架构。嵌入式程序开发人员必须明白这两个版本之间的区别,并针对具体应用恰当选择使用哪个版本。

基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(一)(转)相关推荐

  1. 基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南题八——MiniGUI 和其他嵌入式 Linux 上的图形及图形用户界面系统

    简介: 为了让读者对嵌入式 Linux 当中能够使用的图形及图形用户界面有个较为全面的认识,本文将为读者介绍一些嵌入式 Linux 系统中常见的图形及图形用户界面系统,并作为<基于 Linux ...

  2. 基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南

    内容: 1 Linux 图形领域的基础设施 2 Linux 图形领域的高级函数库 3 面向嵌入式Linux 系统的图形用户界面 4 小结 关于作者 相关内容: 主题一:选择MiniGUI-Thread ...

  3. 基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(八)

    基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(八) MiniGUI 和其他嵌入式 Linux 上的图形及图形用户界面系统 魏永明 (ymwei@minigui.org) 自由撰稿人 ...

  4. 10001.基于Linux和MiniGUI的嵌入式系统软件开发指南(转载)

    1 Linux 图形领域的基础设施 2 Linux 图形领域的高级函数库 3 面向嵌入式Linux 系统的图形用户界面 4 小结 关于作者 相关内容: 主题一:选择MiniGUI-Threads 或者 ...

  5. 基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(六) MiniGUI 提供的非 GUI/GDI 接口...

    1 引言 一般而言,GUI 系统的应用程序编程接口主要集中于窗口.消息队列.图形设备等相关方面.但因为 GUI 系统在处理系统事件时通常会提供自己的机制,而这些机制往往会和操作系统本身提供的机制不相兼 ...

  6. 基于Linux和MiniGUI的嵌入式系统软件开发指南(五)

    MiniGUI 1.1.0 版本引入的新 GDI 功能和函数 本文向读者展现了 MiniGUI 的最新开发成果,即在 MiniGUI 1.1.0Pre4 版本中引入的新的 GAL 和新的 GDI 功能 ...

  7. 基于Linux和MiniGUI的嵌入式系统软件开发指南(六)

    本文讲述了 MiniGUI 为应用程序提供的非 GUI/GDI 接口,这些接口能够帮助应用程序更好地和操作系统交互,扩展应用程序功能,并提高应用程序的可移植性.内容主要涉及到如下几个方面:MiniGU ...

  8. 基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(三)

    1 引言 对话框编程是一个快速构建用户界面的技术.通常,我们编写简单的图形用户界面时,可以通过调用 CreateWindow 函数直接创建所有需要的子窗口,即控件.但在图形用户界面比较复杂的情况下,每 ...

  9. 基于Linux和MiniGUI的嵌入式系统软件开发指南(七)

    1 引言 我们在本系列主题五中曾经详细描述了在 MiniGUI 1.1.0 版本开发过程中添加的新 GDI 功能和函数.这些接口首次出现在版本 1.1.0Pre4 当中.目前 MiniGUI 1.1. ...

最新文章

  1. Map集合练习之对字符串中字母出现的次数求和
  2. 一步步学习 Spring Data 系列之JPA(一)
  3. hyperopt中文文档:Recipes
  4. 01-移动端开发教程-CSS3新特性(上)
  5. 去 BAT 面试,总结了这 55 道 MySQL 面试题
  6. HDU - 1796——容斥原理+二进制枚举
  7. eclipse左边工程列表不见了,怎么调出来
  8. 数据仓库模型(星型模型和雪花模型 )
  9. Google搜索从入门到精通 v4.0
  10. BURP安装Turbo Intruder插件报错问题
  11. 横向对比EXT4,带你感受真实的Linux文件系统F2FS
  12. Excel对比两个Sheet数据的异同
  13. 毕业论文外文文献在哪里找?
  14. 回归预测 | MATLAB实现SSA-LSTM和LSTM多输入单输出
  15. 贪吃的九头龙-----树形dp
  16. vertica数据库监控
  17. 财务管理系统属于计算机应用领域中的,计算机基础套题及其答案.doc
  18. 文件操作安全之-文件解析原理篇
  19. 【致远FAQ】Guest 账号同时多人登陆导致OA卡顿
  20. ubuntu 7.04 硬盘安装与安装后的常用软件的安装与配置 [zz]

热门文章

  1. 计算机应用操作题word,计算机应用基础网考模拟练习题Word部分操作题
  2. CSDN创作的markdown语法
  3. 面对人口塌方式下降,必须把房子转移到省会以上级别城市的理由
  4. 文本分类项目GPU版本代码
  5. 实例浅析javascript call by value与call by reference
  6. 浅析Microsoft .net PetShop程序中的购物车和订单处理模块(Profile技术,异步MSMQ消息)
  7. 又走一人 苹果自动驾驶系统工程项目经理已离职
  8. 游族网络回应被新浪财团收购:有相关计划 但对方身份尚不知情
  9. 年轻人开始“反算法”
  10. 疑似iPhone 13 mini原型机曝光:后置相机模组排布方式变化