📄 复件 基于 linux 和 minigui 的嵌入式系统软件开发指南(一).htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0053)http://www.pocketix.com/documents/tech/2001070301.htm -->
<HTML><HEAD><TITLE>基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(一)</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META http-equiv=Content-Language content=en-us>
<META content="MSHTML 6.00.2719.2200" name=GENERATOR>
<META content=FrontPage.Editor.Document name=ProgId><!--使鼠标指向链接显示红色和加上下划线-->
<STYLE type=text/css>TD {
FONT-SIZE: 10pt; LINE-HEIGHT: 19px; FONT-FAMILY: 宋体
}
P {
FONT-SIZE: 10pt; FONT-FAMILY: 宋体
}
A:visited {
FONT-SIZE: 10pt; FONT-FAMILY: 宋体; TEXT-DECORATION: none
}
A:link {
FONT-SIZE: 10pt; FONT-FAMILY: 宋体; TEXT-DECORATION: none
}
A:hover {
FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: "宋体"; TEXT-DECORATION: underline
}
</STYLE>
</HEAD>
<BODY leftMargin=6 topMargin=5>
<DIV align=center>
<CENTER>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=0 width=690
borderColorLight=#000000 border=0>
<TBODY>
<TR>
<TD vAlign=top align=left><IMG height=60 alt=logo
src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(一).files/pocketix_com_logo.gif"
width=220 border=0></TD>
<TD vAlign=center align=middle width=468>
<SCRIPT language=JavaScript
src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(一).files/demo_1_banner.js"></SCRIPT>
</TD></TR></TBODY></TABLE></CENTER></DIV>
<DIV align=center>
<CENTER>
<TABLE height=15 cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD width="100%" background=""
height=15></TD></TR></TBODY></TABLE></CENTER></DIV>
<DIV align=left>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR height=20>
<TD width="100%"></TD></TR></TBODY></TABLE></DIV>
<DIV align=center>
<CENTER>
<TABLE cellSpacing=0 cellPadding=0 width="90%" border=0>
<TBODY>
<TR>
<TD vAlign=top width="100%">
<DIV align=center>
<TABLE cellSpacing=0 cellPadding=0 width="90%" border=0>
<TBODY>
<TR>
<TD align=middle width="100%"><FONT size=3>基于 Linux 和 MiniGUI
的嵌入式系统软件开发指南(一)<BR></FONT><FONT color=#999999>2001-07-03 嵌入式Linux
报道</FONT></TD></TR>
<TR>
<TD vAlign=top align=middle width="100%">
<HR SIZE=1>
</TD></TR></TBODY></TABLE></DIV>
<DIV align=center>
<TABLE cellSpacing=0 cellPadding=0 width="90%" border=0>
<TBODY>
<TR>
<TD width="100%"> <I>自 MiniGUI 从 1998
年底推出以来,越来越多的人开始选择 MiniGUI 在 Linux 上开发实时嵌入式系统。为了帮助嵌入式软件开发人员使用
MiniGUI编写出更好的应用程序,我们将撰写一系列文章讲解基于 Linux 和 MiniGUI 的嵌入式系统软件开发,并冠名"基于
Linux 和 MiniGUI 的嵌入式系统软件开发指南"。本文是该系列文章的第一篇,将讲述如何针对具体项目选择使用
MiniGUI-Threads 或者 MiniGUI-Lite 版本,并比较不同版本对系统软件结构的影响。</I>
<P> <B>1:引言 </B></P>
<P> 自 MiniGUI 从 1998 年底推出以来,越来越多的人开始选择 MiniGUI 在
Linux 上开发实时嵌入式系统。MiniGUI 系统也逐渐成熟,并在各种嵌入式系统中扮演了重要的角色。为了帮助嵌入式软件开发人员使用
MiniGUI编写出更好的应用程序,我们将撰写一系列文章讲解基于 Linux 和 MiniGUI 的嵌入式系统软件开发,并冠名"基于
Linux 和 MiniGUI 的嵌入式系统软件开发指南"。该系列文章将讲述如何在基于 Linux 的系统上利用 MiniGUI
开发具有图形用户界面支持的嵌入式系统软件,其内容不仅仅限于 MiniGUI 的编程,还会涉及到一些 Linux
下嵌入式系统软件开发的技巧。系列文章的初步规划如下: </P>
<MENU>
<LI>如何针对特定项目选择 MiniGUI-Threads 和 MiniGUI-Lite
<LI>理解消息循环和窗口过程
<LI>对话框和控件编程
<LI>使用 GDI 函数
<LI>MiniGUI 和 Linux 系统调用
<LI>MiniGUI-Lite 与进程间通讯
<LI>将 MiniGUI 及应用程序移植到特定平台
<LI>利用 autoconf 接口编写跨平台代码
<LI>如何调试 MiniGUI 应用程序 </LI></MENU>
<P> 本文是该系列文章的第一篇,将讲述如何针对具体项目选择使用 MiniGUI-Threads
或者 MiniGUI-Lite 版本,并比较不同版本对系统软件结构的影响。</P>
<P> <B>2:MiniGUI-Threads 和 MiniGUI-Lite
的区别</B></P>
<P> 大家都知道,我们可以将 MiniGUI 编译成两个截然不同的版本,一个是
MiniGUI-Threads,一个是 MiniGUI-Lite。这两个版本适用于不同的应用需求。在选择到底使用
MiniGUI-Threads 还是 MiniGUI-Lite
之前,我们首先需要了解这两个版本之间的区别。<BR><BR> MiniGUI-Threads 是
MiniGUI 的最初版本。MiniGUI 最初为一个工业控制系统开发的,该系统功能单一,但却需要非常高的实时性,因此考虑将
MiniGUI 开发成一个基于多线程的图形用户界面支持系统。因为在传统的 UNIX/Linux 系统上,典型的 GUI 系统(比如
X)采用传统的基于 UNIX
套接字的客户/服务器系统结构。在这种体系结构下,客户建立窗口、绘制等等都要通过套接字传递到服务器,由服务器完成实质工作。这样,系统非常依赖于
UNIX 套接字通讯。而大家都知道,UNIX
套接字的数据传递,要经过内核,然后再传递到另外一个程序。这样,大量的数据在客户/内核/服务器之间传递,从而增加了系统负荷,也占用了许多系统资源。这对许多嵌入式系统,尤其是实时性要求非常高的系统来说,是不可接受的。<BR><BR>
为了解决这个问题,MiniGUI 首先采用了线程机制(类似Windows
CE),所有的应用程序都运行在同一个地址空间,这样,大大提高了程序之间的通讯效率,并且特别适合于实时性要求非常高的系统。这就是
MiniGUI-Threads。基于 MiniGUI-Threads
的程序,可以具有多个线程,每个线程有不同的功能和任务,并且可以建立各自的窗口,不同的线程之间,可以通过 MiniGUI
提供的消息传递机制进行事件传送和同步。<BR><BR>
但显然,这种基于线程的结构也导致了系统整体的脆弱――如果某个线程因为非法的数据访问而终止运行,则整个进程都将受到影响。不过,这种体系结构对实时控制系统等时间关键的系统来讲,还是非常适合的。<BR><BR>
为了解决 MiniGUI-Threads 版本因为线程而引入的一些问题,同时也为了让
MiniGUI更加适合于嵌入式系统,我们决定开发一个 MiniGUI-Lite 版本。这个版本的开发目的是: </P>
<MENU>
<LI>保持与原先 MiniGUI 版本在源代码级 99% 以上的兼容。
<LI>不再使用线程库。
<LI>可以同时运行多个基于 MiniGUI-Lite 的应用程序,即多个进程,并且提供前后台进程的切换。 </LI></MENU>
<P> 显然,要同时满足上述三个目的,如果采用传统的 C/S 结构对MiniGUI-Threads
进行改造,应该不难实现。但前面提到的传统 C/S 结构的缺陷却无法避免。经过对 PDA 等嵌入式系统的分析,我们发现,某些 PDA
产品具有运行多个任务的能力,但同一时刻在屏幕上进行绘制的程序,一般不会超过两个。因此,只要确保将这两个进程的绘制相互隔离,就不需要采用复杂的
C/S 结构处理多个进程窗口之间的互相剪切。也就是说,在这种产品中,如果采用基于传统 C/S
结构的多窗口系统,实际是一种浪费。<BR><BR> 有了上述认识,我们对
MiniGUI-Threads 进行了如下简化设计:</P>
<MENU>
<LI>每个进程维护自己的主窗口 Z
序,同一进程创建的主窗口之间互相剪切。也就是说,除这个进程只有一个线程,只有一个消息循环之外,它与原有的 MiniGUI
版本之间没有任何区别。每个进程在进行屏幕绘制时,不需要考虑其他进程。
<LI>建立一个简单的客户/服务器体系,但确保最小化进程间的数据复制功能。因此,在服务器和客户之间传递的数据仅限于输入设备的输入数据,以及客户和服务器之间的某些请求和响应数据。
<LI>有一个服务器进程(mginit),它负责初始化一些输入设备,并且通过 UNIX Domain
套接字将输入设备的消息发送到前台的 MiniGUI-Lite 客户进程。
<LI>服务器和客户被分别限定在屏幕的某两个不相交矩形内进行绘制,同一时刻,只能有一个客户及服务器进行屏幕绘制。其他客户可继续运行,但屏幕输入被屏蔽。服务器可以利用
API 接口将某个客户切换到前台。同时,服务器和客户之间采用信号和 System V 信号量进行同步。
<LI>服务器还采用 System V IPC 机制提供一些资源的共享,包括位图、图标、鼠标、字体等等,以便减少实际内存的消耗。
</LI></MENU>
<P> 从传统 C/S 窗口系统的角度看,MiniGUI-Lite
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -