📄 1.htm
字号:
}</SCRIPT>
<TABLE cellSpacing=0 cellPadding=0 width=760 align=center border=0>
<TBODY>
<TR>
<TD width="100%">
<TABLE cellSpacing=0 cellPadding=0 width="98%" align=center
border=0>
<TBODY>
<TR>
<TD align=middle width="5%" height=25><IMG
src="嵌入式系统的图形用户界面设计研究 无忧电子开发网-技术文章.files/R_url.jpg"></TD>
<TD width="95%">所在的位置:<A
href="http://www.51kaifa.com/">首页</A></A> → <A
href="http://www.51kaifa.com/jswz">技术文章</A></A> → <A
href="http://www.51kaifa.com/html/jswz/list2/list-2.htm">嵌入式系统</A>
→ <FONT color=#ff9900>正文</FONT> </TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width=760 align=center
border=0><TBODY>
<TR>
<TD width="100%" bgColor=#808080 colSpan=3 height=1></TD></TR>
<TR>
<TD vAlign=top width="100%">
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD align=left width="100%">
<SCRIPT
src="嵌入式系统的图形用户界面设计研究 无忧电子开发网-技术文章.files/ad-jswz_8.js"></SCRIPT>
<!-- <script type="text/javascript" src="/ad/ad.php?ListName=jswz&Place=8&Way=h&Num=5"></script> --></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="94%" align=center
border=0>
<TBODY>
<TR>
<TD align=middle width="100%"><FONT
color=#05006c><B>嵌入式系统的图形用户界面设计研究</B></FONT></TD></TR>
<TR>
<TD width="100%" height=6></TD></TR>
<TR>
<TD align=middle width="100%" height=18>
<TABLE style="BORDER-TOP: #666666 1px solid" height=22
cellSpacing=1 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD align=middle width="100%"
bgColor=#dce9fc>发布日期:2005-10-02 <!-- 浏览数:<font color=#A20010><SCRIPT language=Javascript src="/read_view.php?ID=2552&nTable=jswz"></SCRIPT></font> -->作者:别碧勇
彭为国 来源:计算机与信息技术 </TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD width="100%" height=6></TD></TR>
<TR>
<TD class=p16 id=fontzoom style="LINE-HEIGHT: 1.5"
vAlign=top width="100%" height=400><BR><!--内容中广告开始-->
<TABLE cellSpacing=0 cellPadding=0 align=left
border=0><TBODY>
<TR>
<TD><IFRAME border=0 marginWidth=0 marginHeight=0
src="嵌入式系统的图形用户界面设计研究 无忧电子开发网-技术文章.files/ad-jswz_6.htm"
frameBorder=no width=211 scrolling=no
height=181></IFRAME><!-- <script type="text/javascript" src="/ad/ad.php?ListName=jswz&Place=6&Way=X&Num=10"></script> --></TD></TR></TBODY></TABLE><!--内容中广告结束-->
<P><STRONG>摘
要</STRONG>:本文探讨了嵌入式系统的图形用户界面(GUI)设计特点,并针对嵌入式操作系统Nucleus,分析了其图形用户界面模块的原理、特点与不足之处,最后从改善界面风格和节省内存开销方面提出了通用的嵌入式系统改进思路和实现方法。<BR><STRONG> 关键词</STRONG>:嵌入式系统 图形用户界面(GUI) 内存开销 </P>
<P><BR>
良好的操作界面在嵌入式系统中占有重要的地位,它能极大地方便了非专业用户的使用。这也是图形用户界面(GUI)在如今的嵌入式系统中广泛流行的原因。所以,很多嵌入式操作系统都提供对GUI的支持,Nucleus就是其中的一种。<BR>
嵌入式系统一般对实时性和功耗要求非常高,不愿意在GUI上消耗过多有限的系统资源,这似乎总是一对矛盾。那么如何解决或者至少缓和这一矛盾呢?下面将以Nucleus为例,来探讨解决的思路和技巧。</P>
<P><STRONG>1.Nucleus简介</STRONG></P>
<P>
Nucleus是美国著名厂商ATI(Accelerated Technology
Inc.)公司推出的实时操作系统(RTOS)产品,它是专门为实时嵌入系统设计的可扩展的多任务操作系统。Nucleus支持x86、MIPS、PowerPC、ARM系列、StrongARM、TMS320CXX等多种处理器,主要的应用领域有,网络数据通讯产品(如路由器、桥接器、蜂窝电话)、多媒体、汽车、医疗仪器、工业控制,以及航天航空和军事等。<BR>
Nucleus提供实时内核(Nucleus PLUS)、图形包(Nucleus Grafix)、
文件系统模块(Nucleus File)、网络模块(Nucleus NET)以及Web支持(Nucleus
Java/webserve)和开发工具(Nucleus MNT/UDB/EDE/DLL)等模块产品。约95%的Nucleus
PLUS代码用C语言编写,
因此它能很方便移植。Nucleus最大的特点是全部提供源代码,免去用户购买许可(license)和付版税(Royalties)的费用。提供了源代码的另一个优势就是,它可以方便移植,往往只需要修改几个汇编文件就可以方便的移植到其他CPU上,不用再次购买操作系统。而像VxWork等嵌入式操作系统不提供源代码,因此要移植到其他的CPU上,可能需要重新购买操作系统。 </P>
<P><STRONG>2.Nucleus的GUI模块分析</STRONG></P>
<P><STRONG>2.1 Nucleus
Grafix简介<BR></STRONG>
和许多其它优秀的嵌入式操作系统一样,Nucleus严格遵循模块化的思路,以保证系统的灵活性,可以根据不同的需求随意裁减。所以Nucleus的GUI模块实现方法就是,提供了一个专门的图形系统模块——Nucleus
Grafix。Nucleus Grafix
在Nucleus的系统模块组成中占有非常重要的位置,几乎所有基于Nucleus的应用都少不了这一模块。
<BR> Nucleus
Grafix最基本的元素是窗体(Window)和控件(Control),它提供了各式的窗体和丰富的控件,如窗体有对话框窗体、桌面窗体,控件包括按钮、文本编辑框、组合框、进度条、图片容器等等。<BR>Nucleus
Grafix采用消息机制管理各个窗体和控件,支持键盘、鼠标以及触摸屏等多种消息触发形式。在用户创建窗体的时候,Nucleus
会自动创建一个窗体链来管理这些窗体,包括消息的分发,窗体的绘制等。同理,在某个窗体中创建控件时,Nucleus也自动创建一个控件链来管理这些控件。所有的控件都必须属于某个特定的窗体,要对某一个控件的用户操作作出响应,就要先找到控件所在的窗体,取得该控件的句柄,然后做相应的工作。</P>
<P><STRONG>2.2基于Nucleus的应用系统结构及Nucleus
Grafix在系统中所处的位置 </STRONG></P>
<P><STRONG><A
href="嵌入式系统的图形用户界面设计研究 无忧电子开发网-技术文章.files/1127955835.gif"
target=_blank><IMG alt=""
src="嵌入式系统的图形用户界面设计研究 无忧电子开发网-技术文章.files/1127955835.gif"
align=absMiddle
border=0></A><BR></STRONG> <BR><BR>
通过图1,我们可以清楚地看到常见的基于Nucleus嵌入式应用系统结构及Nucleus
Grafix在系统中所处的位置。我们知道,嵌入式操作系统一般是可裁减的,所以图1中的其它模块等都是可选的,根据具体的需要而定,这里只是给出一个常见的系统结构模型。而且这是非常典型的嵌入式系统的结构,所不同的是硬件和嵌入式操作系统以及相应应用模块多少的变化而已。2.3
存在的主要问题<BR> 目前所知,存在的主要问题是Nucleus
Grafix在字体支持、显示效果、响应速度等方面存在一些缺陷。不管利用ATI公司提供的MNT还是其它开发工具,用Nucleus设计过GUI的人可能都会有过这样痛苦的体验:当把程序移植到目标系统上运行的时候,GUI总是面目全非,与他们在开发平台上看到的模拟效果相去太远,例如控件的显示不完整,文字和控件错位等等。如果再有几个窗体,来回切换的时候要可能要等上老半天。<BR>
出现这些问题的原因主要有两个方面,一方面是Nucleus的GUI模块中一些元件设计本身存在缺陷,例如编辑框(Edit
Box),对汉字和字体的支持,同步显示等一直存在很大缺陷,尽管不断推出新的版本,但是就笔者所知,这方面一直没有太大的改进。笔者在项目实践中,对诸如编辑框等常用的控件,几乎都是经过源代码级改造后方可使用。加上很多嵌入式系统配备的是不同型号和尺寸的液晶显示屏(LCD),就更难达到预期的显示效果,同一段代码,在不同的显示屏上都可能出现相去很远的显示效果。另一方面,就是Nucleus的GUI需要的系统开销还是比较大的,如果界面复杂一点,例如多开几个窗体,可能系统资源就不够用了。</P>
<P><STRONG>3.GUI设计及改进方案</STRONG></P>
<P><STRONG>3.1显示效果的改进方案</STRONG><BR>
正如前面所说的,良好的操作界面在嵌入式系统中也占有重要的地位重载。一个好的嵌入式应用系统,如果不需要增加硬件成本,技术上又是可实现的,那它当然不会拒绝拥有方便的、友好的甚至个性化的操作界面。而在Nucleus下,这些我们都可以通过软件改进来实现。我们往往只需要重载Nucleus
Grafix所提供的控件的绘制过程(Draw),再加上一点贴图技术,就可以灵活的控制各种GUI元件的显示,包括它们出现的位置、时机和风格,从而设计出非常漂亮、友好、灵活的图形用户界面。<BR>
下面以一个带图片的按钮为例,介绍怎么实现用户自己定有的绘制风格,以及对该控件的其它管理: </P>
<P><A
href="嵌入式系统的图形用户界面设计研究 无忧电子开发网-技术文章.files/1127955873.gif"
target=_blank><IMG alt=""
src="嵌入式系统的图形用户界面设计研究 无忧电子开发网-技术文章.files/1127955873.gif"
align=absMiddle border=0></A><BR>
以上是创建和管理一个图形按钮的典型流程,代码含义分别是:(1)创建名为MyWindow的对话框型窗体;(2)在MyWindow窗体中创建带图片的按钮BUTTON1;(3)将按钮BUTTON1和它要执行的函数Button1Proc关连起来;(4)指定该按钮的绘制控制函数MyDrawCtrl(替换掉Nucleus默认的Draw方法),这样可以想画什么样的风格都可以;(5)取得该按钮的句柄;(6)给按钮贴上准备好的图片picture1。这样一来,用户就可以根据所选者的LCD型号尺寸,灵活的设置控件的形状、大小、颜色、位置、灰度等等,并且真正实现所见即所得,比采用系统默认的绘制和管理控件方式有很大改观,鉴于显示屏的多样性,两者效果对比的图片这里就不列举了。<BR><STRONG>3.2
节省内存开销的思路和方法</STRONG><BR>
一般来说,嵌入式系统考虑到功耗、实时性和成本等因素,CPU处理能力和类存等系统资源是相当有限和宝贵的,当然不愿意在GUI上消耗过多有限的系统资源。但是,如果从系统应用的需要和操作的复杂度考虑,又必须要有许多的GUI元件,如果用Nucleus提供的各式的窗体和众多通用的GUI控件又势必消耗过多的系统资源,甚至根本就没法使程序顺利流畅的跑起来,怎么解决这个问题呢?其实,在Nucleus现有的机制下,我们还是有办法的,可以另辟蹊径,通过动态创建和管理GUI元件,重载页面管理(空间链的管理)就可以实现。
<BR>
在Nucleus现有的机制下,窗体及GUI元件将按照创建的先后顺序分别建立一个链表,Nucleus就是通过这些链表管理所有的元素。而这些元素是始终存在的,不管是否显示出来。
<BR>
我们现在要介绍的是一种新的思路,只创建一个窗体,其他所有的GUI元件都依附于这个窗体,并且只给当前显示在用户面前的GUI元件分配内存空间,其他暂时不用的元件都销毁掉。那么如何实现从一个操作界面到另一个操作界面的转换呢?这就需要预先把各个GUI元件分组,需要在同一个页面显示的元件归为一组,放在一起,用一个函数负责这组元件的绘制;需要切换到这个页面的时候就调用这个函数,同时把前一个页面的元件销毁掉以释放内存资源。对于当前显示的页面,我们可以充分利用操作系统GUI模块的机制,还是让系统管理它所属的元件,比如响应触发事件,消息循环与分发等。其实作为程序的设计者,我们是预先知道从一个页面跳向其他多个页面的所有可能情况的,只要在可能发生跳转的位置都放置一个绘制新的页面的函数,就可以实现系统所有可能的操作流程了。<BR>
这种实现方法和一般的耗费资源的方法,对于用户来说,他们感到的唯一不同的可能是系统运行速度更快,效率更高了,除此之外是感觉不到任何差别的。下面以Nucleus为例,简略的谈谈这一思路的实现流程,以及要注意的问题。</P>
<P><STRONG>3.3 界面方案设计与流程实例</STRONG></P>
<P><A
href="嵌入式系统的图形用户界面设计研究 无忧电子开发网-技术文章.files/1127955900.gif"
target=_blank><IMG alt=""
src="嵌入式系统的图形用户界面设计研究 无忧电子开发网-技术文章.files/1127955900.gif"
align=absMiddle border=0></A><BR><A
href="嵌入式系统的图形用户界面设计研究 无忧电子开发网-技术文章.files/1127955913.gif"
target=_blank><IMG alt=""
src="嵌入式系统的图形用户界面设计研究 无忧电子开发网-技术文章.files/1127955913.gif"
align=absMiddle
border=0></A><BR> <BR></P>
<P>
图2给出的是一个典型的界面方案设计的流程图。我们假设这个系统有n个页面,每个页面有若干GUI元件。正如我们前面所介绍的思路,只需要创建唯一的一个窗体;在需要切换页面的时候,调用DestroyPage函数,检索当前的控件链,并把它们全部销毁掉;在进入第n个页面时,调用函数MakePagen,创建第n个页面的元件并用我们自己定义的方式绘制出来。这里的DestroyPage、MakePagen函数不是系统提供的,是需要我们自己根据的实际需求去实现。不同的嵌入式操作系统,有不一样函数实现方法,但流程基本是一样的。限于篇幅,具体的实现代码不在此列出。<BR>
同样的应用系统界面,用常规的思路即使能够实现,可能需要多个窗体,几十甚至上百的GUI元件,势必消耗大量系统资源;而采用我们这里将要介绍的思路和方法,只需要一个窗体、几个或者至多几十个GUI元件,可以成倍的节省系统资源开销,并且在使用者看来,并不会有任何差异。也许这种思路和方法并没有什么奇特之处,也没有太多的技巧,但它仍然不失为一个简便易行,高效实用的方法,并且这种思路可以推广到大多数其他嵌入式系统的应用开发中去。<BR>
<BR><STRONG>4.结束语</STRONG></P>
<P> 以上讨论了嵌入式系统GUI设计的一些问题,针对Nucleus
系统,分析了其GUI模块存在的一些缺陷,并提出了改进的思路及实现的方法。由于是提供源代码的操作系统,某些改进可以进一步的进行封装,应用到以后的项目中。文中介绍的改善图形界面效果、节省系统资源开销的思路和方法不只是局限于Nucleus,对基于其它嵌入式操作系统的GUI设计同样有借鉴意义。</P>
<P><STRONG>参考文献</STRONG><BR>1. Accelerated Technology
Inc. Nucleus Plus Refrence Manual [M/CD],1998<BR>2.
Accelerated Technology Inc. Nucleus Plus Grafix Manual
[M/CD],1998<BR>3. ATI公司网站:<A
href="http://www.acceleratedtechnology.com/">http://www.acceleratedtechnology.com/</A><BR>4.
嵌入开发网 : <A
href="http://www.embed.com.cn/">http://www.embed.com.cn/</A><BR>5.
王田苗. 嵌入式系统设计与实例开发[M]. 北京:清华大学出版社 ,2002</P>
<TABLE cellSpacing=0 cellPadding=0 width="98%"
border=0><TBODY>
<TR>
<TD><!--ad9 <?=show_ggyw('jswz','9','h','5');?> --><IFRAME
border=0 marginWidth=0 marginHeight=0
src="嵌入式系统的图形用户界面设计研究 无忧电子开发网-技术文章.files/ad-jswz_9.htm"
frameBorder=no width=468 scrolling=no
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -