📄 基于 linux 和 minigui 的嵌入式系统软件开发指南(一).htm
字号:
</A></B></TD>
<TD align=right width=136><A
href="http://www-900.ibm.com/developerWorks/cn/index.shtml"><IMG
height=24 alt="developerWorks 中国网站"
src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(一).files/dwlogo-small.gif"
width=136 border=0></A></TD>
<TD width=5><IMG height=1 alt=""
src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(一).files/c.gif" width=5
border=0></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><!-- End Breadcrumb Trail --><!-- Title Area -->
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR vAlign=top>
<TD colSpan=5><IMG height=15 alt=""
src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(一).files/c.gif" width=5
border=0></TD></TR>
<TR vAlign=top><!-- Title -->
<TD width=2><IMG height=1 alt=""
src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(一).files/c.gif" width=2 border=0></TD>
<TD><!-- <span class="astitle">[Series title]:</span> --><SPAN
class=atitle>基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(一)</SPAN></TD>
<TD width=8><IMG height=1 alt=""
src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(一).files/c.gif" width=8 border=0></TD>
<TD></TD>
<TD width=6><IMG height=1 alt=""
src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(一).files/c.gif" width=6
border=0></TD></TR><!-- Black line separator -->
<TR vAlign=top>
<TD bgColor=#000000 colSpan=5><IMG height=1 alt=""
src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(一).files/c.gif" width=100
border=0></TD></TR>
<TR vAlign=top>
<TD bgColor=#ffffff colSpan=5><IMG height=8 alt=""
src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(一).files/c.gif" width=100
border=0></TD></TR></TBODY></TABLE><!-- END HEADER AREA and START BODY AREA -->
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR vAlign=top><!-- LEFT GUTTER -->
<TD width=5><IMG height=1 alt=""
src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(一).files/c.gif" width=5 border=0></TD><!-- START CENTER COLUMN -->
<TD width="100%">
<TABLE cellSpacing=0 cellPadding=0 width=168 align=right border=0>
<TBODY>
<TR><!-- Sidebar Gutter -->
<TD width=8><IMG height=21 alt=""
src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(一).files/c.gif" width=5></TD>
<TD width=160><!-- Start TOC -->
<TABLE cellSpacing=0 cellPadding=0 width=160 border=0>
<TBODY>
<TR>
<TD width=160 bgColor=#000000 height=1><IMG height=1 alt=""
src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(一).files/c.gif"
width=160></TD></TR>
<TR>
<TD align=middle
background="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(一).files/bg-gold.gif"
height=5><B>内容:</B></TD></TR>
<TR>
<TD width=160 bgColor=#666666 height=1><IMG height=1 alt=""
src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(一).files/c.gif"
width=160></TD></TR>
<TR>
<TD align=right>
<TABLE cellSpacing=0 cellPadding=3 width="98%" border=0>
<TBODY>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part1/index.shtml#1">引言</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part1/index.shtml#2">MiniGUI-Threads
和 MiniGUI-Lite 的区别</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part1/index.shtml#3">MiniGUI-Threads
的典型应用和软件架构</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part1/index.shtml#4">MiniGUI-Lite
的典型应用和软件架构</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part1/index.shtml#5">小结</A></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><!-- End TOC -->
<TABLE cellSpacing=0 cellPadding=0 width=160 border=0>
<TBODY>
<TR>
<TD width=150 bgColor=#000000 colSpan=2 height=2><IMG height=2
alt="" src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(一).files/c.gif"
width=160></TD></TR>
<TR>
<TD width=150 bgColor=#ffffff colSpan=2 height=2><IMG height=2
alt="" src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(一).files/c.gif"
width=160></TD></TR></TBODY></TABLE><!-- END STANDARD SIDEBAR AREA --></TD></TR></TBODY></TABLE><!-- START SUBTITLE AND CONTENT --><SPAN
class=atitle2>选择MiniGUI-Threads 或者 MiniGUI-Lite</SPAN>
<P><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part1/index.shtml#author1">魏永明</A>
(<A
href="mailto:ymwei@minigui.org">ymwei@minigui.org</A>)<BR>自由撰稿人<BR>2001 年
6 月</P>
<BLOCKQUOTE>自 MiniGUI 从 1998 年底推出以来,越来越多的人开始选择 MiniGUI 在 Linux
上开发实时嵌入式系统。为了帮助嵌入式软件开发人员使用 MiniGUI编写出更好的应用程序,我们将撰写一系列文章讲解基于 Linux 和
MiniGUI 的嵌入式系统软件开发,并冠名"基于 Linux 和 MiniGUI
的嵌入式系统软件开发指南"。本文是该系列文章的第一篇,将讲述如何针对具体项目选择使用 MiniGUI-Threads 或者
MiniGUI-Lite 版本,并比较不同版本对系统软件结构的影响。</BLOCKQUOTE>
<P><A id=1 name=1><SPAN class=atitle2>1:引言</SPAN></A><BR>自 MiniGUI 从 1998
年底推出以来,越来越多的人开始选择 MiniGUI 在 Linux 上开发实时嵌入式系统。MiniGUI
系统也逐渐成熟,并在各种嵌入式系统中扮演了重要的角色。为了帮助嵌入式软件开发人员使用
MiniGUI编写出更好的应用程序,我们将撰写一系列文章讲解基于 Linux 和 MiniGUI 的嵌入式系统软件开发,并冠名"基于 Linux 和
MiniGUI 的嵌入式系统软件开发指南"。该系列文章将讲述如何在基于 Linux 的系统上利用 MiniGUI
开发具有图形用户界面支持的嵌入式系统软件,其内容不仅仅限于 MiniGUI 的编程,还会涉及到一些 Linux
下嵌入式系统软件开发的技巧。系列文章的初步规划如下:</P>
<UL>
<LI>如何针对特定项目选择 MiniGUI-Threads 和 MiniGUI-Lite
<LI>理解消息循环和窗口过程
<LI>对话框和控件编程
<LI>使用 GDI 函数
<LI>MiniGUI 和 Linux 系统调用
<LI>MiniGUI-Lite 与进程间通讯
<LI>将 MiniGUI 及应用程序移植到特定平台
<LI>利用 autoconf 接口编写跨平台代码
<LI>如何调试 MiniGUI 应用程序 </LI></UL>本文是该系列文章的第一篇,将讲述如何针对具体项目选择使用
MiniGUI-Threads 或者 MiniGUI-Lite 版本,并比较不同版本对系统软件结构的影响。<BR><BR>
<P><A id=2 name=2><SPAN class=atitle2>2:MiniGUI-Threads 和 MiniGUI-Lite
的区别</SPAN></A><BR>大家都知道,我们可以将 MiniGUI 编译成两个截然不同的版本,一个是 MiniGUI-Threads,一个是
MiniGUI-Lite。这两个版本适用于不同的应用需求。在选择到底使用 MiniGUI-Threads 还是 MiniGUI-Lite
之前,我们首先需要了解这两个版本之间的区别。</P>
<P>MiniGUI-Threads 是 MiniGUI 的最初版本。MiniGUI
最初为一个工业控制系统开发的,该系统功能单一,但却需要非常高的实时性,因此考虑将 MiniGUI
开发成一个基于多线程的图形用户界面支持系统。因为在传统的 UNIX/Linux 系统上,典型的 GUI 系统(比如 X)采用传统的基于 UNIX
套接字的客户/服务器系统结构。在这种体系结构下,客户建立窗口、绘制等等都要通过套接字传递到服务器,由服务器完成实质工作。这样,系统非常依赖于
UNIX 套接字通讯。而大家都知道,UNIX
套接字的数据传递,要经过内核,然后再传递到另外一个程序。这样,大量的数据在客户/内核/服务器之间传递,从而增加了系统负荷,也占用了许多系统资源。这对许多嵌入式系统,尤其是实时性要求非常高的系统来说,是不可接受的。</P>
<P>为了解决这个问题,MiniGUI 首先采用了线程机制(类似Windows
CE),所有的应用程序都运行在同一个地址空间,这样,大大提高了程序之间的通讯效率,并且特别适合于实时性要求非常高的系统。这就是
MiniGUI-Threads。基于 MiniGUI-Threads
的程序,可以具有多个线程,每个线程有不同的功能和任务,并且可以建立各自的窗口,不同的线程之间,可以通过 MiniGUI
提供的消息传递机制进行事件传送和同步。</P>
<P>但显然,这种基于线程的结构也导致了系统整体的脆弱――如果某个线程因为非法的数据访问而终止运行,则整个进程都将受到影响。不过,这种体系结构对实时控制系统等时间关键的系统来讲,还是非常适合的。</P>
<P>为了解决 MiniGUI-Threads 版本因为线程而引入的一些问题,同时也为了让 MiniGUI更加适合于嵌入式系统,我们决定开发一个
MiniGUI-Lite 版本。这个版本的开发目的是:</P>
<UL>
<LI>保持与原先 MiniGUI 版本在源代码级 99% 以上的兼容。
<LI>不再使用线程库。
<LI>可以同时运行多个基于 MiniGUI-Lite 的应用程序,即多个进程,并且提供前后台进程的切换。 </LI></UL><BR><BR>
<P>显然,要同时满足上述三个目的,如果采用传统的 C/S 结构对MiniGUI-Threads 进行改造,应该不难实现。但前面提到的传统 C/S
结构的缺陷却无法避免。经过对 PDA 等嵌入式系统的分析,我们发现,某些 PDA
产品具有运行多个任务的能力,但同一时刻在屏幕上进行绘制的程序,一般不会超过两个。因此,只要确保将这两个进程的绘制相互隔离,就不需要采用复杂的 C/S
结构处理多个进程窗口之间的互相剪切。也就是说,在这种产品中,如果采用基于传统 C/S 结构的多窗口系统,实际是一种浪费。</P>
<P>有了上述认识,我们对 MiniGUI-Threads 进行了如下简化设计:</P>
<UL>
<LI>每个进程维护自己的主窗口 Z 序,同一进程创建的主窗口之间互相剪切。也就是说,除这个进程只有一个线程,只有一个消息循环之外,它与原有的
MiniGUI 版本之间没有任何区别。每个进程在进行屏幕绘制时,不需要考虑其他进程。
<LI>建立一个简单的客户/服务器体系,但确保最小化进程间的数据复制功能。因此,在服务器和客户之间传递的数据仅限于输入设备的输入数据,以及客户和服务器之间的某些请求和响应数据。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -