当前位置:首页 > gui
  • ARM嵌入式系统GUI开发研究

     随着嵌入式系统的发展,它在软件和硬件上日趋复杂,对于人机交互的效率的要求也日渐提高,特别是一些复杂的工控设备和消费电子产品。因此,图形用户界面(GUI)就从嵌入式系统的系统程序中被独立了出来。嵌入式GUI发展至今,已经有了许多的种类,具有了强大的功能。嵌入式GUI已经成为一个成功的嵌入式系统不可缺少的组成部分[1]。本文在ARM为核心的嵌入式系统上进行了图形界面的开发,并对Windows界面进行了模拟。  1  ARM处理器  嵌入式系统是将先进的计算机技术、半导体技术和电子技术和各个行业的具体应用相结合后的产物,这一点就决定了它必然是一个技术密集、资金密集、高度分散、不断创新的知识集成系统。[2]ARM是当前嵌入式领域使用最广泛的微处理器[3] 。ARM(Advanced RISC Machines)微处理器是采用ARM技术知识产权(IP)核的微处理器,这种ARM核技术是由英国的ARM公司所授权。世界各大半导体生产商从ARM公司购买其设计的ARM微处理器核,根据各自不同的应用领域,加入适当的外围电路,从而形成自己的ARM微处理器芯片进入市场。  本次设计中使用ARM7TDMI作为嵌入式系统的内核。ARM7TDMI核是通用的32微处理器内核,采用冯•诺伊曼结构,具有高性能和低功耗的特性。ARM7TDMI使用三级流水线技术来增加处理器指令流的速度,处理器和存储器的所有部分都可连续工作。通常在执行一条指令的同时就对下一条指令进行译码,并将第三条指令从存储器中取出[4]。ARM结构是基于精简指令集计算机原理而设计的,指令集和相关的译码机制比复杂指令集计算机要简单得多。  2  图形用户界面特征和发展趋势  2.1 图形用户界面的特征  图形用户界面(Graphic User InteRFace,GUI)的广泛流行是当今计算机技术的重大成就之一,它极大的方便了非专业用户的使用,人们不再需要死记硬背大量的命令,而可以通过窗口、菜单方便的进行操作。“Visual”已成为当前流行的形容词,如Visual Basic、Visual C++等。图形用户界面的主要特征如下[5]:  1、WIMP  其中W(Windows)指窗口,指用户或系统的一个工作区域。一个屏幕上可以有多个窗口。I(Icons)指图形,系形象化的图形标志,易于人们隐喻和理解。M(Menu)指菜单,可供用户选择的功能提示。P(Pointing Devices),指鼠标器等,便于用户直接对屏幕对象进行操作。  2、用户模型  GUI采用了不少Desktop桌面办公的隐喻,是应用者共享一个直观的界面框架。由于人们熟悉办公桌的情况,因而对计算机显示的图形符号的含义容易理解,诸如:文件夹、收件箱、画笔、工作薄、钥匙及时钟等。  3、直接操作  过去的界面不仅需要记忆大量命令,而且需要制定操作对象的位置,如行号、空格数、X及Y的坐标等。采用GUI后,用户可直接对屏幕上的对象进行操作,如拖动、删除、插入以至放大和旋转等。用户执行操作后,屏幕能立即给出反馈信息或结果,因而称为所见即所得(What you see is what you get)。用视、点(鼠标)代替了记、击(键盘),给用户带来了方便。  2.2 图形用户界面的发展趋势  随着虚拟现实、科学计算可视化及多媒体技术的飞速发展,新的人机交互技术不断出现,更加自然的交互方式将逐渐为人们所重视。新一代界面的主要特征可描述如下:以用户为中心、智能化、高带宽、不限制地点、图示编程等。  3  ARM嵌入式系统GUI开发  近年来,嵌入式系统得到了飞速的发展,产品形态多种多样,由于嵌入式产品更加商品化,对图形用户界面(GUI)的要求也越来越高。  3.1  LCD及其驱动  本设计采用2.2英寸TFT液晶屏——TFT6758液晶模块,其工作电压为3.3V,内带白光LED背光灯,可以直接使用8位、16位或18位总线方式与控制器连接(因为液晶模块内部包含了HD66781和HD66783液晶控制驱动器)。为了得到更高的数据传输速率,设计电路时采用16位总线接口,按照HD66781芯片数据手册说明,需要将IM3和IM0引脚接0电平,16位数据分别为DB17~DB10和DB8~DB1引脚,未使用的DB0和DB9引脚接地,电路连接如图1所示[6]。在使用液晶屏时需要先添加其相应的驱动程序,点阵液晶显示器TFT6758的驱动芯片为HD66781,门驱动(Gate driver)芯片为 HD66783。图1  TFT6758液晶模块应用电路  3.2  软件平台的选用  目前在市场上有几种发展成熟、比较有代表性的嵌入式GUI开发软件,如北京飞漫软件公司的MiniGUI、美国Century软件公司的MicroWindows、挪威Troltech公司的Qt/Embedded等,这几种GUI系统各具特色,但大部分需要在嵌入式操作系统上进行移植,这样就一定会增加时间和精力的投入,所以综合考虑各方面的因素后,使用ZLG/GUI作为此次设计的软件平台。   ZLG/GUI是一种占用资源小、使用方便的嵌入式系统简易的图形用户界面软件,不需要在嵌入式操作系统上移植就能直接使用,提供了最基本的绘图功能,具有一些较高级的接口功能,支持单色、灰度、伪彩、真彩等图形显示设备,简单易学。[!--empirenews.page--]3.3  模拟Windows界面的设计实现  我们经常使用的Windows系统的桌面,便是一个华丽的图形用户界面,所以设计模拟了Windows的桌面的图形界面。  这个界面的设计思想是:在全屏填充一张图片,作为Windows的桌面背景图案。经过计算得到状态栏的坐标值,在液晶显示屏的下方选择绿色和蓝色填充两个矩形,作为状态栏。仍然使用填充矩形函数做出开始菜单的背景色。在相应的地方通过计算获得汉字的显示坐标值,在相应的位置显示汉字。判断是否有键按下,若没有就继续显示桌面,有键按下就显示开始菜单。显示Windows界面流程如图2所示。模拟Windows界面在LCD上显示如图3所示。图2 显示Windows界面流程图3 模拟Windows界面  4 结束语  近年来,随着嵌入式技术的发展,嵌入式系统得到了飞速的发展,嵌入式设备将适用于更广阔的领域,航天、航空、军事、医学,还有与百姓生活息息相关的家电、运输、通信等等,由于嵌入式产品更加商品化,会涉及到方便用户使用的问题,对图形用户界面(GUI)的要求也越来越高,如何开发一个适合于自己硬件条件的GUI系统,成了嵌入式系统开发的一个重要工作内容。本次设计采用ZLG/GUI作为软件平台,对于复杂的应用可以采用MiniGUI等软件作为软件平台。  本文作者创新点: 利用ZLG/GUI作为软件平台,开发出了类windows的图形用户界面,为嵌入式系统的GUI开发提供一种简便、低成本、可行的解决方案。

    时间:2009-02-23 关键词: ARM gui 设计教程

  • 基于S3C44B0X的嵌入式GUI的研究与应用

    1  GUI 的概述  GUI以一种以图形化为基础的用户界面,使用统一的图形操作系统,如可移动的视窗、选项与鼠标,作为用户与操作系统之间的中介。GUI最重要的优势在于使用户摆脱了在命令行提示符下与操作系统进行交互的方式,用户可以仅仅通过鼠标点击来实现熟悉程序的操作,而且由于图表、对话框等的引入,使得操作直观形象。GUI已成为一种用户与计算机交互的标准。包括Microsoft的视窗系统、Unix的Motif、Linux的桌面系统GNOME。    在计算机硬件平台下的GUI模型一般如图1所示:uC/GUI是由Micrium公司专门针对嵌入式系统开发的一款图形开发系统。它设计用于为任何使用LCD图形显示的应用提供高效的独立于处理器及 LCD 控制器的图形用户接口,它适用单任务或是多任务系统环境, 并适用于任意 LCD 控制器和 CPU 下任何尺寸的真实显示或虚拟显示。对于开发uC/GUI图形应用不需要什么目标系统, 大部分的图形应用开发都可以在模拟器下进行; 但是最终的目的是通常还是在目标系统上运行程序。目标系统(硬件):[1].CPU(8/16/32/64位)。[2].必要的RAM和ROM 存储。[3].LCD 显示器(任何类型及分辨率的)。对于内存的需求取决于你选用的 UCGUI 的功能模块以及你所使用的目标系统上的编译器的效率. 内存的占用量无法估计准确的值, 下面就一些的数值适用于多数的目标系统。表1  uC/GUI资源需求情况注:①小型系统指不包含窗口管理功能,大型系统指包含窗口管理及各种窗体控件功能。       ②ROM的需求量随着应用程序中使用的字体数目而增长。2  基于S3C44B0X处理器的嵌入式系统的基本组成       三星公司推出的16/32位RISC处理器S3C44B0X为手持设备和一般应用提供了高性价比和高性能的微控制器解决方案。为了降低成本,同时增强稳定性,S3C44B0X提供了丰富的内置部件,包括:8KB Cache和 内部SRAM,LCD控制器等,其主频可以达到66MHz,速度几乎相当于486CPU,而且扩展了完整丰富的外围设备的接口,图2是典型的系统的框图。图2   系统框图       采用三星的S3C44B0X开发通用的嵌入式系统,S3C44B0X的运行方式通常有两种:一种是有操作系统的,由于操作系统所占用的空间比较大,所以Flash里面装的是系统引导程序,通常称为Boot Loader,是在系统复位后执行的第一段代码,相当于PC上的BIOS,完成系统硬件的初始化,包括时钟的设置、存储区的映射等,设置堆栈指针,然后跳转到操作系统内核的入口,将系统控制权交给操作系统,在此之后系统的运行和Boot Loader 再无任何关系。Boot Loader独立于操作系统,必须由用户自己设计,它的实现高度依赖于硬件,包括处理器的体系结构、具体型号、硬件电路板的设计。另一种是无操作系统的,系统的初始化以及主程序都是在Flash内,它与S3C44B0X的Bank0相连,上电复位后系统使程序从0x00000000开始运行。 3  利用uC/GUI开发GUI应用程序的基本方法        由于uC/GUI提供了源代码,因此可以很容易地将它移植到各个平台下,使用时,只要将uC/GUI的软件压缩包解压缩到一个目录下就可以了。   3.1 uC/GUI的结构         uC/GUI的软件体系结构如图3所示。uC/GUI函数库为用户的应用程序提供GUI接口,包含的函数有文本、数值、二维图形、输入设备以及各种窗口对象。其中,输入设备可以是键盘、鼠标或触摸屏;二维图形包括图片、直线、多边形、圆、椭圆、圆弧等;窗口对象包括按钮、编辑框、进度条、复选框等。μC/GUI函数库可以通过GUI_Conf.h文件进行配置,配置的内容包括是否采用内存设备,是否采用窗口管理器,是否支持操作系统、触摸屏、以及配置动态内存的大小等。图3  uC/GUI的软件体系结构3.2   利用uC/GUI开发应用程序的步骤      由于uC/GUI提供了源代码,在开发应用程序时,用户可以首先将核心文件、LCD驱动文件和需要的字体文件包含在自己的工程里,然后再根据实际的硬件需要,包含内存设备输入设备控件和窗口管理部分。       具体可以分为以下几步:⑴按照实际需要,定制自己的uC/GUI开发环境。其中包括对上述目录的筛选,或对目录中文件的筛选。⑵指定硬件设备的地址,编写接口驱动代码。这里需要修改LCD_Conf.h文件。⑶编译、链接、调试示例程序。⑷修改示例程序并测试,增加需要的功能。⑸如果准备开发多任务应用,则需要修改GUI_MAXTASK和GUI_OS宏,实现uC/GUI与操作系统的结合。⑹编写自己的应用程序。      使用uC/GUI开发应用程序时,目标系统不是必须配备的,因为uC/GUI提供了一个模拟器,用户可以在模拟器上面看到应用程序的执行的结果。所以,对于开发环境,uC/GUI仅要求有一个符合ANSI标准的“C”语言编译器。至于C++编译器,它不是必须的,但是如果用户使用C++语言来编写应用程序,那就需要一个C++编译器。[1]因此,在Windows系统下只要安装了Microsoft Visual C++就可以运行uC/GUI的模拟器工程(工程名一般为Simulation.dsw),然后将该工程中的Application文件夹清空,加入自己编写的源文件,编译链接就可以看到运行结果。3.3应用实例      下图是用uC/GUI开发应用程序的一个实例,该程序是显示汽车运行时发动机转速的一个界面。图4 用户界面图黑色的背景是这个LCD的窗口区域,大小为640*480。先利用画线函数绘制基本的弧线,再利用填充函数填充相应的背景颜色,最后用一个分片存储设备执行一个指定的绘图函数,在这种情况下,在一段时间内只有一小部分要更新。static void DemoScale(void){int Cnt;int tDiff, t0 = GUI_GetTime();PARAM Param;  /* 绘图函数的参数 */GUI_AUTODEV AutoDev; /* 分片存储设备对象 */GUI_SetColor(GUI_WHITE); /*设置颜色*/GUI_SetFont(&GUI_Font8x16);/*设置字体*/GUI_DispStringHCenterAt(“Scale using GUI_AUTODEV-object”, 160, 0);GUI_AA_EnableHiRes();/* 启动高分辨率用于抗锯齿 */GUI_AA_SetFactor(MAG);GUI_MEMDEV_CreateAuto(&AutoDev); /* 建立 GUI_AUTODEV 对象 *//* 显示在一个固定时间上的指针 */for (Cnt = 0; (tDiff = GUI_GetTime() - t0) < 24000; Cnt++);{/* 获得数值用于显示一个多边形来表示指针 */Param.Angle = GetAngle(tDiff)* DEG2RAD;GUI_RotatePolygon ( Param.aPoints,aNeedle,countof(aNeedle),Param.Angle);GUI_MEMDEV_DrawAuto(&AutoDev, &Param.AutoDevInfo, &Draw, &Param);} 4  结束语     本文只是简单展示了uC/GUI在开发图形用户界面上的应用,其巨大的应用潜力还有待进一步的研究。相信随着计算机渗透到人类工作和生活的各个方面,以嵌入式系统为核心的后PC时代的到来,uC/GUI的应用前景也将更为广阔。

    时间:2009-03-03 关键词: gui s3c44b0x 设计教程

  • 基于Linux的轻量级嵌入式GUI系统及实现

    1、引言近年来,随着信息家电、手持设备、无线设备的迅速发展,人们对嵌入式系统的需求逐渐增多,要求也越来越高。这使为嵌入式系统提供一个友好方便、稳定可靠的G UI系统成为非常紧迫要求[5]。嵌入式技术是当前微电子与计算机技术中的一个重要分支[1], 它是指以应用为中心, 以计算机技术为基础,软件、硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等的严格要求的专用计算机系统[2]。常用的PC机上的GU I因嵌入式设备对资源的严格要求显得过于庞大,而不适合嵌入式系统[6]。与普通环境下的GUI 系统相比较.嵌入式环境下的GUI 系统要求轻型、占用资源少、高性能、高可靠性、可配置等。同时,由于嵌入式环境的多样性,跨平台、高移植性也是嵌入式GUI系统必须具备的特点。尽管嵌入式系统对GUI 的需求越来越明显,但目前GUI的实现方法各有不同,主要有二种; 第一种方法是某些大型厂商针对自身需要自主开发满足自身需要的GUI 系统;第二种方法是某些厂商使用某些比较成熟的GUI系统。对于大部分厂商来说,第二种方法不失为一个省时省力、又可取得较好效果的方法。 2 GUI 系统发展概况目前国内外已经推出了很多基于Linux的GUI产品, 比较成熟的面向嵌入式的GUI 系统有QtEmbedded 、MicroWindows 、MiniGUI 、WinCE 等[4]。1)Microwindows 是一个公开源码(LGPL)的项目。它致力于为一些小型的设备和平台提供现代图形窗口环境的一些特性,其主要特色是一个基于客户/服务器体系结构的GUI 系统,采用了面向硬功件的驱动程序层、对硬件的接口层、向高层操作系统的API 层的三层体系结构。并提供了相对完善的图形功能, 以及一些其他较高级的功能,比如Alpha 混合、三维支持、TrueType 字体支持等。但是有如下缺点:无任何硬件加速能力,图形引擎中存在许多低效算法,且代码质量较差。2)MiniGUI是在Linux 控制台上运行的,基于SVGALib 和LinuxThread 库的多窗口图形用户界面支持系统。主要特色是基于线程来编写,所有的应用研究程序都运行在同一个地址空间,这样可以提高系统的效率。底层增加了图形抽象层GAL 和基于输入设备的输入抽象层作为提供底层Linux 控制台或者XWindow 上的图形接口以及输入接口。但是API没有封装,不便移植,功能限制其不能用于更大的嵌入式系统。3)Qt/Embedded 是著名的Qt库开发商Trolltech 公司开发的,是一个专门为嵌入式系统设计的图形用户界面工具包。它的主要特点是可移植到不同平台上、拥有自己的窗口系统、拥有自己强大的开发工具和编程接口、提供压缩字体格式、支持Unicode, 可以轻松地使程序支持多种语言。但是Qt/Embedded 不是免费的,使用者必须支持license 费用。4)OpenGL 采用LGPL 条款发布。OpenGUI 比较适合于基于x86 平台的实时系统,基于汇编实现的内核,并利用MMX 指令进行了优化使其运行速度快,但可移植性稍差。这几种GUI 的设计目标仍然是通用性,它们大多支持多窗口的随意切换、覆盖,以及可移动、可动态改变尺寸的窗口,诸如此类在多数嵌入式应用中几乎永远用不到的特性,使得应用程序的开发要考虑很多不必要的细节[5]。以上的嵌入式GUI 系统已很成熟,但是对于一些需求自主开发轻型、功能简洁、专用性强GUI 系统的用户来说,以上的产品并不是一个很好的选择。以上的GUI 系统一部分是收费的商业产品,另外是通用的GUI功能系统,对硬件资源非常看重的嵌入式系统来说,多余无用的功能浪费硬件资源绝不是好的选择。本文针对开发小型专用的嵌入式GUI 系统进行了研究,实现专用的GUI 系统的开发。3 轻量级GUI 的设计与实现嵌入式GUI 系统采取分层设计的结构,对不同层次进行封装。在最低层建立了硬件抽象层(HAL,Hard Abstract Layer),为基于图形显示设备(如VGA 卡)的图形抽象层(Graphic Abstract Layer,GAL)和基于输入设备(如键盘、触摸屏等)的输入抽象层(Input Abstract Layer,IAL) 。图形抽象层GAL 建立在各种流行的绘图引擎之上,屏蔽各种绘图引擎的具体实现,对上层提供统一的底层绘图接口。输入抽象层IAL建立在各硬件设备驱动程序之上,屏蔽各种不同的输入设备硬件实现,对上层提供统一的应用输入接口;图形引擎通过FrameBuffer 来获得,而输入设备的处理却没有统一的接口。在PC上,通常使用键盘和鼠标,而在嵌入式系统上, 可能只有触摸屏或为数不多的几个键,在这种情况下,提供一个抽象输入层就显得格外重要。图形设备接口(GDI,Ggraphic Device Interface) 建立在图形抽象层之上,主要包括点、线、面、文本、的绘制等功能。图形用户接口及相关API则建立在图形设备接口之上,实现消息队列、窗口、控件以及应用程序管理等各种功能。系统的层次结构如图1所示。3.1 嵌入式LIGHT GUI系统层次结构[!--empirenews.page--]GAL 层完成系统对具体的显示硬件设备的操作, 极大程度上隐藏各种不同硬件的技术实现细节,为应用程序开发人员提供统一的图形编程接口。IAL 层则需要实现对于各类不同输入设备的控制操作,提供统一的调用接口。GAL 层与IAL 层的设计屏蔽了底层硬件的多样性,可以极大程度地提高嵌入式GUI 的可移植性。另外利用GAL 可大大提高GUI 的可移植性,并且使程序的开发和扩展变得更加容易。图形抽象层使用GFX 数据结构来表示图形引擎系统;系统通过输入设备层将底层的各种设备统一映射成上层应用程序支持的两种基本输入设备——鼠标设备和键盘设备。对于具体的硬件设备,只要根据驱动程序提供的接口,编写程序实现相应的抽象接口,就能将各种设备模拟成为鼠标或者键盘进行输入。系统通过维护一个已注册图形引擎数组,保存每个图形引擎数据结构的指针。系统利用一个指针保存当前使用的图形引擎。每个图形引擎的数据结构定义了该图形引擎的一些信息,实现GAL 所定义的各个接口,包括初始化和终止、画点处理函数、画线处理函数、矩形框填充函数、调色板函数等。3.2 图形设备接口(GDI) 图形设备接口是建立在图形抽象层上的一个独立的绘图应用接口,它将图形抽象层提供的接口功能进一步封装和扩充,向更高层的应用程序提供使用更为简便,功能完善的绘图功能。lightGUI 采用了Windows 类似于Windows 中的GDI 模块。它提供设备上下文(Device Context) 操作、基本GDI 对象操作(包括画笔、画刷、字体、位图、区域等)。在该系统中,设备上下文的定义采用如下数据结构:typedef struct  gdi_DC{ int DrawPointx; int DrawPointy; int DrawOrgx; int DrawOrgy; int DrawRangx; int DrawRangy; int DrawRop; COLORREF BackColor; COLORREF FontColor; }DC,*PDC  系统中设置和设备上下文主要的API 如表所示CreateDC(): 创建新的设备上下文DispatchDC(PDC):释放设备上下文GetDrawDes (PDC,POINT*): 获取设备上下绘图坐标原点GetDrawRange(PDC,POINT*):获取上下文绘图坐标范围GetBackColor(PDC,int* ):获取上下文绘图背景色3.3 消息驱动机制的设计实现系统的基本通信机制是事件驱动消息机制。系统线程与系统中所有的窗口拥有自己的消息队列。系统线程,该队列中存放所有从底层输入设备接收到的各类控制消息,等待系统线程分配到应用程序窗口;系统中所有的窗口私有消息队列用来存放发送到该窗口的所有消息,等待窗口进一步处理。在系统中消息分为四类:系统消息、外部时间消息、窗口菜单消息、窗口控件消息。在消息驱动的应用程序中,外设发生的事件(例如键的敲击)都由支持系统收集,将其以事先约定格式翻译为特定的消息。应用程序一般包含有自己的消息队列,系统将消息发送到应用程序的消息队列中。应用程序可以建立一个循环,在这个循环中读取消息并处理消息,直到特定的消息传来为止。当窗口没有消息可处理时,消息循环处理阻塞状态,这时不消耗CPU 资源。在GUI 中应用程序处理消息队列中的消息分为GetMessage()从消息队列中获取消息。GetMe ssage()函数有2个参数,一个用来存放接收到的消息数据,另一个是应用程序主窗口句柄。当获得一个消息时,会将该消息的目标窗口确认为应用程序主窗口。如果收到的消息不是MSG_QUIT 3.4 窗口的设计实现窗口管理模块支持多窗口的同时显示,可进行窗口的创建、移动、大小调整等操作。窗口设计中包括主窗口、窗口菜单、窗口控件、窗口主过程和窗口相关的API函数。在设计中对每个窗口都采用自身的主过程来完成自身消息的处理工作3.5  控件层(Controls) 控件层是窗口的子窗口。这些子窗口的行为与主窗口一样,既能够接收键盘和鼠标等外部输入,也可以在自己的区域内进行输出,只是其所有活动被限制在主窗口中。控件层设计实现了基本控件,包括按钮、静态文本框、单选(多选)框、绘图框等多种通用控件。控件层充分挖掘了基本窗口系统的潜力。向用户提供最常用的功能,极大地简化用户开发的过程。  4 结束语本文介绍了嵌入式图形用户界面系统的基本架构和实现原理,提出了嵌入式环境下自主、轻型、占用资源少可配置的GUI 系统的解决方案。轻量级 GUI 系统已在Linux 系统上测试通过。本文所开发所采用的体系结构以及面向对技术对窗口用户控件的开发极大的提高了开发效率和代码的重用率,对开发自主的GUI 系统有一定的借鉴和参考价值。本文作者创新点:利用Linu x开发平台,研发适用于小型嵌入式系统的专用GUI系统,使用层次结构和面向对象的控件开发技术,缩短开发周期,降低开发成本,为嵌入式GUI系统的开发提供结开发方法的参考。

    时间:2009-03-29 关键词: Linux gui 设计教程

  • 适用于移动终端的GUI设计与实现

    在常见的移动终端等小型手持式设备上,由于硬件条件等的限制,我们看到的用户界面都非常简单,几乎看不到PC机上华丽美观的GUI 支持。随着硬件条件的提高,移动终端的嵌入式系统对轻量级GUI的需求会越来越迫切。用户界面是指计算机与其使用者之间的对话接口[1],它为用户提供与应用系统交互的可视化通道,同时为程序员提供了一种编程模式,即GUI负责系统的可视化界面的生成、管理以及系统与用户之间的信息交互[2-3],而程序员只需专注于对实际应用的分析。1.       GUI在移动终端中的作用 图1显示大部分移动终端软件的系统架构,由图可以清晰看出,GUI在移动终端系统中扮演着很重要的角色,它运行在操作系统抽象层(OSAL)之上,为应用程序提供基于消息机制的图形用户界面编程接口。GUI与其它一些应用引擎一起为实现丰富的移动终端应用而提供支持,从而将应用程序的计算部分与界面分离开来,这样就充分保证了根据不同需求快速定制出功能强大界面丰富的应用程序界面。图1 移动终端软件架构2.       GUI层次结构从整体结构上看GUI是分层设计的,其主要成分为层次结构见图2,它的主要组成部分是 :显示驱动、GDI接口、消息队列和窗口管理四部分。图2. GUI层次结构2.1 显示驱动显示设备和打印设备一同组成图形设备,图形设备抽象层(GAL)定义了一组不依赖于任何特殊硬件的抽象接口,所有顶层的图形操作都建立在抽象接口之上。而用于实现这一抽象接口的底层代码类似操作系统中的驱动程序。显示设备驱动作为GUI最底层驱动,通过显示设备驱动程序接口(DDI)给上层GDI函数一些基础的功能和设施。可以看成是GDI的图形驱动程序,并将底层图形设备和上层接口分离开来。DDI用GAL中的函数标准结构表示,统一成标准的驱动接口结构,保证显示对窗口透明。主要DDI函数包括:对显示设备进行初始化,管理显示内存使用和为上层GDI提供映射到物理地址空间以及诸如调色板等物理地址上的相关处理。2.2 GDI接口GUI系统的一个重要组成部分就是GDI,即图形设备接口(Graphics Device Interface)。通过GDI,GUI程序就可以在计算机屏幕上,或者其他的显示设备上进行图形输出,包括基本绘图和文本输出。GDI重要函数包括:图形设备上下文管理、绘图函数和使用GDI对象的函数2.2.1图形设备上下文管理函数[!--empirenews.page--]要在图形输出设备上绘制图形,在调用图形输出函数时,均要求指定经初始化的图形设备上下文(Device Context,DC),也称作"设备环境"。设备上下文是连接应用程序、设备驱动程序以及输出设备的纽带,见图3。设备上下文包含许多属性,当需要修改这些属性时,只需调用一个GDI函数修改设备上下文中属性的参数。图3. 设备上下文 一个图形设备上下文所代表的含义很复杂,它起码应该包含如下内容[5]: ·           该设备上下文本所在设备信息(显示模式、色彩深度、显存布局等等);·           该设备上下文所代表的窗口以及该窗口被其他窗口剪切的信息·           该设备上下文的基本操作对象(笔、刷子、字体、位图、区域等),及其上下文信息;·           由程序设定的局部信息(绘图属性、映射关系和局部剪切域等)。2.2.2 绘图函数设备上下文的属性决定了有关绘图函数如何工作的细节。通过绘图函数应用程序能够方便地画出直线、矩形、圆、椭圆和其它复杂图形,而不需直接与具体的输出设备打交道。2.2.3使用GDI对象的函数当调用绘图函数时,使用当前设备上下文中选择的GDI对象来进行绘图。GDI共有笔、刷子、字体、位图、区域和逻辑调色板六个对象。    例如可以通过在CreatePen、 CreatePenIndirect或ExtCreatePen函数中指定这些特征来建立一个逻辑画笔,这些函数传回一个逻辑画笔的句柄。要使用这个画笔,就要用SelectObject将画笔句柄选进设备内容。这样,画任何线都使用这个画笔,然后可以取消设备内容中的画笔选择,并清除画笔对象。清除画笔对象是必要的,因为画笔定义占用了分配的内存空间。    除了画笔以外,GDI对象还用于建立填入封闭区域的画刷、字体、位图以及GDI的其它一些方面。2.3  消息队列移动终端产生的消息主要包括:按键事件消息、协议栈消息及自定义消息等。按键一般有12个标准电话按键、左右2个软键、5个导航键(上、下、左、右、中) 、拨号键和挂机键,由此可产生对应的短按键及长按键消息。按键的按下及释放产生按键事件,对比键码表对按键事件进行解码,获取正确的按键消息。按键消息经消息过滤后送往当前焦点窗口。GSM 协议栈消息是由手机平台产生的送往消息队列的协议栈消息,主要是网络事件及手机状态的响应消息,包括所有对SIM卡、网络状态、通话、短消息等的响应消息。协议栈消息需传送到赋于系统窗口属性的窗口,但窗口并不需要对每一项协议栈消息进行处理,只依据窗口函数的具体属性定义进行消息响应。GUI采用消息驱动机制,把上面这些消息收集在一个消息队列中,然后将这些消息连同定时器和重画消息一起放入应用程序消息队列中。应用程序消息队列是属于各个应用程序所有的先进先出队列。但是定时器消息和重画消息保留在队列中直到应用程序处理完所有其它消息后才予以处理。GUI将属于一个特定应用程序的消息放入该应用程序的消息队列中,然后应用程序读取这些消息,并将它们发送给相应的窗口函数。[!--empirenews.page--]GUI将某些消息直接发送给应用程序的窗口函数,而不是将它们放入到应用程序队列中,这样的消息称为非排队消息。通常,非排队消息是那些仅影响该窗口的消息。虽然大多数消息都由GUI产生,但应用程序也可以产生自己的消息并将其加入到应用程序队列中。一旦应用程序的主函数从队列中获取了消息,就可以将消息传送给相关窗口的窗口函数,并把消息的内容作为参数传递过去,这样,窗口函数就可以处理这个消息,完成相应的工作。当窗口函数返回后,GUI将控制权返回给主函数。主函数可以再从队列中取出下一消息进行处理。2.4 窗口管理窗口是终端应用程序的主要输入输出设备。应用程序只有通过窗口才能访问显示设备。窗口由标题条、菜单条、滚动条、边框以及在显示设备上的矩形框里出现的其它特性组成。当创建窗口时,可为窗口指定所要求的特性,然后GUI画出此窗口并管理它。虽然应用程序创建了某一窗口,并且从技术上来说可以独占它,但该窗口的管理实际上是由应用程序与GUI相互协作来实现的。GUI管理窗口的位置和显示方式,并管理窗口的标准特性,如边框、标题等,同时完成许多由用户初始化并直接影响窗口的任务。而应用程序则管理窗口的其它所有工作,特别是负责管理窗口的“客户区”(窗口边框以内的区域)。应用程序可完全控制属于自己的窗口客户区的显示。为管理这一协作任务,GUI告知每个窗口其变化可能要受到影响。因此,每个窗口必须具有相应的“窗口函数”,用于接收窗口管理消息。窗口管理消息既可指定该函数要执行的动作,也可请求该窗口函数返回信息。窗口函数作为窗口最重要的基本属性,处理所有传送到本窗口的消息。窗口的表现及行为特征是由窗口函数定义的对消息的处理所决定的。在正常情况下,具体的窗口函数只处理部分指定的消息,而正是这部分特定消息的处理决定了各个窗口的不同特性。通过调用窗口函数,将消息参数传递到所指定的窗口函数,由窗口函数依据消息所携带的消息参数进行判断处理。对绝大部分消息只需将其送往缺省窗口函数进行处理。缺省窗口函数集成了标准窗口函数对消息的标准处理,是对所有窗口函数的一个共性集合窗口管理收集所有的输入信息,然后把这些输入信息以消息的形式送往合适的窗口。这些消息的执行结果又可能产生新的消息,新消息的传送仍由窗口管理负责。窗口管理通过调用窗口函数,向窗口函数传递消息参数,把消息送到目的窗口。在移动终端中,采用消息分派技术将协议栈消息依次发往所有具有系统属性的窗口。通过窗口树表将非协议栈消息送往所获取的当前焦点窗口。3.  GUI调用流程下面通过一个具体例子分析GUI函数调用流程:移动终端的窗口系统初始化时首先要创建一个菜单,在注册菜单窗口类时将菜单序号图片全部按顺序读入内存,这就需要GDI用画刷对象来进行矩形填充,下图清晰的显示了GUI在注册这个窗口类时各层调用的流程。图4. GUI调用流程4. 结语GUI系统是一项复杂的软件工程,本文设计和实现的GUI占用资源少、可配置,特别适用于移动终端。它给终端上层应用提供了一个清晰的图形界面。同时,在将它用于多种终端平台时还要尽可能考虑它的可扩展性、兼容性、可移植性等属性。

    时间:2009-05-05 关键词: gui 端的 于移动 设计教程

  • 嵌入式图形系统μc/GUI的移植和开发

    摘要  嵌入式系统的开发已成为新的行业热点,而嵌入式图形系统的开发近年来随着嵌入式系统的深入而不断推陈出新。本文首先概述嵌入式系统及其嵌入式图形系统gui的现状,然后具体描述μc/GUI图形系统和其移植重点、程序开发以及和其他图形系统比较优缺点。  gui 在嵌入式系统或实时系统中的地位  越来越多的市场需求数据显示,包括 pda、娱乐消费电子、机顶盒、dvd等影音设备、wap 手机等高端电子产品得到广泛应用,原先仅在军工、工业控制等领域中使用的gui图形系统,受到越来越多的关注。  对于轻量级 gui 的系统而言,对 gui 的要求相对较低,如传统51类型单片机这类系统一般不希望建立在庞大累赘的、非常消耗系统资源的操作系统和 gui 之上,如 windows 或 x window。目前此类系统都直接使用原有编程手段,采用比较简单的手法实现 gui。对于太过庞大和臃肿的gui系统而言,μc/gui这类可运用于此类资源较紧张的轻型 gui 的需求更加突出。  μc/gui简介及其配制  μc/gui是美国micrium公司出品的一款针对嵌入式系统的优秀图形软件。它是为任何使用lcd图形显示的应用提供高效的独立于处理器及lcd控制器而设计的图形用户接口,它适用单任务或是多任务系统环境。架构基于模块化设计,由不同的模块中的不同层组成。包括液晶驱动模块,内存设备模块,窗口系统模块,窗口控件模块,反锯齿模块和触摸屏及外围模块。其主要特性包括丰富图形库,多窗口、多任务机制,窗口管理及丰富窗口控件类(按钮、检验框、单/多行编辑框、列表框、进度条、菜单等),多字符集和多字体支持,多种常见图像文件支持,鼠标、触摸屏支持,灵活自由配制等特性。  图1 μc/gui模块及开发套件  在开发套件上,μc/gui提供众多工具辅助开发,包括位图转换器,字体转换器,μc/gui viewer和非常完善的基于pc平台的模拟器,如图1所示,其中μc/gui核心模块和lcd驱动模块是必须的,其他均是可配置可选择模块。由于μc/gui并非针对某一平台而设计,它可以运行于所有支持ansi c的平台上,所以在pc上调试成功的应用程序可以原封不动的移植到平台上,避免繁琐的片上调试过程。  μc/gui可以在任何的cpu上运行, 能够适应绝大多数的使用黑白或彩色lcd的应用,它提供非常好的允许处理灰度的颜色管理。还提供一个可扩展的2d图形库及占用极少ram的窗口管理体系。在μc/gui的最初典型配制可包括是否需要操作系统支持,是否需要内存设备支持,是否需要窗口支持,是否需要抗锯齿支持等众多选项,这对于gui的定制和gui的体积是非常重要的。小型系统需求ram100bytes,堆栈500bytes,rom10kbytes,完全满足资源非常紧张的系统之中。  mc/gui移植重点和应用程序开发  (1) 首先定义guiconf.h和lcdconf.h这两个文件,前者是μc/gui功能模块和动态存储空间(用于内存设备和窗口对象)大小,默认字体设置等基本gui预定义控制的定义。后者lcdconf.h为lcd大小,控制器类别,总线宽度,颜色选取等lcd参数控制文件。gui/core/lcd_confdefaults.h文件内可以找到所有囊括lcd配制默认选项,包括lcd屏个数,控制器个数 ,调色板,屏幕反向设置等众多配制选项。如果配备触摸屏可以通过guitouchconf.h进行配制,根据触摸屏及其控制芯片编制以下几个函数  void touch_x_activatex (void);// 准备y轴数据测量  void touch_x_activatey (void);// 准备x轴数据测量  int touch_x_measurex(void); // 根据ad转换结果返回x的值  int touch_x_measurey(void); // 根据ad转换结果返回y的值  以上几个函数在gui_touch_exec()会被调用。  (2) 对于lcd自带控制器类别的液晶屏,通过lcdconf.h中的总线接口和寄存器接口进行硬件接口的配制和定义。对于片上集成lcd控制器平台而言,通过对片内lcd控制器寄存器的设置来配制lcd接口信号。在一般的lcd中需要配制的lcd接口信号包括vframe帧同步信号,vline线同步脉冲信号,vclk象素时钟信号,vm信号和数据位不等的象素点数据输出信号。[!--empirenews.page--](3) lcd驱动编程的实质是液晶屏上的点对应的显存编程,最底层调用函数为画点函数,用户可根据自身平台情况根据总线接口和寄存器接口或者lcd控制器寄存器进行操作。_setpixel(),_getpixel(),xorpixel()为最底层直接对显存操作函数。mc/gui提供部分控制器驱动,文件为gui/lcddriver/lcdslin.c,如sed1335,t6963等简单lcd控制器。核心函数为lcd_write(). _setpixel()调用lcd_write()写显存。  (4) 在samplegui_x文件夹内包括有与硬件联系紧密的文件,包括gui_x.c,gui_x_embos.c, gui_x_ucos.c等文件, gui_x.c包括大部分与硬件的关联函数,如定时器的初始化和触摸屏相关函数。mc/gui与操作系统挂接的核心是定时器的设置和挂接。μc/GUI是通过延时函数gui_delay()调用gui_x_delay,再调用gui_exec()处理窗口部件中的回调函数进行重绘。在任何一款嵌入式操作系统中都需要定时器的心脏跳动作用,支持os的μc/gui可以通过定时器的设置达到嵌入式操作系统和图形系统的实时和同步操作。在gui_x_ucos.c中通过μc/os中的延时程序同μc/gui挂接实现整合。  图2 μc/gui软件结构图  (5) 经过移植之后,gui应用程序开发通过μc/gui而变得非常容易,在调用gui_init()后,用户可以根据需要正确配制μc/gui后,可使用其强大的库函数和丰富的gui资源进行编程。在gui编程过程中,可以打开抗锯齿功能减小图形失真,得到高质量的图形和字体效果。采用内存设备能有效克服闪烁现象,获得更快的显示速度,但它和抗锯齿功能一样需要额外的内存开销。  μc/gui和其他图形系统的比较  (1) μc/gui优势在于其体积小,配制性强,运用领域非常之广泛。相对于众多嵌入式图形系统,如microwindows/nanox, opengui, qt/embedded, minigui等,只要满足ram100bytes,堆栈500bytes,rom10kbytes的小型系统中都可以运行μc/gui,而这个需求是其他图形系统所不及的,可以广泛运用到国内已经运用非常成熟的单片机系统内,增强系统性能。在资源丰富的大型系统中,也只需要ram2-6kb,堆栈1200bytes,rom30-60kb就可以满足mc/gui的各种功能。对比于其他图形系统最少几百k,动辄上m的系统而言是非常有优势的。其众多的配制,满足不同需求用户需要,方便灵活小巧,实用性大大增强。  (2) 平台的广泛性,移植方便。由于μc/gui是100%c编写,适应绝大多数软硬平台,其适应性非常强,相对于众多具有软硬件针对性的图形系统而言,结构划分和模块划分非常清晰,分设专门的lcd驱动模块,移植简单方便。代码量相对较小,易操作可扩展性强,方便用户定制和自主更新完善满足个性需求。  结语  本文着重介绍了μc/gui和其移植方法,作为一个面向嵌入式系统的图形用户界面支持系统,μc/gui系统需求、执行效率、可定制方面非常出色,体积小,移植方便,程序适应平台广泛,在嵌入式系统研发过程中大大简化了图形系统开发的周期和难度,具有很高的实用价值。

    时间:2009-12-23 关键词: gui 设计教程

  • 基于uC/GUI的数据显示系统的设计

    uC/GUI是Micrigm 公司推出的用于嵌入式系统的图形用户接口(graphics user interface,GUI)软件包,由于uC/GUI完全以ANSI-C编写,因此它与处理器无关,可以很方便地移植到不同的操作系统和嵌入式微处理器上,并可支持不同尺寸的图形液晶显示器。它采用层次化的设计,功能强大,移植方便,被广泛地应用于嵌入式领域,如PDA、机顶盒以及DVD NCD播放机等。本文详细介绍了uC/GUI在ARM 内核S3C44B0X的移植。实践证明uC/GUI具有良好的实时性和稳定性以及广泛的应用前景。1、硬件连接与液晶显示原理本设计使用的硬件采用ARM7开发板,液晶模块为L78C64,它是7.8in 256色STN型LCD显示屏,分辨率为640×480。LCD控制器外部接口信号的定义及其与LCD模块各信号之间的对应关系如下:(1)VFRAME:LCD控制器与LCD驱动器之间的帧同步信号。该信号负责指出LCD屏新的一帧开始的时间。LCD控制器在一个完整帧显示完成后立即插入一个VFRAME信号,并开始新一帧的显示。该信号与LCD模块的YD信号相对应;(2)VLINE:LCD控制器和LCD驱动器之间的线同步脉冲信号。该信号用于将LCD驱动器水平线(行)移位寄存器的内容传送给LCD屏显示。LCD控制器在整个水平线(整行)数据移入LCD控制器后,插入一个VLINE信号。该信号与LCD模块的LP信号相对应;(3)VCLK:LCD控制器和LCD驱动器之间的像素时钟信号。由LCD控制器送出的数据在VCLK的上升沿处送出,在VCLK的下降沿被LCD驱动器采样。该信号与LCD模块的XCK信号相对应;(4)VM:LCD驱动器的AC信号。VM信号被LCD驱动器用于改变行和列的电压极性,从而控制像素点的显示和熄灭。VM信号可以与每个帧同步,也可以与可变数量的VLINE信号同步;(5)VD3~0 LCD:像素点的数据输入端口。与LCD模块的D3~0相对应:(6)VD7~4 LCD:像素点的数据输入端口。与LCD模块的D7~4相对应。液晶显示原理:写满整个屏的数据称为1个“帧”数据,YD是帧同步信号,该信号启动LCD屏的新一帧数据。两个YD脉冲之间的时间长度称为帧周期。根据LCD模块的特性,刷新时间为12~14ms,频率为70~80Hz。每一帧包括480个LP脉冲。LP为行(共480行)数据输入锁存信号,也就是行同步脉冲信号。该信号启动LCD屏的新一行数据。XCK为行数据输入信号,也就是每1行中像素点数据传输的时钟信号。每组8位的数据在XCK的下降沿被输入锁存,因此,每1行包括640×3/8个XCK脉冲信号。D0~D7是8位的显示数据输入信号。2、驱动程序设计下面分三步完成液晶的初始化。(1)I/O口的初始化由于采用S3C44B0X的PC接口和PD接口作为LCD驱动接口,因此,需要设置PC接口工作在第3功能状态和PD接口工作在第2功能状态。(2)相应控制寄存器的设置方法S3C44B0X包括一个LCD控制器时序发生器TIMEGEN, 由它来产生VFRAM,VLINE,VCLK和VM 控制时序。这些控制信号由寄存器LCOCON1和LCDCON2进行配置。通过对寄存器种配置项目的设置,TIMEGEN就可以产生适应于各种LCD屏的控制信号了。VFRAM和VLINE脉冲的产生是通过对LCDCON2寄存器的HOZVAL和LINEVAL进行配置来完成的。每个域都与LCD的尺寸和显示模式有关。其中,HOZVAL=(显示宽度/VD数据线位数)-1。在彩色模式下,显示宽度=3×每行的像素点数。对所选的液晶模块,HOZVAL=(640×3/8)-1;LINEVAL=(显示宽度)-1。对所选的液晶模块,LlNEVAL=480-1。VCLK信号的频率可以通过LCDCON1寄存器的CLKVAL域来确定,即VCLK=MCLK/(CLKVAL×2)LCD控制器的最大VCLK频率为16.5MHz,几乎支持所有已有的LCD驱动器。由于上述关系,CLKVAL的值决定了VCLK的频率。为了确定CLKVAL的值,应该计算一下LCD控制器向VD端口传输数据的速率,以便使VCLK的值大于数据传输的速率。数据传输速率的公式为:数据传输速率=HS×VS×FR×MV其中,HS—LCD的行像素值;VS—LCD的列像素值:FR—帧速率;MV—模式值,这里取8位单扫描,彩色。 对于所选用的液晶模块:HS=640;VS=480;FR=70Hz:MV=3/8。因此,数据传输速率=640×480×70×3/8=8,064,000Hz。VCLK值应该大于8MHz而小于16MHz,因此,CLKVAL可以取9~15。(3)完整的液晶初始化程序C程序void LCD_Init_Controler() { rLCDCON1=(0)|(2<<5)|(MVAL_USED<<7)|(0x3<<8)|(0x3<<10)|(CLKVAL_COLOR<<12); //disable,8B_SNGL_SCAN,WDLY=8clk,WLH=8clk,rLCDCON2=(LINEVAL)|(HOZVAL_COLOR<<10)|(10<<21); //LINEBLANK=10(without any calculation) rLCDSADDR1= (0x3<<27) | (((U32)frameBuffer256>>22)<<21)|M5D((U32)frameBuffer256>>1); //256-color,LCDBANK,LCDBASEU rLCDSADDR2=M5D((((U32)frameBuffer256+(SCR_XSIZE*LCD_YSIZE))>>1))|(MVAL<<21); rLCDSADDR3= (LCD_XSIZE/2) | (((SCR_XSIZE-LCD_XSIZE)/2)<<9); //The following value has to be changed forbetter display. rREDLUT =0xfdb96420; rGREENLUT=0xfdb96420; rBLUELUT=0xfb40; rDITHMODE=0x0; rDP1_2=0xa5a5; rDP4_7=0xba5da65; rDP3_5=0xa5a5f; rDP2_3=0xd6b; rDP5_7=0xeb7b5ed: rDP3_4=0x7dbe; rDP4_5=0x7ebdf; rDP6_7=0x7fdfbfe; rLCDCON1= (1)|(2<<5)|(0<<7)|(0x3<<8)|(0x3<<10)|(4<<12); } 经过以上几步,就完成了液晶的硬件驱动,下面就是移植软件包,调用底层驱动,完成复杂的显示任务。3、uC/GUI软件包的移植3.1 uC/GUI特点(1)支持任何8位、16位和32位的CPU,只要求CPU具有相应的ANSI-C编译器即可;(2)所有硬件接口定义都使用可配置的宏;(3)字符、位图可显示与LCD的任意点,并不限制与字节长度的整数倍数地址;(4)所有程序在长度和速度方面都进行了优化,结构清晰;(5)对于慢速的LCD控制器,可以使用缓冲存储器减少访问时间,提高显示速度。[!--empirenews.page--]3.2 uC/GUl移植步骤在使用uC/GUI时,可以按照以下几个步骤来进行:(1)按照需要,定制uC/GUI;(2)指定硬件设备的地址,编写接口驱动代码;(3)编译、链接、调试例子程序;(4)修改例子程序,并测试增加需要的功能;(5)编写自己的应用程序。3.3 具体实现(1)首先介绍uC/GUI的目录结构和基本配置。uC/GUI主要目录如下:GUI/ConvertMono 使用黑白显示设备时,所要使用的灰度转换函数GUI/ConvertColor 使用彩色显示设备时,使用的色彩转换函数GUI/Config 包含了对uC/GUI进行配置的一些文件GUI/Core uC/GUI核心代码GUI/Font uC/GUI与字体相关的代码文件GUI/LCDDriver LCD驱动代码文件GUI/MemDev 内存设备支持文件代码GUI/Touch 输入设备支持的文件代码GUI/Widget uC/GU1支持的控件代码,包括编辑框、列表框、按钮和选择框等GUI/WM uC/GUI窗口管理部分代码(2)修改uC/GUI,使之适于移植。在ADS环境中新建一个工程,将上述gui文件夹下的所有文件加入工程。将Config文件夹下的3个文件GUIConf.h、GUITouchConf.h和LCDConf.h加入新工程,如下修改LCDConf.h的内容:C程序/*LCDConf.h*/#ifndef LCDCONF_H #define LCDCONF_H #define LCDG4 //lcd颜色数,必须定义,LCDMONO(单色),LCDG4(四级灰度),LCDG16(16级灰度)#define LCD_XSIZE(640) /* LCD水平分辨率 */#define LCD_YSIZE(480) /* LCD垂直分辨率 */#define LCD BITSPERPIXEL(8) #endif /*LCDC0NF_H*//*以下是S3C44B0X LCD控制器的配置*/#include "..incoption.h" #define SCR_XSIZE (640) //视窗屏幕大小#define SCR_YSIZE (480) #define LCD_XSIZE (640) //液晶屏幕大小#define LCD_YSIZE (480) #define M5D(n)((n)&0x1fffff) #define ARRAY_SIZE_G4(SCR_XSIZE/4*SCR_YSIZE) #define HOZVAL (LCD_XSIZE/4-1) #define HOZVAL_COLOR (LCD_XSIZE*3/8-1) #define LINEVAL (LCD_YSIZE-1) #define MVAL (13) #define CLKVAL_G4 (10) #define MVAL_USED 0 #endif /*LCDCONF_H */(3)加载LCD驱动。LCD驱动程序如前面所述,保存在lcd44b0.c中。出了底层的初始化函数LCD_Init_Controler()以外,还需要做以下修改,这里只提关键部分。主要进行相关的寄存器配置,以及和GUI的接口程序。这里只提及关键部分。① 定义显示缓冲区时使用的char数据类型,它是8bit的:unsigned char Bmp[ARRAY_SIZE_G16];//液晶显示缓冲数组② 定义读写缓冲区时使用的数据类型,也是8bit的U8:#define LCD_READ_MEM (Off)*((U8*)(frameBuffer256+(((U32)(Off)))))#define LCD_WRRITE_MEM(Off,data)*((U8*)frameBuffer256+(((U32)(Off)))))=data#define LCD_WRITE_REG(Off,data)⑧ 定义液晶总线宽度定义位8bit:#ifndef LCD_BUSWIDTH#define LCD_BUSWIDTH(8)#endif④ 定义字节顺序:#define LCD_SWAP_BYTE_ORDER(0)至此uC/GUI的移植基本上已经完成了。当然这里只提供了移植的关键部分,更多更完整的移植还需要做不少的工作,如触控屏的移植、键盘鼠标的移植以及中文字体的移植等。详情请参阅uC/GUI手册中Getting Started一章。4、数据显示程序设计数据显示程序主要是基于uC/GUI平台的GUI函数库,完成字符、曲线的绘制。与画线相关的GUI函数有:GUI DrawHLine()原型:void GUI_DrawLine(int x0,int y0,int x1,int y1);其中,x0、y0、x1、y1分别为UGI坐标系下的起点和终点的横坐标和纵坐标。GUI DispDec()原型:void GUI_DispDec(I32 v,U8 Len);其中,v为要显示的十进制变量值,Len为要显示的数据的位数。5、总结本文主要介绍了基于ARM7内核S3C44B0X和L78C64液晶模块硬件平台的uC/GUI的移植,以及在工程上的应用,经过实际应用发现,uC/GUI功能强大,响应迅速,稳定性高,具有广泛的应用前景。

    时间:2010-01-25 关键词: uc gui 设计教程

  • 一种嵌入式linux系统GUI的实现

    0 引言嵌入式linux操作系统的快速发展,迫切需求一种简洁的人机交互界面,为此,本文介绍了如何在FrameBuffer基础上设计自己的嵌入式GUI的简单方法。1 显示原理1.1 颜色表示颜色是所有绘图操作的基础。16位的LCD屏一般需要2个字节来表示。16位RGB格式一般可分为RGB565与RGB5551两种格式。其中RGB565格式如表1所列,而其RGB5551格式如表2所列。表中的R为红色分量,G为绿色分量,B为蓝色分量。由于颜色采用的是RGB565规则。因此。基本颜色,即红色、绿色、蓝色按照RGB565规则可分别为0xf800、0x07e0、Ox001f。由此可见,如果用十六进制直接表示颜色会非常不便。目前,普遍为软件工程师所接受的颜色表示方式为24位的RGB,其中R、G、B三个分量各占用一个字节,范围是0~255。因此,应该为MIS软件系统提供一个从24位RGB转化为16RGB的接口。该接口用宏来实现的具体方式如下:#define RGB(r,g,b)  (((r>>3)<<11)∣((g>>2)<<5)∣(b>>3))1.2 画点操作图形设备接口的最基本操作为画点,任何其它绘图函数都是基于画点来完成的。其原理是以屏的左上角第一个像素点为(0,0)点,向右为x轴,向下为y轴建立坐标系,只要提供某点的横坐标x,纵坐标y和颜色值,就可以通过一定的算法找到(x,y)所表示的地址,然后将该地址上的2个字节替换为指定的颜色值。例如有一块640×480×16的LCD,像素的首地址为0x40000000,那么,其中的第2行、第3列的像素位置如图1所示。如果要把第2行、第3列的像素由原来的白色(0xfff)变为黑色(0x0000)。那么,就可以根据下面的寻址方式找到地址:最终地址=首地址+y×2×屏的宽度+x×2其中,首地址表示第1行第1列像素所对应的地址。由上式,该点的地址=0x40000000+2×2×0x280+3×2=0x40000A06。那么0x40000A06地址对应的数据应为十六位颜色的低字节部分,而0x40000A07地址对应的数据应为十六位颜色的高字节部分。[!--empirenews.page--]例如,画点函数可用下面的代码来实现:其中m_pScreen_Addr是屏的首地址,m_nSereen_Width和m_nScreen_Height则分别为屏宽和屏高。这样,就可以在画点的基础上根据Bresenham算法延伸出各种各样的基本绘图操作来,比如画直线、画矩形和画圆等。2 FrameBuffer接口FrameBuffer是出现在2.2.xx内核当中的一种驱动程序接口。Linux抽象出FrameBuffer这个设备可供用户态进程实现直接写屏。FrameBuffer机制模仿显卡的功能是将显卡硬件结构抽象掉,然后通过FrameBuffer的读写直接对显存进行操作。用户可以将FrameBuffer看成是显示内存的一个映像。在将其映射到进程地址空间之后,就可以直接进行读写操作,而且写操作还可以立即反映在屏幕上。这种操作是抽象的、统一的。用户不必关心物理显存的位置和换页机制等具体细节,而这些都可由FrameBuffer设备驱动来完成。Linux采用虚拟内存技术,系统中的所有进程之间以虚拟方式共享内存。对每个进程来说,它们好像都可以访问整个系统的所有物理内存。更重要的是,即使单独一个进程,它拥有的地址空间也可以远远大于系统物理内存。在地址空间中,进程有权访问虚拟内存地址区间(比如08048000~0804c000)。这些可被访问的合法地址区间叫做内存区域(memory area)。通过内核,进程可以给自己的地址空间动态地添加或减少内存区域,而进程只能访问有效范围内的内存地址。每个内存区域也具有相应进程必须遵循的特定访问属性,如只读、只写、可执行等属性。如果一个进程访问了不在有效范围中的地址,或以不正确的方式访问了有效地址,那么,内核将会终止该进程,并返回“段错误”信息。在应用程序中,一般将FrameBuffer设备映射到进程地址空间,比如下面的程序就可打开/dev/ib0设备,并通过mmap系统调用来进行地址映射,随后用memset将屏幕清空。Struct fb_var_screen-info记录了帧缓冲设备和指定显示模式的可修改信息,包括显示屏幕的分辨率、每个像素的比特数和一些时序变量。实现以上过程的函数代码如下:[!--empirenews.page--]此外,FrameBuffer设备还提供了若干ioctl命令,通过这些命令可以获得显示设备的一些固定信息(比如显示内存大小)以及与显示模式相关的可变信息(比如分辨率、象素结构、扫描线的字节宽度),同时可获得伪彩色模式下的调色板信息等。3 GUI系统的自主开发嵌入式GUI的总体设计思想是把所有操作都由对象和消息驱动,通过对现有GUI的分析来对多种嵌入式应用系统根据GUI的要求进行总结,然后抽象出各种组件类。嵌入式GUI的所有组件和数据都被设计成对象,组件对象通过消息来通信。嵌入式GUI在消息驱动下可形成整体并构成系统。其整体框架和体系结构如图2所示。系统中的所有消息节点将构成空闲队列和消息队列,其中消息队列存放当前EGUI系统中没有处理的消息。消息队列由消息管理器进行操作和管理。图2中的输入设备抽象层、操作系统抽象层和组件对象集合都是消息发生器,它们都会产生EGUI消息。调用消息管理器的操作可将生成的消息放入到消息队列中。消息管理器用于管理消息队列和空闲队列,当有消息产生时,消息管理器将执行消息入队PUSH ()操作,其处理过程是先从空闲队列中摘下一个节点,形成一个消息节点,再将它挂到消息队列的队尾。桌面对象管理器负责分发消息,它可通过调用消息管理器的出队操作POP()来取得待处理的消息,处理过程是将消息队列的第一个消息节点摘下,并取得该消息节点的信息,然后将该消息节点挂到空闲队列的队尾。桌面对象管理器取得消息后,将按照一定的策略对取得的消息进行分发,并让接收该消息的组件对象中的消息处理函数来处理该消息。分发消息时,如果消息指定了接收对象,则将消息路由到接收对象;而非键盘的系统消息。将被路由到桌面对象管理器的第一个子对象;对于用户定义的消息,系统会将其路由到指定的对象。而组件对象处理消息时,如果处理操作要改变屏幕数据,组件对象将调用绘图操作Draw重绘自己的外观。整个系统就是这样不断地产生消息、分发消息、处理消息,从而形成一个无限循环,同时驱动EGUI运行。4 结束语针对当前嵌入式GUI的特点,本文给出了可支持汉字显示、键盘输入的多线程嵌入式GUI系统的设计方法。该方法设计的系统采用窗口模式,而且便于操作,同时具有可视化界面、操作灵活、资源占用少等优点,并可支持JPG格式的图像文件。

    时间:2010-05-08 关键词: Linux gui 设计教程

  • 嵌入式linux系统GUI设计方案

    嵌入式linux操作系统的快速发展,迫切需求一种简洁的人机交互界面,为此,本文介绍了如何在FrameBuffer基础上设计自己的嵌入式GUI的简单方法。1 显示原理1.1 颜色表示颜色是所有绘图操作的基础。16位的LCD屏一般需要2个字节来表示。16位RGB格式一般可分为RGB565与RGB5551两种格式。其中RGB565格式如表1所列,而其RGB5551格式如表2所列。表中的R为红色分量,G为绿色分量,B为蓝色分量。由于颜色采用的是RGB565规则。因此。基本颜色,即红色、绿色、蓝色按照RGB565规则可分别为0xf800、0x07e0、Ox001f。由此可见,如果用十六进制直接表示颜色会非常不便。目前,普遍为软件工程师所接受的颜色表示方式为24位的RGB,其中R、G、B三个分量各占用一个字节,范围是0~255。因此,应该为MIS软件系统提供一个从24位RGB转化为16RGB的接口。该接口用宏来实现的具体方式如下:#define RGB(r,g,b)  (((r>>3)<<11)∣((g>>2)<<5)∣(b>>3))1.2 画点操作图形设备接口的最基本操作为画点,任何其它绘图函数都是基于画点来完成的。其原理是以屏的左上角第一个像素点为(0,0)点,向右为x轴,向下为y轴建立坐标系,只要提供某点的横坐标x,纵坐标y和颜色值,就可以通过一定的算法找到(x,y)所表示的地址,然后将该地址上的2个字节替换为指定的颜色值。例如有一块640×480×16的LCD,像素的首地址为0x40000000,那么,其中的第2行、第3列的像素位置如图1所示。如果要把第2行、第3列的像素由原来的白色(0xfff)变为黑色(0x0000)。那么,就可以根据下面的寻址方式找到地址:最终地址=首地址+y×2×屏的宽度+x×2其中,首地址表示第1行第1列像素所对应的地址。由上式,该点的地址=0x40000000+2×2×0x280+3×2=0x40000A06。那么0x40000A06地址对应的数据应为十六位颜色的低字节部分,而0x40000A07地址对应的数据应为十六位颜色的高字节部分。例如,画点函数可用下面的代码来实现:其中m_pScreen_Addr是屏的首地址,m_nSereen_Width和m_nScreen_Height则分别为屏宽和屏高。这样,就可以在画点的基础上根据Bresenham算法延伸出各种各样的基本绘图操作来,比如画直线、画矩形和画圆等。2 FrameBuffer接口FrameBuffer是出现在2.2.xx内核当中的一种驱动程序接口。Linux抽象出FrameBuffer这个设备可供用户态进程实现直接写屏。FrameBuffer机制模仿显卡的功能是将显卡硬件结构抽象掉,然后通过FrameBuffer的读写直接对显存进行操作。用户可以将FrameBuffer看成是显示内存的一个映像。在将其映射到进程地址空间之后,就可以直接进行读写操作,而且写操作还可以立即反映在屏幕上。这种操作是抽象的、统一的。用户不必关心物理显存的位置和换页机制等具体细节,而这些都可由FrameBuffer设备驱动来完成。Linux采用虚拟内存技术,系统中的所有进程之间以虚拟方式共享内存。对每个进程来说,它们好像都可以访问整个系统的所有物理内存。更重要的是,即使单独一个进程,它拥有的地址空间也可以远远大于系统物理内存。在地址空间中,进程有权访问虚拟内存地址区间(比如08048000~0804c000)。这些可被访问的合法地址区间叫做内存区域(memory area)。通过内核,进程可以给自己的地址空间动态地添加或减少内存区域,而进程只能访问有效范围内的内存地址。每个内存区域也具有相应进程必须遵循的特定访问属性,如只读、只写、可执行等属性。如果一个进程访问了不在有效范围中的地址,或以不正确的方式访问了有效地址,那么,内核将会终止该进程,并返回“段错误”信息。在应用程序中,一般将FrameBuffer设备映射到进程地址空间,比如下面的程序就可打开/dev/ib0设备,并通过mmap系统调用来进行地址映射,随后用memset将屏幕清空。Struct fb_var_screen-info记录了帧缓冲设备和指定显示模式的可修改信息,包括显示屏幕的分辨率、每个像素的比特数和一些时序变量。实现以上过程的函数代码如下:[!--empirenews.page--]此外,FrameBuffer设备还提供了若干ioctl命令,通过这些命令可以获得显示设备的一些固定信息(比如显示内存大小)以及与显示模式相关的可变信息(比如分辨率、象素结构、扫描线的字节宽度),同时可获得伪彩色模式下的调色板信息等。3 GUI系统的自主开发嵌入式GUI的总体设计思想是把所有操作都由对象和消息驱动,通过对现有GUI的分析来对多种嵌入式应用系统根据GUI的要求进行总结,然后抽象出各种组件类。嵌入式GUI的所有组件和数据都被设计成对象,组件对象通过消息来通信。嵌入式GUI在消息驱动下可形成整体并构成系统。其整体框架和体系结构如图2所示。系统中的所有消息节点将构成空闲队列和消息队列,其中消息队列存放当前EGUI系统中没有处理的消息。消息队列由消息管理器进行操作和管理。图2中的输入设备抽象层、操作系统抽象层和组件对象集合都是消息发生器,它们都会产生EGUI消息。调用消息管理器的操作可将生成的消息放入到消息队列中。消息管理器用于管理消息队列和空闲队列,当有消息产生时,消息管理器将执行消息入队PUSH ()操作,其处理过程是先从空闲队列中摘下一个节点,形成一个消息节点,再将它挂到消息队列的队尾。桌面对象管理器负责分发消息,它可通过调用消息管理器的出队操作POP()来取得待处理的消息,处理过程是将消息队列的第一个消息节点摘下,并取得该消息节点的信息,然后将该消息节点挂到空闲队列的队尾。桌面对象管理器取得消息后,将按照一定的策略对取得的消息进行分发,并让接收该消息的组件对象中的消息处理函数来处理该消息。分发消息时,如果消息指定了接收对象,则将消息路由到接收对象;而非键盘的系统消息。将被路由到桌面对象管理器的第一个子对象;对于用户定义的消息,系统会将其路由到指定的对象。而组件对象处理消息时,如果处理操作要改变屏幕数据,组件对象将调用绘图操作Draw重绘自己的外观。整个系统就是这样不断地产生消息、分发消息、处理消息,从而形成一个无限循环,同时驱动EGUI运行。4 结束语针对当前嵌入式GUI的特点,本文给出了可支持汉字显示、键盘输入的多线程嵌入式GUI系统的设计方法。该方法设计的系统采用窗口模式,而且便于操作,同时具有可视化界面、操作灵活、资源占用少等优点,并可支持JPG格式的图像文件。

    时间:2010-05-16 关键词: 方案 Linux gui 设计教程

  • 基于Microwindows的嵌入式GUI设计

    引言   嵌入式图形用户界面与存储安全、嵌入式java 虚拟机并称为嵌入式系统中的三大关键技术。在嵌入式应用领域,伴随着硬件技术的发展,传统意义上的人机交互界面正趋于淡化,取而代之的是具有友好人机交互支持的嵌入式图形界面。   嵌入式计算机系统以其关键部件的高性能、低价格等优势为embedded gui 的发展奠定了坚实的市场和技术基础;而基于linux 开放源代码、遵循不同授权条款的诸多embedded gui 软件及其自由开发者,又大大推进了embedded gui 的应用进程,起到推波助澜的作用,如microwindows、minigui 及qt/ embedded 等。   嵌入式系统是以应用为中心、计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。嵌入式系统的这一定义也就界定了嵌入式系统对embedded gui 的基本要求。这些要求如下: (1) 轻量级、占用系统资源少; (2) 性能高,友好的人机互动; (3) 可靠性高; (4) 模块架构,配置灵活,便于移植。   目前,在嵌入式应用领域比较成功的embedded gui主要有minigui、microwindows 和qt/ embedded。   minigui 和microwindows 都是自由软件,只是前者遵循l gpl 条款,后者遵循mpl 条款。这两个系统的技术路线也有所不同。minigui 的策略是首先建立在比较成熟的图形引擎之上,如svgalib 和libggi ,开发的重点在窗口系统、图形接口上。   microwindows 目前的开发重点则在底层的图形引擎上,它不需要其它图形系统的支持。在linux 操作系统上,microwindows 也可以充分利用linux 提供的framebuffer机制来显示图形。并且,microwindows 还具有很强的移植性,能够在大多数微处理器上运行。   qt/ embedded 由于移植了大量原来基于qt 的xwindows 程序,提供了非常完整的嵌入式gui 解决方案,再加上opera 浏览器,可以说是一个成熟的商业软件。然而,qt/ embedded 不能运行在非qt 的软件中,其源代码也过于庞大。   作为一个开放源代码项目,microwindows 将现代图形窗口技术的一些特性展现给了编程团体,而不需要诸如microsof t windows 或x window 这样占用较大磁盘和ram 空间的高级窗口的支持。它直接面向显示硬件本身,不需要任何操作系统或其它图形系统的支持,可以在linux 2. 0 以上的framebuffer 系统上很好地运行。microwindows 本身就被设计成便于移植、能够在大多数硬件和软件环境下运行的embedded gui。   microwindows 最新版本0. 9 有如下新特性:   (1) 支持新的nxl ib 项目,nxl ib 对x11 的二进制程序可以不加修改地直接在microwindows 里运行,而无需x11 server 支持;   (2) 支持sharp zaurus、tuxscreen、trimedia 及cygnus x11 平台;   (3) 内建标准化校准(nxcal) 支持,如一个触摸屏驱动程序可以支持包含ipaq、zaurus、ads 和tuxscreen 在内的大多数arm 平台;   (4) 增强了字符支持,包括big5 、gb2312 、euccn、euckr、eucj p 和j isx0213 等;   (5) 大幅提高了x11 屏幕驱动程序和文本画图的速度;   (6) 32 位argb 硬件驱动支持单色alpha ;   (7) 支持带有havi 键盘映射的l irc 键盘;   (8) 从源代码中为html 和pdf 文档自动生成支持基于do  总而言之,最新版本的microwindows 在硬件驱动加速上、在图形引擎算法上以及代码质量上,都比原先的版本有较大的改进。 [!--empirenews.page--] microwindows 的api   microwindows 采用分层体系结构设计,提供了丰富的api 支持,支持win32/ wince gdi 和nano-x两种api 集。 microwindows 体系结构   microwindows 的体系结构由下至上,分别为具体硬件、驱动层、图形引擎层和api 层,如图1 所示。用户可以根据具体应用需求对不同层的代码进行修改或重写。     (1) 设备驱动程序。   键盘驱动程序主要有两个,分别是kbd _ tty. c 和kbd _ bios. c 。前者主要用于linux 和el ks 系统,而后者主要用于msdos 实模式。   鼠标驱动程序主要有三个:mou_gpm. c ,用于linux 的一个gpm 驱动; mou _ ser. c ,用于linux 和el ks 系统;mou_gpm. c ,主要用于msdos 系统。   屏幕驱动程序有面向16 位el ks、msdos 实模式的v ga 驱动( scr_bios. c、vgaplan4. c、memp14. c 、scr_here. c)和面向linux 的framebuffer ( scr_fb. c、fb. c 等) 两种。这部分驱动程序最复杂,在设计时可以参考scr_fb. c 来设计自己的屏幕驱动程序。   (2) 设备独立的图形引擎。   microwindows 的图形引擎是设备独立的。引擎的每一例程都接受screendevice 结构的指针( psd) 来作为第一个参数。psd 说明了底层的显示细节,如屏幕大小的x 、y 值,屏幕颜色ncolors ,以及诸如打开、关闭、画线等函数指针。 microwindows 的api   microwindows 提供两个应用程序接口:一是win32 接口,这种api 不是很成熟;二是nano-x ,这种api 比较好,结构上清晰,功能上也完全。   在microwindows 上的api 接口函数的基本模型都是用来初始化屏幕、键盘和鼠标的驱动程序,然后一直等待select () 消息循环。当事件发生时,这条信息将送到用户程序。如果是用户请求图形操作,那参数将被编码后送到适当的gdxxx 核心程序上。与原始图形操作相对的窗口概念是被该层所控制的,也就是说该层的api 函数定义了窗口及其对应系统的概念。这样,系统坐标就能被转成屏幕上显示的坐标,并且可将数据传给gdxxx 核心程序,由它进行实际操作。该层亦定义图形/ 显示文件,并且会将此信息(包括裁减信息) 送到核心程序上。   microwindows 的api 支持大多数图形绘制、裁减、窗口工具条绘制及拖拉窗口等程序。nano-x 最先是由davin bell 为minix 设计的,它被设计为c/ s 模式,一般是通过unix domain socket 在客户与服务器端进行通信的,但没有实现窗口管理,所以对窗口的处理需要使用系统提供的一个插件集,或者完全由应用程序员自已开发。另外,nano-x 不是消息驱动的,而是基于x 协议模式。在这种模式下,驱动整个系统运行的可以说是请求与事件。   请求就是客户端为了完成某一动作而对服务器端所发出的申请,并且为每一个请求都定义了一个标识数。每个请求的结构都是不同的,但类似如下结构:  

    时间:2011-01-22 关键词: gui microwindows 设计教程

  • 几种常用的嵌入式Linux GUI及其特点

    随着Internet与网络的迅速发展并向家庭领域不断扩展,使消费电子、计算机、通信(3C)一体化趋势日趋明显,嵌入式系统再度成为研究与应用的热点。嵌入式实时Linux操作系统以价格低廉、功能强大又易于移植而正在被广泛采用,成为新兴的力量,如今随着WAP手机、PDA、机顶盒、及DVD/VCD播放机已经迅速普及,用户对这些手持式设备的GUI提出了更高的要求,希望能看到像PC机才拥有的华丽美观的GUI。GUI已经成为了人与机器沟通的桥梁,嵌入式系统对GUI的需求越来越高,而这一切均要求有一个轻型、占用资源少、高性能、高可靠、可配置及美观的GUI支持。   1 Java的图形界面工具   Java技术对于服务器,个人电脑和嵌入式系统来说是一项伟大的技术。由于其具有跨平台等特性。Java在服务器和桌面电脑方面的应用是非常成功的。然而在GUI方面,Java只用非常有限的一些特征去构建图形用户界面。其思想就是采用平台无关的Java应用程序接口打包到不同的操作系统来开发本地图形用户界面,被称之为抽象的窗口工具(AWT)。仅有普通的部件如文件域、文本区、选择框、单选按钮、列表框和按钮被AWT支持,图形和图像的特性支持非常有限,也就是说,只足够构建简单的applet程序。认识到需要更高级的图形用户界面组件和图形能力,Sun公司开发了Swing,Java 2D,Java3D,图像的输入/输出,以及Java高级图像(JAI)。Swing是用来构建Java图形界面的标准API(应用程序接口),一些AWT类由Swing基础而来。它有一套完全的组件从按钮到文件域、表格、树型和文件编辑器。这些组件不依赖于操作系统本地的部件,而是用原始的图形像直线、矩形、文字画出。这种画代表感观插件,它能够模仿本地的感观。SWT是基于Java开发的,它的设计理念是最大化了操作系统的图形构件的API,就是说只要操作系统提供了相应图形的构件,那么SWT只是简单应用JNI技术调用它们,只有那些操作系统中不提供的构件,SWT才自己去做一个模拟的实现。另外SWT还提供对操作系统本地图形用户界面的直接访问,因此,基于SWT的Java应用程序拥有本地的图形用户界面并且可以和本地别的应用程序和部件集成在一起。使用SWT开发包,简单、跨平台、可靠等这些Jaya语言本身所具有的优点正渐渐融合到图形界面的应用程序开发中去。Java语言的另一扇成功之门正在逐渐打开。   2 SWT+GtkFB图形系统的体系结构   2.1 SWT+GtkFB图形系统的体系结构 2.1.1 SWT   SWT处于体系机构的最上层,它与Java内的AwT和Swing同属于设计图形界面所需的高级函数库。而且SWT针对AWT 以及Swing的一些问题作了改善,如今它已发展成一套与作业系统无关的图形元件函数库。在元件的产生方面采用了适当的模拟,在基本的元件方面是采用原有作业系统的,对于较复杂的元件才用仿真的技术。基于SWT的Java应用程序拥有本地的图形用户界面,并且可以和本地别的应用程序,以及部件集成在一起。   SWT是基于Java语言开发出来的高级图形元件库,如图2所示SWT在Java端通过JNI(Java Native InteRFace)技术直接调用native端的GtkFB来使用操作系统的资源,JNI技术使得SWT程序可以与其他语言编写的Native端的代码互相协作,将它们整合在一起;另一方面可使运行在JVM(JAava虚拟机)中的SWT代码调用GtkFB库函数或其他程序;此外利用Invocation API,可将Java虚拟机嵌入到native端的应用中。JNI这个接口是双向的,相当于桥梁和纽带,它将SWT代码和native端的GtkFB代码连接起来。 2.1.2 Gtk库   如图1所示,GTK会用到几个连接库,如基本数据类型用的Glib库,它是由基础类、核心应用支持类、实用功能类、数据类和对象系统类五个部分组成的。   Pango是用于国际化文本的布局和显示的全功能框架。Pango可以处理以非从左到右方向排列的文本,并且可以容易地管理复杂语言,甚至还可以处理根据使用环境而采用不同形式的信函。例如它支持双向文本,用户可以将从左到右的文本和从右到左的文本混合编排;还可有用于确定各种复杂文本(如阿拉伯语和泰米尔语)形状的插件。Pango不仅仅是国际化,而且Pango库在Xft和XRender的支持下能很好地处理抗锯齿字体文本的显示。   Pango还支持各种图形格式如libpng,libjpeg,libtiff和Framebuffer port用的FreeType等。实际上GTK提供gdk-pixbuf,gdk和gtk三个连接库,其中Gdk-pixbuf让我们可做相关的图像工作,gdk是窗口绘图系统的抽象层,framebuffer相关的工作大部分在此完成,而gtk则是高层的应用程序接口。 Atk(Accessibility Toolkit)可访问性工具箱。GTK充分利用ATK使残障人士(如视力低下或行动不便)与GTK应用程序交互成为可能。 2.1.3 GtkFB的工作原理   DirectFB访问图形硬件设备依赖于操作系统提供的内核接口,即帧缓冲设备(FrameBuffer)。FrameBuffer实际上是用一块硬件来做显卡和软件之间的桥梁,Linux的内核将其开放出来,使用户的程序可以通过块内存来存取显卡。例如设定显示分辨率和色彩数、存取显示内存区等。不同的Linux需要提供针对不同显示硬件FrameBuffer的驱动程序,这就是说DirectFB需要运行于FramBuffer之上,然而Linux内核提供了常见芯片的FrameBuffer驱动。   当一个应用程序连接到GtkFB时会调用gtk_init(),如图3所示,此时GtkFB 启动Linux的Framebiffer,设定分辨率和色彩数,接下来打开键盘和鼠标等外设(PDA打开按键和触控屏幕).然后到特定目录去读取字型,最后对窗口和事件管理作初始化操作。GtkFB可以支持8、16、24、32bpp的framebuffer。   为了执行一个特定的图形操作,DirectFB芯片驱动程序将访问图形设备内存映射的I/O端口,并且把命令传递到图形设备卡的加速引擎。实际的硬件加速是完全在用户空间内完成的。   2.2 SWT+GtkFB图形系统的优点   2.2.1 内存消耗小、运行速度快特别适合嵌入式产品   由于GtkFB直接运行在FrameBufer之上,跳过X系统,这样省下了X Server这一部分资源,这使得在内存消耗、运行速度上得到显著提高。另外采用的JNI技术使得程序运行速度、事件的响应有较高的提高,能满足时间要求较为严格的实时应用场合。   2.2.2 系统稳定性好   SWT 的稳定性,关键是源于SWT 的设计理念。SWT最大化了操作系统的图形构件API,就是说只要操作系统提供了相应图形的构件,那么SWT只是应用JNI技术调用它们,只有那些操作系统中不提供的构件,SWT才自己去做一个模拟的实现。可以看出SWT性能上的稳定很大程度上取决于相应操作系统图形构件的稳定性。   2.2.3 易于移植和共享   SWT的API和桌面版完全相同,因而代码可以很容易地在桌面和嵌入式设备之间移植与共享。   2.2.4 小巧可配置   SWT采用了LGPL授权方式,用户可以自由地甚至是鼓励修改源代码使其更加满足用户的需求,很容易根据用户的需求来裁减特定的SWT+GtkFB,依据LGPL许可证,用户需要公布修改的源代码,但用户不必公布自给应用程序的源代码。   2.2.5 易于开发   SWT是基于Java语言开发的,具有平台独立性、面向对象、可移植、安全等Java语言所拥有特点。用户可以很容易的基于SWT提供的Widget(构件)开发出满足自己需要的Widget,而且很容易地使用这些Widget去构建应用程序。   3 SWT+GtkFB图形系统的实现  3.1 前期准备   在Linux编译和安装SWT+GtkFB,首先到http://www.gtk.org/download下载如下的包:pkg-config、glib2.x;atk、pango、DirectFB、gtk+2.x。其次到http://www.eclipse.org/download下载swt.tgr.gz。   下一步就是在/home/XXX/目录下创建SWT 和GTK两个目录并且设置环境变量。如下:   export SWT_HOME=/home/XXX/SWT   export SWT_HOME=/home/XXX/GTK   export PKG_CONFIG_PATH=$GTK_HOME /lib/pkgconfig   export LD_LIBRARY_PATH=$GTK_HOME/lib;$LD_LIBRARY_PATH   此外增加“/home/XXX/GTK/bin”到系统的环境变量PATH下。   3.2 编译和安装Gtk+2.0   3.2.1 编译和安装pkg-config   tar zxvf glib-2.0.6.tar.gz -C $GTK_HOME/src   cd $GTK HOME/src/glib-2.0.6   ./configure --prefix=$GTK_HOME   make make install   3.2.2 编译和安装atk   tar zxvf atk-1.0.1.tar.gz -C $GTK_HOME/src   cd $GTK_HOME/src/atk-1.0.1   ./configure --prefix=$GTK_HOME   make   make install   3.2.3 编译和安装pango、Direct FB、gtk+2.0 、swt-forgtk2.2   步骤类似atk的安装。   4 嵌入式Linux GUI的应用前景展望   嵌入式Linux GUI的应用领域很多,既可以用于家电市场,还可以用于商业市场、工业及自动化市场、国防市场、通讯市场等。例如,在通讯市场,手机、可视电话、机顶盒等可能成为嵌入式Linu.x的运行平台,一个人性化的用户界面是赢得消费者关键因素。因此嵌入式Linux图形系统将担任着更加重要的角色。   未来几年,嵌入式Linux GUI将朝以下方向发展:第一,轻型、占用资源少,不希望建立在庞大累赘的、非常消耗系统资源的操作系统和GUI之上。第二,高性能、高可靠性,特别是工业实时控制系统,对实时性的要求非常高,并且比起嵌入式系统来说,对GUI的要求也更高。第三,可配置,我们必须清楚的意识到,嵌入式系统是一种定制设备,它们对GUI的需求各不相同,有的系统只要求一些图形功能,而有些系统要求完备的GUI支持,因此,GUI也必须是可定制的。

    时间:2011-12-28 关键词: Linux gui 常用的 设计教程

  • 基于ARM嵌入式系统GUI开发研究

    随着嵌入式系统的发展,它在软件和硬件上日趋复杂,对于人机交互的效率的要求也日渐提高,特别是一些复杂的工控设备和消费电子产品。因此,图形用户界面(GUI)就从嵌入式系统的系统程序中被独立了出来。嵌入式GUI发展至今,已经有了许多的种类,具有了强大的功能。嵌入式GUI已经成为一个成功的嵌入式系统不可缺少的组成部分[1]。本文在ARM为核心的嵌入式系统上进行了图形界面的开发,并对Windows界面进行了模拟。 1  ARM处理器 嵌入式系统是将先进的计算机技术、半导体技术和电子技术和各个行业的具体应用相结合后的产物。嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可裁剪,适用于应用系统,对功能、对可靠性、成本、体积、功耗有严格要求的专用计算机系统。它一般由以下几部分组成: 嵌入式微处理器 ;外围硬件设备;嵌入式操作系统。嵌入式系统是将先进的计算机技术、半导体技术和电子技术和各个行业的具体应用相结合后的产物,这一点就决定了它必然是一个技术密集、资金密集、高度分散、不断创新的知识集成系统。所以,介入嵌入式系统行业,必须有一个正确的定位。例如Palm之所以在PDA领域占有70%以上的市场,就是因为其立足于个人电子消费品,着重发展图形界面和多任务管理;而风河的Vxworks之所以在火星车上得以应用,则是因为其高实时性和高可靠性。 特定的应用程序ARM(Advanced RISC Machines)微处理器是采用ARM技术知识产权(IP)核的微处理器,这种ARM核技术是由英国的ARM公司所授权。世界各大半导体生产商从ARM公司购买其设计的ARM微处理器核,根据各自不同的应用领域,加入适当的外围电路,从而形成自己的ARM微处理器芯片进入市场。ARM处理器是一个32位元精简指令集(RISC)处理器架构,其广泛地使用在许多嵌入式系统设计。ARM处理器特点:体积小、低功耗、低成本、高性能;支持Thumb(16位)/ARM(32位)双指令集,能很好的兼容8位/16位器件;大量使用寄存器,指令执行速度更快;大多数数据操作都在寄存器中完成;寻址方式灵活简单,执行效率高;指令长度固定。 2  图形用户界面特征和发展趋势 2.1 图形用户界面的特征 图形用户界面或图形用户接口(Graphical User Interface,GUI)是指采用图形方式显示的计算机操作环境用户接口。与早期计算机使用的命令行界面相比,图形界面对于用户来说更为简便易用。GUI的广泛应用是当今计算机发展的重大成就之一,它极大地方便了非专业用户的使用人们从此不再需要死记硬背大量的命令,取而代之的是可用用通过窗口、菜单、按键等方式来方便地进行操作。而嵌入式GUI具有下面几个方面的基本要求:轻型、占用资源少、高性能、高可靠性、便于移植、可配置等特点。的广泛流行是当今计算机技术的重大成就之一,它极大的方便了非专业用户的使用,人们不再需要死记硬背大量的命令,而可以通过窗口、菜单方便的进行操作。图形用户界面的主要特征如下: 1、WIMP 其中W(Windows)指窗口,指用户或系统的一个工作区域。一个屏幕上可以有多个窗口。I(IcONs)指图形,系形象化的图形标志,易于人们隐喻和理解。M(Menu)指菜单,可供用户选择的功能提示。P(Pointing Devices),指鼠标器等,便于用户直接对屏幕对象进行操作。 2、用户模型 GUI采用了不少Desktop桌面办公的隐喻,是应用者共享一个直观的界面框架。由于人们熟悉办公桌的情况,因而对计算机显示的图形符号的含义容易理解,诸如:文件夹、收件箱、画笔、工作薄、钥匙及时钟等。 3、直接操作 过去的界面不仅需要记忆大量命令,而且需要制定操作对象的位置,如行号、空格数、X及Y的坐标等。采用GUI后,用户可直接对屏幕上的对象进行操作,如拖动、删除、插入以至放大和旋转等。用户执行操作后,屏幕能立即给出反馈信息或结果,因而称为所见即所得(What you see is what you get)。用视、点(鼠标)代替了记、击(键盘),给用户带来了方便。 2.2 图形用户界面的发展趋势 随着虚拟现实、科学计算可视化及多媒体技术的飞速发展,新的人机交互技术不断出现,更加自然的交互方式将逐渐为人们所重视。新一代界面的主要特征可描述如下:以用户为中心、智能化、高带宽、不限制地点、图示编程等。 3  ARM嵌入式系统GUI开发 近年来,嵌入式系统得到了飞速的发展,产品形态多种多样,由于嵌入式产品更加商品化,对图形用户界面(GUI)的要求也越来越高。 3.1  LCD及其驱动 本设计采用2.2英寸TFT液晶屏——TFT6758液晶模块,其工作电压为3.3V,内带白光LED背光灯,可以直接使用8位、16位或18位总线方式与控制器连接(因为液晶模块内部包含了HD66781和HD66783液晶控制驱动器)。在使用液晶屏时需要先添加其相应的驱动程序,点阵液晶显示器TFT6758的驱动芯片为HD66781,门驱动(Gate driver)芯片为 HD66783。 图1  TFT6758液晶模块应用电路 3.2  软件平台的选用 目前在市场上有几种发展成熟、比较有代表性的嵌入式GUI开发软件,如北京飞漫软件公司的MiniGUI、美国Century软件公司的MicroWindows、挪威Troltech公司的Qt/Embedded等,这几种GUI系统各具特色,但大部分需要在嵌入式操作系统上进行移植,这样就一定会增加时间和精力的投入,所以综合考虑各方面的因素后,使用ZLG/GUI作为此次设计的软件平台。 3.3  模拟Windows界面的设计实现 我们经常使用的Windows系统的桌面,便是一个华丽的图形用户界面,所以设计模拟了Windows的桌面的图形界面。 这个界面的设计思想是:在全屏填充一张图片,作为Windows的桌面背景图案。经过计算得到状态栏的坐标值,在液晶显示屏的下方选择绿色和蓝色填充两个矩形,作为状态栏。判断是否有键按下,若没有就继续显示桌面,有键按下就显示开始菜单。显示Windows界面流程如图2所示。模拟Windows界面在LCD上显示如图3所示。   图2 显示Windows界面流程   图3 模拟Windows界面 4 结束语 近年来,随着嵌入式技术的发展,嵌入式系统得到了飞速的发展,嵌入式设备将适用于更广阔的领域,航天、航空、军事、医学,还有与百姓生活息息相关的家电、运输、通信等等,由于嵌入式产品更加商品化,会涉及到方便用户使用的问题,对图形用户界面(GUI)的要求也越来越高,如何开发一个适合于自己硬件条件的GUI系统,成了嵌入式系统开发的一个重要工作内容。本次设计采用ZLG/GUI作为软件平台,对于复杂的应用可以采用MiniGUI等软件作为软件平台。

    时间:2012-01-02 关键词: ARM gui 设计教程

  • 基于MiniGUI的数字加密电话系统GUI设计

    摘要:提出一种以AT91SAM9263处理器为核心芯片、采用嵌入式Linux2.6内核和MiniGUI3.0图形系统的数字加密电话系统GUI的设计与实现方案。采用双缓冲技术与多张图片交替显示的方式解决了MiniGUI的动画抖动问题和屏幕刷新负载过大导致的屏幕抖动问题。 关键词:动画抖动;双缓冲技术;MiniGUI;嵌入式 引言     在需要丰富人机交互信息的嵌入式系统应用中,高精度的动态图像显示非常重要。因此,嵌入式系统对GUI的实时性和稳定性的要求也越来越明显。但是,动态图像的抖动和刷新延迟的问题在嵌入式系统中经常出现,影响系统的显示效果。     国产图形用户界面系统MiniGUI提供完备的多窗口机制和类Win32消息传递机制,便于实现多个进程间的消息传递。而且具有占用内存少、可移植性好等特点,因此在嵌入式领域中被广泛应用。但在实际应用中,笔者发现了两个问题:一是用MiniGUI的animation控件实现时出现动画抖动,二是显示较多图片的窗口刷新时屏幕闪烁,严重影响屏幕的显示效果。为解决以上两个问题,本系统采用MiniGUI的双缓冲技术和多张图片交替显示的方法,并通过实际应用证明了该方法的有效性。 1 数字加密电话系统架构 1.1 硬件系统     数字加密电话硬件系统的芯片采用ATMEL公司的AT91SAM9263处理器。主频为200 MHz,2 MB高速Data Flash、64 MB NAND Flash和64 MB SDRAM。核心板的对外接口包括键盘接口、LCD接口、LED接口、MODEM模块、电话机模块和接口、SD卡接口和USB主从接口等。如图1所示。 1.2 软件系统     操作系统:开放源码的Linux操作系统是开发嵌入式产品的首选。本系统采用开放源码的嵌入式Linux系统。它的内核版本为2.6.22,是基于default_at91sam9263_config配置的。     交叉编译工具链:采用arm-linux-XXX。arm-linux-gcc用于交叉编译源程序,生成执行文件;arm-linux-strip用于去掉执行文件中的调试信息,起到减小执行文件大小的作用。     GUI系统:MiniGUI是国产的一款面向嵌入式系统、跨操作系统的轻量级国产高级窗口系统(Windowing System)和图形用户界面(Graphi-cal User Interface,GUI)支持系统。经过10余年的发展,MiniGUI已经发展成为比较成熟、性能优良且功能丰富的跨操作系统的嵌入式图形界面支持系统。MiniGUI可在Linux/μClinux、eCos、μC/OS-II、VxWorks、pSOS、ThreadX等操作系统以及Win32平台上运行,已广泛应用于手持信息终端、机顶盒、工业控制系统、便携式多媒体播放器等产品中。     MiniGUI支持BMP、GIF、PNG、JPEG、PCX、TGA等常见图像文件和位图、图标、光标等Windows资源文件,支持多字符集和多种字体,库文件较小且可配置。MiniGUI3.0比其之前的版本,在以下几方面有新的发展:     ①主窗口双缓冲技术,可以在自定义缓冲区中获得整个窗口的渲染结果。     ②外观渲染器技术,外观渲染器提供了多种风格的主窗口和控件界面外观,并且应用程序可在几种风格之间动态切换。     ③双向文本显示与输入,增加了对阿拉伯文和希伯来文语言的支持,实现了文本的变形和重排,并提供了阿拉伯文和希伯来文键盘的支持。     ④支持不规则窗口,如圆角矩形、非矩形窗口等。     ⑤增加了组件mGUtilis,该组件为用户提供了一些常用的对话框模板,便于代码复用。     ⑥增加了组件msgplus,该组件是对MiniGUI图形绘制接口的一个扩充和增强,主要提供对二维矢量图形和高级图形算法的支持。     因此,MiniGUI非常适合编写嵌入式图形用户界面应用程序。[!--empirenews.page--] 1.3 用户界面设计     数字加密电话系统需要显示当前的系统状态和具体内容,以此进行系统与用户之间的信息交流,因此对界面的稳定性和实时性要求较高。本系统将整个屏幕分为3个区域,即状态区域、Logo与时间显示区域和主显示区域,如图2所示。状态显示区主要表示当前系统的工作状 态和设备的状态。比如是挂机态还是摘机态,是加密还是非加密态,是否插入U盘,当前的数据传输率为多少等。不同的状态需要用不同的图片来显示。从一个状态过渡到另一个状态,需要用一个动画来表示。主显示区域主要显示表示当前系统的工作情况的动画或文字提示。比如表示普通语音电话的动画、表示正在加密传输的动画,也可以显示其他信息,如系统功能选择界面、选文件界面、日志管理界面等。Logo及时间显示区显示公司的Logo与当前系统时间。对于本系统的界面设计来说,最重要的是各种动画的显示要流畅。 2 实现GUI时存在的两个问题     本系统GUI的实现问题主要是各种图片的显示、动画和选择功能界面的实现。图片的显示方法很简单,因此,在下面只介绍动画和选择功能界面的实现方法及存在的问题。 2.1 动画的实现方法及存在的问题     MiniGUI为实现动画,已提供了animation控件,用animation控件实现动画的过程非常简单:     ①准备动画文件,文件格式应该是GIF格式,GIF格式的动画文件可以用Flash和PhotoShop生成。     ②用函数CreateAnimationFromGIF89aFile()读入GIF文件。     ③用CreateWindow()创建动画显示窗口。     ④用SendMessage()函数控制动画,该函数的第2个参数为ANM_STARTPLAY表示启动动画,参数为ANM_PLAYSTOP表示暂停动画。也可以用函数SendMessage(GetDlgItem(hInitface,IDC_MAINANIMATION),ANM_SETANIMATION,0,(LPARAM)anim)实现更换动画文件。但是,在嵌入式环境下,使用该方法播放动画时,在状态显示区和主显示区内都产生严重的抖动现象。而且屏幕越大抖动就越明显,分辨率为480×640时的抖动现象比240×320时更明显。减少动画的帧数或延长每一帧的播放时间,抖动仍然存在,严重影响屏幕的显示效果。 2.2 功能选择界面的实现及存在的问题     功能选择界面一般由多个图片来组成,各表示不同的系统功能,用上下左右键选择不同的功能,按Enter键运行相应程序,即打开另一个窗口,完成相应功能。当关闭窗口时重新显示功能显示界面。为区别被选中功能和未选中功能,放大或下沉显示当前被选中的功能图片,而前一个被选中功能图片恢复成原来的大小,如图3所示。每次用上下左右键选择功能时和关闭功能窗口时,都要重新刷新背景,并重绘窗口客户区的各个图片。因为MiniGUI不保存被覆盖区域的内容,因此在MSG_PAINT消息中需要重绘的内容较多,重绘图片的常用方法是用FillB-oxWithBitmap()函数填充相应图片区域,但是这种方法加重了屏幕刷新负载,引起屏幕明显地闪烁。 [!--empirenews.page--] 3 关键问题的解决方法 3.1 动画抖动问题的解决     产生动画抖动的主要原因是,用animation控件实现动画时,频繁地产生MSG_PAINT消息,加重了屏幕刷新的请求。MiniGUI通过判断窗口是否含有无效区域来确定是否需要重绘窗口。如果需要重绘就向应用程序发送MSG_PAINT消息。窗口的重绘任务需由应用程序自己完成,因为MiniGUI不保存被覆盖区域的内容。MiniGUI的窗口在响应MSG_PAINT消息的时候进行复杂的图形处理,尤其是在刷新时,对图像的擦除和重写造成了图像颜色的反差。当绘图消息的响应很频繁时,这种反差也就越发明显,于是我们就看到了动画抖动的现象。为了解决动画抖动的问题,系统采用了双缓冲技术和多个图片交替显示的方法。并在实际应用中证明了该方法是行之有效的。双缓冲技术要比直接操作显存速度更快,因此可以解决抖动现象。     采用双缓冲技术实现动画的基本思路是这样的,首先在系统内存中建立一个类似显示内存的内存设备上行文,然后将待显示图片填充到该内存设备上行文中,最后再通过位拷贝方式复制到显示内存中。为了达到动画的效果,将多个图片循环显示,即设定定时器和静态变量,每当定时器触发时,根据静态变量的值显示不同的图片,静态变量由0到MAX循环。实现动画的详细流程如图4所示。定时器的时间间隔和图片的数量可以根据具体情况任意调整。本系统的主显示区动画采用这种方法实现后,动画效果流畅,不再有抖动现象。 3.2 功能选择界面闪烁问题的解决     功能选择界面闪烁的主要原因是屏幕内容过多,刷新负载过大。本系统采用双缓冲技术和MiniGUI.cfg配置文件的设置方法,实现只刷新屏幕的局部,解决了功能选择界面闪烁问题。每次按上下左右键或关闭功能窗口时,用以下3个步骤实现重绘屏幕无效区域(以图3为例)。     ①A区用小图标恢复,用函数StretchBlt(hdcmem,0,0,0,0,hdc,WIN_LEFT,WIN_TOP,WIDTH,HIGHT,(DWORD)0)实现,其中hdcmem是内存设备上下文,是用CreateCompatibleDCEx()函数创建的。该内存设备上行文中已经存有图3下图中的A区域信息(第一次是在窗口的MSG_ CREATE消息中保存的,第二次开始是在第二步骤保存的)。     ②将B的图片区域(小图片)复制到内存设备上下文,用函数StretchBlt(hdc,WIN_LEFT,WIN_TOP,WIDTH,HIGHT,hdcmem,0,0,0,0,(DWORD)0)实现。     ③B区域的图片放大显示,通过函数FillBoxWithBitmap(hdc,WIN_LEFT,WIN_TOP,WIDTH,HIGHT,DESKIMAGE,&bitmap)实现。     其中,WIN_LEFT、WIN_TOP、WIDTH和HIGHT分别表示图片放大显示区域的左、上坐标和宽、高。左、上坐标的定位公式如下:     WIN_LEFT=水平基准坐标+(i%DESKCOLS)×(BLTWIDTH+水平间隔)     WIN_TOP=垂直基准坐标+(i/DESKCOLS)×(BLTHIGHT+垂直间隔)     式中,i表示第几个图片,DESKCOLS表示每一行的图片个数,BLTWIDTH和BLTHIGHT各表示图片区域的宽和高。为了减少屏幕刷新负载,不在MSG_PAINT消息中刷新背景,而是用MiniGUI.cfg配置文件中的bgpicture参数指定背景图,并在指定的目录中存放背景图文件。该参数在MiniGUI的4种渲染器中都有,即在不同的渲染器中,都可以用该方法,无需用代码去实现背景图的刷新。 结语     本文详细地描述了基于MiniGUI的嵌入式系统用户界面关键问题的解决方案,即无抖动动画的实现方案和功能选择界面闪烁问题的解决方案。当需要实现动画,而且动画文件较大时,可以采用双缓冲技术解决动画抖动的问题。但是双缓冲技术需要额外的内存设备上下文,所以简单的动画效果可以用SendMessage(窗口句柄,STM_SETIMAGE,pngmap,0)函数更换图片的方式实现较好。

    时间:2011-08-17 关键词: minigui gui 设计教程

  • uC/GUI在ARM 内核S3C44B0X的移植实例

    uC/GUI是Micrigm 公司推出的用于嵌入式系统的图形用户接口(graphics user interface,GUI)软件包,由于uC/GUI完全以ANSI-C编写,因此它与处理器无关,可以很方便地移植到不同的操作系统和嵌入式微处理器上,并可支持不同尺寸的图形液晶显示器。它采用层次化的设计,功能强大,移植方便,被广泛地应用于嵌入式领域,如PDA、机顶盒以及DVD NCD播放机等。本文详细介绍了uC/GUI在ARM 内核S3C44B0X的移植。实践证明uC/GUI具有良好的实时性和稳定性以及广泛的应用前景。   1、硬件连接与液晶显示原理   本设计使用的硬件采用ARM7开发板,液晶模块为L78C64,它是7.8in 256色STN型LCD显示屏,分辨率为640×480。 LCD控制器外部接口信号的定义及其与LCD模块各信号之间的对应关系如下: (1)VFRAME:LCD控制器与LCD驱动器之间的帧同步信号。该信号负责指出LCD屏新的一帧开始的时间。LCD控制器在一个完整帧显示完成后立即插入一个VFRAME信号,并开始新一帧的显示。该信号与LCD模块的YD信号相对应; (2)VLINE:LCD控制器和LCD驱动器之间的线同步脉冲信号。该信号用于将LCD驱动器水平线(行)移位寄存器的内容传送给LCD屏显示。LCD控制器在整个水平线(整行)数据移入LCD控制器后,插入一个VLINE信号。该信号与LCD模块的LP信号相对应; (3)VCLK:LCD控制器和LCD驱动器之间的像素时钟信号。由LCD控制器送出的数据在VCLK的上升沿处送出,在VCLK的下降沿被LCD驱动器采样。该信号与LCD模块的XCK信号相对应; (4)VM:LCD驱动器的AC信号。VM信号被LCD驱动器用于改变行和列的电压极性,从而控制像素点的显示和熄灭。VM信号可以与每个帧同步,也可以与可变数量的VLINE信号同步; (5)VD3~0 LCD:像素点的数据输入端口。与LCD模块的D3~0相对应: (6)VD7~4 LCD:像素点的数据输入端口。与LCD模块的D7~4相对应。 液晶显示原理:写满整个屏的数据称为1个“帧”数据,YD是帧同步信号,该信号启动LCD屏的新一帧数据。两个YD脉冲之间的时间长度称为帧周期。根据LCD模块的特性,刷新时间为12~14ms,频率为70~80Hz。每一帧包括480个LP脉冲。LP为行(共480行)数据输入锁存信号,也就是行同步脉冲信号。该信号启动LCD屏的新一行数据。XCK为行数据输入信号,也就是每1行中像素点数据传输的时钟信号。每组8位的数据在XCK的下降沿被输入锁存,因此,每1行包括640×3/8个XCK脉冲信号。D0~D7是8位的显示数据输入信号。   2、驱动程序设计   下面分三步完成液晶的初始化。 (1)I/O口的初始化 由于采用S3C44B0X的PC接口和PD接口作为LCD驱动接口,因此,需要设置PC接口工作在第3功能状态和PD接口工作在第2功能状态。 (2)相应控制寄存器的设置方法 S3C44B0X包括一个LCD控制器时序发生器TIMEGEN, 由它来产生VFRAM,VLINE,VCLK和VM 控制时序。这些控制信号由寄存器LCOCON1和LCDCON2进行配置。通过对寄存器种配置项目的设置,TIMEGEN就可以产生适应于各种LCD屏的控制信号了。 VFRAM和VLINE脉冲的产生是通过对LCDCON2寄存器的HOZVAL和LINEVAL进行配置来完成的。每个域都与LCD的尺寸和显示模式有关。 其中,HOZVAL=(显示宽度/VD数据线位数)-1。 在彩色模式下,显示宽度=3×每行的像素点数。 对所选的液晶模块,HOZVAL=(640×3/8)-1;LINEVAL=(显示宽度)-1。 对所选的液晶模块,LlNEVAL=480-1。 VCLK信号的频率可以通过LCDCON1寄存器的CLKVAL域来确定,即 VCLK=MCLK/(CLKVAL×2) LCD控制器的最大VCLK频率为16.5MHz,几乎支持所有已有的LCD驱动器。由于上述关系,CLKVAL的值决定了VCLK的频率。为了确定CLKVAL的值,应该计算一下LCD控制器向VD端口传输数据的速率,以便使VCLK的值大于数据传输的速率。 数据传输速率的公式为: 数据传输速率=HS×VS×FR×MV 其中,HS—LCD的行像素值;VS—LCD的列像素值:FR—帧速率;MV—模式值,这里取8位单扫描,彩色。 对于所选用的液晶模块:HS=640;VS=480;FR=70Hz:MV=3/8。因此,数据传输速率=640×480×70×3/8=8,064,000Hz。 VCLK值应该大于8MHz而小于16MHz,因此,CLKVAL可以取9~15。 (3)完整的液晶初始化程序     C程序  void LCD_Init_Controler(){rLCDCON1=(0)|(2<<5)|(MVAL_USED<<7)|(0x3<<8)|(0x3<<10)|(CLKVAL_COLOR<<12);//disable,8B_SNGL_SCAN,WDLY=8clk,WLH=8clk,rLCDCON2=(LINEVAL)|(HOZVAL_COLOR<<10)|(10<<21);//LINEBLANK=10(without any calculation)rLCDSADDR1= (0x3<<27) | (((U32)frameBuffer256>>22)<<21)|M5D((U32)frameBuffer256>>1);//256-color,LCDBANK,LCDBASEUrLCDSADDR2=M5D((((U32)frameBuffer256+(SCR_XSIZE*LCD_YSIZE))>>1))|(MVAL<<21);rLCDSADDR3= (LCD_XSIZE/2) | (((SCR_XSIZE-LCD_XSIZE)/2)<<9);//The following valuehas to be changed forbetter display.rREDLUT =0xfdb96420;rGREENLUT=0xfdb96420;rBLUELUT=0xfb40;rDITHMODE=0x0;rDP1_2=0xa5a5;rDP4_7=0xba5da65;rDP3_5=0xa5a5f;rDP2_3=0xd6b;rDP5_7=0xeb7b5ed:rDP3_4=0x7dbe;rDP4_5=0x7ebdf;rDP6_7=0x7fdfbfe;rLCDCON1= (1)|(2<<5)|(0<<7)|(0x3<<8)|(0x3<<10)|(4<<12);}      经过以上几步,就完成了液晶的硬件驱动,下面就是移植软件包,调用底层驱动,完成复杂的显示任务。   3、uC/GUI软件包的移植     3.1 uC/GUI特点   (1)支持任何8位、16位和32位的CPU,只要求CPU具有相应的ANSI-C编译器即可; (2)所有硬件接口定义都使用可配置的宏; (3)字符、位图可显示与LCD的任意点,并不限制与字节长度的整数倍数地址; (4)所有程序在长度和速度方面都进行了优化,结构清晰; (5)对于慢速的LCD控制器,可以使用缓冲存储器减少访问时间,提高显示速度。 [!--empirenews.page--]     3.2 uC/GUl移植步骤   在使用uC/GUI时,可以按照以下几个步骤来进行: (1)按照需要,定制uC/GUI; (2)指定硬件设备的地址,编写接口驱动代码; (3)编译、链接、调试例子程序; (4)修改例子程序,并测试增加需要的功能; (5)编写自己的应用程序。   3.3 具体实现   (1)首先介绍uC/GUI的目录结构和基本配置。 uC/GUI主要目录如下: GUI/ConvertMono 使用黑白显示设备时,所要使用的灰度转换函数 GUI/ConvertColor 使用彩色显示设备时,使用的色彩转换函数 GUI/Config 包含了对uC/GUI进行配置的一些文件 GUI/Core uC/GUI核心代码 GUI/Font uC/GUI与字体相关的代码文件 GUI/LCDDriver LCD驱动代码文件 GUI/MemDev 内存设备支持文件代码 GUI/Touch 输入设备支持的文件代码 GUI/Widget uC/GU1支持的控件代码,包括编辑框、列表框、按钮和选择框等 GUI/WM uC/GUI窗口管理部分代码 (2)修改uC/GUI,使之适于移植。 在ADS环境中新建一个工程,将上述gui文件夹下的所有文件加入工程。 将Config文件夹下的3个文件GUIConf.h、 GUITouchConf.h和LCDConf.h加入新工程,如下修改LCDConf.h的内容:     C程序  /*LCDConf.h*/#ifndef LCDCONF_H#define LCDCONF_H#define LCDG4 //lcd颜色数,必须定义,LCDMONO(单色),LCDG4(四级灰度),LCDG16(16级灰度)#define LCD_XSIZE(640) /* LCD水平分辨率 */#define LCD_YSIZE(480) /* LCD垂直分辨率 */#define LCD BITSPERPIXEL(8)#endif /*LCDC0NF_H*//*以下是S3C44B0X LCD控制器的配置*/#include "..incoption.h"#define SCR_XSIZE (640) //视窗屏幕大小#define SCR_YSIZE (480)#define LCD_XSIZE (640) //液晶屏幕大小#define LCD_YSIZE (480)#define M5D(n)((n)&0x1fffff)#define ARRAY_SIZE_G4(SCR_XSIZE/4*SCR_YSIZE)#define HOZVAL (LCD_XSIZE/4-1)#define HOZVAL_COLOR (LCD_XSIZE*3/8-1)#define LINEVAL (LCD_YSIZE-1)#define MVAL (13)#define CLKVAL_G4 (10)#define MVAL_USED 0#endif /*LCDCONF_H */      (3)加载LCD驱动。 LCD驱动程序如前面所述,保存在lcd44b0.c中。出了底层的初始化函数LCD_Init_Controler()以外,还需要做以下修改,这里只提关键部分。 主要进行相关的寄存器配置,以及和GUI的接口程序。这里只提及关键部分。 ① 定义显示缓冲区时使用的char数据类型,它是8bit的: unsigned char Bmp[ARRAY_SIZE_G16];//液晶显示缓冲数组 ② 定义读写缓冲区时使用的数据类型,也是8bit的U8: #define LCD_READ_MEM (Off)*((U8*)(frameBuffer256+(((U32)(Off))))) #define LCD_WRRITE_MEM(Off,data)*((U8*)frameBuffer256+(((U32)(Off)))))=data #define LCD_WRITE_REG(Off,data) ⑧ 定义液晶总线宽度定义位8bit: #ifndef LCD_BUSWIDTH #define LCD_BUSWIDTH(8) #endif ④ 定义字节顺序: #define LCD_SWAP_BYTE_ORDER(0) 至此uC/GUI的移植基本上已经完成了。当然这里只提供了移植的关键部分,更多更完整的移植还需要做不少的工作,如触控屏的移植、键盘鼠标的移植以及中文字体的移植等。详情请参阅uC/GUI手册中Getting Started一章。   4、数据显示程序设计   数据显示程序主要是基于uC/GUI平台的GUI函数库,完成字符、曲线的绘制。与画线相关的GUI函数有: GUI DrawHLine() 原型:void GUI_DrawLine(int x0,int y0,int x1,int y1); 其中,x0、y0、x1、y1分别为UGI坐标系下的起点和终点的横坐标和纵坐标。 GUI DispDec() 原型:void GUI_DispDec(I32 v,U8 Len); 其中,v为要显示的十进制变量值,Len为要显示的数据的位数。   5、总结   本文主要介绍了基于ARM7内核S3C44B0X和L78C64液晶模块硬件平台的uC/GUI的移植,以及在工程上的应用,经过实际应用发现,uC/GUI功能强大,响应迅速,稳定性高,具有广泛的应用前景。

    时间:2011-12-01 关键词: ARM uc gui s3c44b0x 设计教程

  • 一种嵌入式GUI的研究与应用

    引 言 随着半导体技术和信息技术的飞速发展,各式各样的嵌入式系统产品已经渗入到人们生活的每一个角落。小到手机、MP3、MP4、数码相机、机顶盒等产品,大到汽车、数控机床、火箭等产品。嵌入式GUI(Graphical User  Interface)作为嵌入式系统的应用软件,已经成为当今图形用户界面领域的发展焦点。[2] 1  GUI 的概述 GUI以一种以图形化为基础的用户界面,使用统一的图形操作系统,如可移动的视窗、选项与鼠标,作为用户与操作系统之间的中介。GUI最重要的优势在于使用户摆脱了在命令行提示符下与操作系统进行交互的方式,用户可以仅仅通过鼠标点击来实现熟悉程序的操作,而且由于图表、对话框等的引入,使得操作直观形象。GUI已成为一种用户与计算机交互的标准。包括Microsoft的视窗系统、Unix的Motif、Linux的桌面系统GNOME。 在计算机硬件平台下的GUI模型一般如图1所示: uC/GUI是由Micrium公司专门针对嵌入式系统开发的一款图形开发系统。它设计用于为任何使用LCD图形显示的应用提供高效的独立于处理器及 LCD 控制器的图形用户接口,它适用单任务或是多任务系统环境, 并适用于任意 LCD 控制器和 CPU 下任何尺寸的真实显示或虚拟显示。 对于开发uC/GUI图形应用不需要什么目标系统, 大部分的图形应用开发都可以在模拟器下进行; 但是最终的目的是通常还是在目标系统上运行程序。 目标系统(硬件): [1].CPU(8/16/32/64位)。 [2].必要的RAM和ROM 存储。 [3].LCD 显示器(任何类型及分辨率的)。 对于内存的需求取决于你选用的 UCGUI 的功能模块以及你所使用的目标系统上的编译器的效率。 内存的占用量无法估计准确的值, 下面就一些的数值适用于多数的目标系统。   注:①小型系统指不包含窗口管理功能,大型系统指包含窗口管理及各种窗体控件功能。 ②ROM的需求量随着应用程序中使用的字体数目而增长。 2  基于S3C44B0X处理器的嵌入式系统的基本组成 三星公司推出的16/32位RISC处理器S3C44B0X为手持设备和一般应用提供了高性价比和高性能的微控制器解决方案。为了降低成本,同时增强稳定性,S3C44B0X提供了丰富的内置部件,包括:8KB Cache和 内部SRAM,LCD控制器等,其主频可以达到66MHz,速度几乎相当于486CPU,而且扩展了完整丰富的外围设备的接口,图2是典型的系统的框图。    图2   系统框图 采用三星的S3C44B0X开发通用的嵌入式系统,S3C44B0X的运行方式通常有两种:一种是有操作系统的,由于操作系统所占用的空间比较大,所以Flash里面装的是系统引导程序,通常称为Boot Loader,是在系统复位后执行的第一段代码,相当于PC上的BIOS,完成系统硬件的初始化,包括时钟的设置、存储区的映射等,设置堆栈指针,然后跳转到操作系统内核的入口,将系统控制权交给操作系统,在此之后系统的运行和Boot Loader 再无任何关系。Boot Loader独立于操作系统,必须由用户自己设计,它的实现高度依赖于硬件,包括处理器的体系结构、具体型号、硬件电路板的设计。 另一种是无操作系统的,系统的初始化以及主程序都是在Flash内,它与S3C44B0X的Bank0相连,上电复位后系统使程序从0x00000000开始运行。 3  利用uC/GUI开发GUI应用程序的基本方法 由于uC/GUI提供了源代码,因此可以很容易地将它移植到各个平台下,使用时,只要将uC/GUI的软件压缩包解压缩到一个目录下就可以了。 3.1 uC/GUI的结构 uC/GUI的软件体系结构如图3所示。uC/GUI函数库为用户的应用程序提供GUI接口,包含的函数有文本、数值、二维图形、输入设备以及各种窗口对象。其中,输入设备可以是键盘、鼠标或触摸屏;二维图形包括图片、直线、多边形、圆、椭圆、圆弧等;窗口对象包括按钮、编辑框、进度条、复选框等。μC/GUI函数库可以通过GUI_CONf.h文件进行配置,配置的内容包括是否采用内存设备,是否采用窗口管理器,是否支持操作系统、触摸屏、以及配置动态内存的大小等。   图3  uC/GUI的软件体系结构 3.2   利用uC/GUI开发应用程序的步骤 由于uC/GUI提供了源代码,在开发应用程序时,用户可以首先将核心文件、LCD驱动文件和需要的字体文件包含在自己的工程里,然后再根据实际的硬件需要,包含内存设备输入设备控件和窗口管理部分。 具体可以分为以下几步: ⑴按照实际需要,定制自己的uC/GUI开发环境。其中包括对上述目录的筛选,或对目录中文件的筛选。 ⑵指定硬件设备的地址,编写接口驱动代码。这里需要修改LCD_Conf.h文件。 ⑶编译、链接、调试示例程序。 ⑷修改示例程序并测试,增加需要的功能。 ⑸如果准备开发多任务应用,则需要修改GUI_MAXTASK和GUI_OS宏,实现uC/GUI与操作系统的结合。 ⑹编写自己的应用程序。 使用uC/GUI开发应用程序时,目标系统不是必须配备的,因为uC/GUI提供了一个模拟器,用户可以在模拟器上面看到应用程序的执行的结果。所以,对于开发环境,uC/GUI仅要求有一个符合ANSI标准的“C”语言编译器。至于C++编译器,它不是必须的,但是如果用户使用C++语言来编写应用程序,那就需要一个C++编译器。[1] 因此,在Windows系统下只要安装了Microsoft Visual C++就可以运行uC/GUI的模拟器工程(工程名一般为Simulation.dsw),然后将该工程中的Application文件夹清空,加入自己编写的源文件,编译链接就可以看到运行结果。 3.3应用实例 下图是用uC/GUI开发应用程序的一个实例,该程序是显示汽车运行时发动机转速的一个界面。 图4 用户界面图 黑色的背景是这个LCD的窗口区域,大小为640*480。先利用画线函数绘制基本的弧线,再利用填充函数填充相应的背景颜色,最后用一个分片存储设备执行一个指定的绘图函数,在这种情况下,在一段时间内只有一小部分要更新。 STatic void DemoScale(void) { int Cnt; int tDiff, t0 = GUI_GetTime(); PARAM Param;  /* 绘图函数的参数 */ GUI_AUTODEV AutoDev; /* 分片存储设备对象 */ GUI_SetColor(GUI_WHITE); /*设置颜色*/ GUI_SetFont(&GUI_Font8x16);/*设置字体*/ GUI_DispStringHCenterAt(“Scale using GUI_AUTODEV-object”, 160, 0); GUI_AA_EnableHiRes();/* 启动高分辨率用于抗锯齿 */ GUI_AA_SetFactor(MAG); GUI_MEMDEV_CreateAuto(&AutoDev); /* 建立 GUI_AUTODEV 对象 */ /* 显示在一个固定时间上的指针 */ for (Cnt = 0; (tDiff = GUI_GetTime() - t0) < 24000; Cnt++); { /* 获得数值用于显示一个多边形来表示指针 */ Param.Angle = GetAngle(tDiff)* DEG2RAD; GUI_RotatePolygon ( Param.aPoints, aNeedle, countof(aNeedle), Param.Angle); GUI_MEMDEV_DrawAuto(&AutoDev, &Param.AutoDevInfo, &Draw, &Param); } 4  结束语 本文只是简单展示了uC/GUI在开发图形用户界面上的应用,其巨大的应用潜力还有待进一步的研究。相信随着计算机渗透到人类工作和生活的各个方面,以嵌入式系统为核心的后PC时代的到来,uC/GUI的应用前景也将更为广阔。

    时间:2011-12-18 关键词: gui 设计教程

  • μC/GUI在嵌入式智能监控系统中的移植研究与应用

    摘要:为了使智能监控系统具有人机交互功能,以DE2开发板为验证平台,通过编写VGA IP核以及在SoPC Builder搭建硬件环境,移植嵌入式图形界面软件μC/GUI到NiosⅡ嵌入式软件开发环境。实验结果表明,μC/GUI成功移植到NiosⅡ嵌入式开发平台中,可以实现μC/GUI文字显示、绘图以及窗口管理等功能,并可以外接任何具有VGA接口的LCD显示器。 关键词:人机交互;μC/GUI;移植;NiosⅡ 0 引言     人机交互是智能化嵌入式产品一项重要功能,在设计智能监控系统时人机交互需要界面设计软件,常用的图形界面软件有MiniGUI,QT/Embedded,OpenGUI等。Altera公司NiosⅡ已经集成了μC/OS-Ⅱ系统。μC/OS-Ⅱ是一个实时多任务内核,不具有现代操作系统的线程,上述GUI不能方便的运行。     μC/GUI是一个优秀的嵌入式图形用户界面,具有众多的优点。如,代码开源,占用系统资源少,所有的代码均由ANSIC实现,功能强大且易于移植,可以应用于任何的LCD控制和CPU任何尺寸的物理与虚拟显示,非常适合用于资源有限的嵌入式系统中。同时,μC/GUI与μC /OS-Ⅱ都是美国Micrium公司产品,μC/GUI能轻易地在μC/OS-Ⅱ上应用,实现与μC/OS-Ⅱ的无缝结合。     本文在设计具有人机交互功能的基于NiosⅡ的嵌入式智能监控系统时,为实现友好的人机交互和更加方便的显示,将μC/GUI移植到NiosⅡ嵌入式平台,系统采用通用液晶显示器显示,具有更加广泛的通用性。 1 硬件系统设计    本系统设计采用的硬件平台是Altera公司生产的DE2开发板,使用软件是QuartusⅡ9.0,FPGA芯片是EP2C35F672C6,通过VGA接口连接液晶显示器显示,利用QuartusⅡ软件的SOPC Builder搭建的系统设计如图1所示。其中,PS/2 IP核是采用AItera公司大学计划中的IP核,SDR AM为系统运行时的内存。在系统中运行交互界面时,通过PIO传输系统设置的参数,控制硬件实现的视频的采集、显示与相关视频分析算法的实现。     VGA IP核采用突发传输模式,这样可以提高从端口的数据吞吐量,在主端口一次多个数据单元的时候,可以达到极高的效率。在本设计的VGA IP核设计一次传输10个数据单元,额外的burstcount信号为4位。 2 μC/GUI移植     本系统采用μC/GUI 3.98版本进行移植,在移植μC/GUI之前,有必要熟悉μC/GUI的软件体系结构与文件结构,μC/GUI的软件体系结构如图2所示。 [!--empirenews.page--]     μC/GUI函数库为用户程序提供GUI接口,包含的函数有文本、数值、二维图形、输入设备以及各种窗口对象。其中,输入设备可以是鼠标、键盘或触摸屏;二维图形包括图片、直线、多边形、圆、椭圆、圆弧等;窗口对象包括按钮、编辑框、进度条、复选框等。μC/GUI由库 函数目录GUI和配置文件目录Config两个目录组成,表1是μC/GUI目录结构,带星号的都是可选项。     其中Config目录下包括3个文件分别是LCDConf.h、GUIConf.h和GUITouchConf.h,3个文件分别用来配置LCD驱动、μC/GUI配置、触摸屏的配置。μC/GUI移植主要就是对Config文件以及LCDDriver的移植,针对不同的平台做相应的修改。 2.1 配置文件的移植     GUIConf.h是μC/GUI的基本属性配置文件,有很多开关可以配置,配置的内容包括是否采用内存设备,是否采用窗口管理器,是否支持操作系统、触摸屏,以及配置动态内存的大小等。具体可以参考μC/GUI的用户手册,这里只需配置几个必要的参数如下: [!--empirenews.page--] 2.2 LCD驱动文件的移植     由于采用VGA显示,根据LCDConf.h对LCD_CONTROLLER的配置,在LCD驱动文件目录下选择LCDDummy.c,删除其他无关的驱动文件,LCD驱动文件负责把μC/GUI的各种函数解释成LCDconf.h文件中定义的液晶接口函数,这个文件与具体的硬件连接无关,LCD驱动在SDRAM开辟帧缓冲以及往VGAIP中写入数据,在函数LCD_Controller_Init()完成,开辟显示缓冲区由framebuffer=(aIt_u32*)alt_uncached_malloc(LCD _XSIZE*LCD_YSIZE*LCD_BITSPERPIXEL/2)实现。同时编写void LCD_L0_SetPixelIndex(int x,int y,int PixelIndex)和unsigned int LCD_L0_GetPixelIndex(int x,int y)这2个函数,分别是设置一个像素和获取一个像素的颜色,后面很多操作如画点、线、圆等都需要调用这2个函数。 2.3 接口函数移植     由于支持μC/OS-Ⅱ操作系统,所以要对GUI_X_μCOS.c文件进行修改,GUI_X_μCOs.c定义了GUI与RTOS的接口函数,使之能与μC/OS-Ⅱ操作系统实现无缝衔接,要增加系统延时函数OSTimeDly(1),void GUI_X_Execldle(void){OS_X_Dday(1);}改为:     到此,μC/GUI移植需要修改的代码部分已经全部完成。 3 μC/GUI应用程序开发实例     根据平台修改完配置、驱动文件和接口函数之后,在NiosⅡ9.0 IDE建立一个新的工程,选择工程操作系统为μC/OS-Ⅱ,将已经修改好的Config和GUI文件夹以及GUI_X_μCOS.c拷贝到建立的工程目录下,可以根据实际需求,删掉一些不需要的功能文件,减少编译时间以及编程生成的执行文件的大小。根据需求编写相应的应用程序,要使PS/2IP核正确使用,在应用程序中要用要alt_up_ps2_open_dev(“/  dev/ps2”),开启PS/2 IP核,同时要正确显示图形界面在显示界面代码之前要调用GUI_Init()函数,它的功能是初始化GUI,同时初始化LCD控制器与显示缓冲区。Nios II IDE编译器成功编译工程还要为移植的文件添加相应的路径,在include路径要包括Config、GUI/Core,GUI/Widget和GUI/WM,编译完成之后的工程目录如图3所示。成功编译之后将程序下载到DE2开发平台,程序运行嵌入式智能监控系统交互界面,运行画面如图4所示。     交互界面显示了系统标志,按键、窗口以及键盘,每个按键代表一个功能,按键按下,弹出参数输入窗口,可以在键盘输入相关的参数通过PIO传输到硬件模块。 4 结语     本文详细介绍了μC/GUI在NiosⅡ嵌入式系统中的移植过程,包括从硬件平台的搭建到μC/GUI配置文件、驱动文件和接口函数的修改,采用自己编写的VGA显示IP核,使系统可使用任何通用的液晶显示器,与其他很多专用的LCD驱动而言,本系统具有很强的通用性。结果表明,μC/GUI功能强大,易于移植,占用系统资源少,移植过程有很多可选功能,可以针对不同的需求,非常适用于资源有限的嵌入式系统中。     同时μC/GUI还提供了仿真器以及位图转换工具,有助于我们应用程序的开发,在开发的过程中应用程序可以在仿真器中完成而不必每次都在硬件平台运行验证。μC/GUI对鼠标、键盘以及触摸屏等的支持,将使基于NiosⅡ的智能监控系统可以完全集成为监视器中的一个功能模块,具有很好应用前景与研究意义。

    时间:2012-02-06 关键词: gui 设计教程

  • 实现μC/GUI在便携式医疗监护仪上的移植

    便携式医疗监护仪已成为人们日常生活中不可缺少的一部分。便携式设备是由硬件与软件紧凑组合的一个单元模块,是一种体积小、智能化程度高、功能全、使用灵活、操作方便的便携机,适合家庭使用、外出携带等用途。为了使便携式心电监护仪实现友好的人机交互和更加方便的显示,这里提出一种GUI界面系统设计,就是在基于NiosⅡ处理器的嵌入式平台上实现μC/GUI的移植,使之实现系统功能。 1 μC/GUI的系统移植 1.1 μC/GUI简介及可移植性分析 μC/GUI是Micrium公司开发的通用的嵌入式图形用户界面软件,其中图形用户接口GUI(Graphical User Interface)。该界面软件被设计用于为任何使用一个图形LCD的应用提供一个有效的不依赖于处理器和LCD控制器的图形用户接口。它能工作于单任务或多任务的系统环境下。μC/GUI适用于使用任何LCD控制器和CPU的任何尺寸的物理和虚拟显示,具有源代码开放及模块化设计的特点。 μC/GUI的代码全部用ANSI的C语言编写的,具有很强的移植性。由于μC/GUI采用分层结构,即具有驱动接口层和应用层,因此可方便地移植到各种 CPU下使用。μC/GUI对各类图像LCD显示器具有良好的支持,并且有常见的2D图形库和窗口管理功能,而且消耗较少的系统资源,占用RAM和ROM 的空间很小。在典型的应用中,μC/GUI需要的资源如表1所示。由表1可见,运行μC/GUI需要的系统资源不是很多,并支持几乎所有类型的CPU与大多数的LCD模块,μC/GUI的源代码规模适中,移植过程中可将不需要的代码进行剔除,而且结构层次清晰,因此适合用于嵌入式系统中。 1.2 μC/GUI移植原理 嵌入式用户图形界面系统μC/GUI与嵌入式实时操作系统μC/OS-Ⅱ都是美国Micrium公司产品,μC/GUI能更轻易地在 μC/OS-Ⅱ上应用,实现与μC/0S-Ⅱ的无缝结合。在NiosⅡ嵌入式系统中,Altera公司已经将μC/OS-Ⅱ操作系统移植成功并且提供使用,所做的工作是将μC/GUI移植到NiosⅡ嵌入式平台之上,使其能与μC/OS-Ⅱ操作系统结合使用,采用μC/GUI 3.98版本的源代码进行移植。 μC/GUI的软件体系结构如图1所示,μC/GUI函数库为用户程序提供GUI接口,包含的函数有文本、数值、二维图形、输入设备以及各种窗口对象。其中,输入设备可以是键盘、鼠标或触摸屏;二维图形包括图片、直线、多边形、圆、椭圆、圆弧等;窗口对象包括按钮、编辑框、进度条、复选框等。 μC/GUI函数库可以通过GUIConf.h文件进行配置,包括内存设备,窗口管理器,支持操作系统、触摸屏,以及配置动态内存的大小等。在移植中,需要根据系统需要以外设所支持的功能对GUIConf.h文件进行配置。 在LCDConf.h文件中定义了与硬件有关的各种属性,如液晶的大小、颜色以及与液晶的接口函数。而LCD驱动文件则负责把μC/GUI的各种函数解释成LCDConf.h文件定义的液晶接口函数,这个文件与具体的硬件连接无关。在移植时,需要对LCDConf.h文件进行配置,并针对LCD控制器编写相应的LCD驱动文件。 2 μC/GUI在NiOSⅡ上的移植设计 2.1 TFT LCD IP核结构 μC/GUI的移植是基于IP核的移植,编写TFT LCD控制器,所以移植时,在底层配置文件,参数的配置要和TFT LCDIP的相关参数相匹配,否则不可能移植成功,该IP核的结构如图2所示。 液晶屏采用台湾统宝公司的TRDB_LCM 3.6寸屏,该屏的分辨率是320x240,支持24位色,也就是RGB888模式,但是由于Avalon总线支持传输数据宽度的差异,因此只用16位色,即RGB为565的模式。由于DE2-70有2个32 MB的SDRAM,所以拿使用其中一块作为数据的存储器,Nio-sⅡ处理器将图像数据写入该SDRAM中,在NiosⅡIDE中用软件控制缓冲器的开启,当开启缓冲器之后,该BUFFER会源源不断地读取SDRAM中的数据,为避免读数据和NiosⅡ处理器向其中写入数据时发生冲突,Avalon总线自动在二者之间加入了一个Arbitrator仲裁模块来决定执行哪个操作。 配置LCD采用3线串行总线配置LCD,缓冲器以Avalon存储器映像主机的方式从SDRAM中读取数据,然后以Avalon Streaming Soume的方式把这些数据传送到LCD控制器上,LCD控制器是以Avalon Streaming Sink的方式接收从缓冲器传来的数据,LCD控制器生成时序,在适当时候将数据送出到TFT LCD屏上显示。 2.2 移植过程 2. 2.1 μC/GUI的文件组织结构 μC/GUI是以ANSI C源码包的形式提供的。源码包由配置文件目录(Config)和库函数目录(GUI)2个文件目录组成。在Config目录中包含了LCDConf.h、GUITouchConf.h、GUIConf.h 3个配置文件,这3个文件分别用于LCD底层接口的配置、触摸屏底层接口的配置以及μC/GUI自身的配置。在GUI目录中的库函数文件按照不同功能又分成若干子目录如图3所示,各子目录所实现的功能如表2所示。 [!--empirenews.page--]     2.2.2 移植过程 首先建立一个硬件系统,采用Altera公司的QuartusⅡ9.0版本的配套软件,硬件系统在QuartusⅡ集成的 SOPCBuilder系统开发工具中建立,添加NiosⅡ处理、JTAG调试模块、添加定时器SDRAM控制器、BUFFER IP、TFT LCD IP以及其他部分组件,最后生成一个硬件系统。然后在NiosⅡIDE环境下针对该系统建立一个TFT LCD软件工程,并且将μC/GUI有关的源代码拷贝到工程目录下,修改LCDConf.h、GUIConf. h、LCDLin32.c以及GUI_X_uCOS.c文件,使之与LCD控制相匹配,在该系统中,LCD采用16位数据总线,而CPU是32位的 NiosⅡ软核处理器,先查看一下μC/GUI所支持的数据宽度信息,其数据宽度和NiosⅡ处理器所支持的宽度基本吻合,只要在改动代码时注意就可以。以下是具体的代码实现情况: 因为这里是基于TFT LCD IP核的移植,所以要定义LCD的读写函数,即LCD_READ_MEM(Off)和LCD_WRITE_MEM(Off,data)以及显示缓存区的起始位置,读写函数中的Off和data都是32位的无符号数,而操作函数IORD_32DIRECT()以及IOWR_32DIRECT()都是一次执行 32位数的操作,刚好和NiosⅡ处理器的数据宽度相匹配。由于支持μC/OS-Ⅱ操作系统,所以要对GUI_X_uCOS.c文件进行修改,增加系统延时函数OSTimeDly(1),使之能与μC/OSⅡ操作系统实现无缝衔接,以及3个子函数,void GUI_X_Log(const char*s){GUI_USE_PARA (s);};void GUI_X_Warn(const char*s){GUI_USE_PARA(s);};void GUI_X_ErrorOut(const char*s){ GUI_USE_PARA(s);};LCDLin32.e是对应3200型号控制器的驱动文件,由于在LCDConf.h中已经对用到的参量进行设置,所以无需修改,剩下的工作就是把不用的文件进行剔除,以减少编译时产生多余的代码量。 3 移植验证 在NiosⅡIDE环境下修改配置文件以及驱动文件,然后编译该系统,系统编译成功,编译成功之后还有MICRIUM公司的联系方式,这个是提醒用户该系列软件如果要用于商业目的是需要买license的,用于研究目的是免费的。 图片验证是采用μC/GUI自带的位图转换工具uC-GUI-BitmapConvert.exe,该工具可以将.bmp格式图片转换成指定的C语言数组的形式保存,例如将兰博基尼跑车标志的图片转换成RGB565的格式进行保存,加入工程,编译工程,然后下载验证,如图4所示。窗口管理组件验证采用代码包中自带的一个测试代码,其效果如图5所示。实验结果表明,移植是成功的。 4 结论 本文介绍了μC/GUI界面系统,以及NiosⅡ嵌入式系统,详细介绍了移植的过程,以及最终实现移植。实验结果表明,在嵌入式系统中使用μC/GUI进行人机界面的开发,不但移植简单、使用灵活,而且功能强大,稳定高效,大大降低了在嵌入式系统中开发图形人机界面的复杂程度,而且 μC/GUI还提供了几个非常实用的工具软件,其中包括一个仿真器,它使得在进行移植工作的同时,就可以在仿真器上进行软件界面部分的程序编写,加快了整个系统的开发进度。还有位图转换工具,可以轻松地将图片转换成C语言数组的形式保存,方便界面开发。μC /GUI还支持其他PS2鼠标、PS2键盘、触摸屏,包含丰富的绘图库、动画显示优化、还可以自己加入中文字体,通过使用μC/GUI的各项功能,相信可以在嵌入式系统中开发出功能强大的人机界面,而且在嵌入式系统中有很好的应用前景。

    时间:2012-02-10 关键词: gui 设计教程

  • 基于嵌入式linux系统的GUI方案设计

    嵌入式linux操作系统的快速发展,迫切需求一种简洁的人机交互界面,为此,本文介绍了如何在FrameBuffer基础上设计自己的嵌入式GUI的简单方法。 1 显示原理 1.1 颜色表示 颜色是所有绘图操作的基础。16位的LCD屏一般需要2个字节来表示。16位RGB格式一般可分为RGB565与RGB5551两种格式。其中RGB565格式如表1所列,而其RGB5551格式如表2所列。表中的R为红色分量,G为绿色分量,B为蓝色分量。 由于颜色采用的是RGB565规则。因此。基本颜色,即红色、绿色、蓝色按照RGB565规则可分别为0xf800、0x07e0、Ox001f。由此可见,如果用十六进制直接表示颜色会非常不便。目前,普遍为软件工程师所接受的颜色表示方式为24位的RGB,其中R、G、B三个分量各占用一个字节,范围是0~255。因此,应该为MIS软件系统提供一个从24位RGB转化为16RGB的接口。该接口用宏来实现的具体方式如下: #define RGB(r,g,b)  (((r>>3)<<11)∣((g>>2)<<5)∣(b>>3)) 1.2 画点操作 图形设备接口的最基本操作为画点,任何其它绘图函数都是基于画点来完成的。其原理是以屏的左上角第一个像素点为(0,0)点,向右为x轴,向下为y轴建立坐标系,只要提供某点的横坐标x,纵坐标y和颜色值,就可以通过一定的算法找到(x,y)所表示的地址,然后将该地址上的2个字节替换为指定的颜色值。例如有一块640×480×16的LCD,像素的首地址为0x40000000,那么,其中的第2行、第3列的像素位置如图1所示。 如果要把第2行、第3列的像素由原来的白色(0xfff)变为黑色(0x0000)。那么,就可以根据下面的寻址方式找到地址: 最终地址=首地址+y×2×屏的宽度+x×2 其中,首地址表示第1行第1列像素所对应的地址。由上式,该点的地址=0x40000000+2×2×0x280+3×2=0x40000A06。那么0x40000A06地址对应的数据应为十六位颜色的低字节部分,而0x40000A07地址对应的数据应为十六位颜色的高字节部分。 例如,画点函数可用下面的代码来实现: 其中m_pScreen_Addr是屏的首地址,m_nSereen_Width和m_nScreen_Height则分别为屏宽和屏高。这样,就可以在画点的基础上根据Bresenham算法延伸出各种各样的基本绘图操作来,比如画直线、画矩形和画圆等。 2 FrameBuffer接口 FrameBuffer是出现在2.2.xx内核当中的一种驱动程序接口。Linux抽象出FrameBuffer这个设备可供用户态进程实现直接写屏。FrameBuffer机制模仿显卡的功能是将显卡硬件结构抽象掉,然后通过FrameBuffer的读写直接对显存进行操作。用户可以将FrameBuffer看成是显示内存的一个映像。在将其映射到进程地址空间之后,就可以直接进行读写操作,而且写操作还可以立即反映在屏幕上。这种操作是抽象的、统一的。用户不必关心物理显存的位置和换页机制等具体细节,而这些都可由FrameBuffer设备驱动来完成。 Linux采用虚拟内存技术,系统中的所有进程之间以虚拟方式共享内存。对每个进程来说,它们好像都可以访问整个系统的所有物理内存。更重要的是,即使单独一个进程,它拥有的地址空间也可以远远大于系统物理内存。在地址空间中,进程有权访问虚拟内存地址区间(比如08048000~0804c000)。这些可被访问的合法地址区间叫做内存区域(memory area)。通过内核,进程可以给自己的地址空间动态地添加或减少内存区域,而进程只能访问有效范围内的内存地址。每个内存区域也具有相应进程必须遵循的特定访问属性,如只读、只写、可执行等属性。如果一个进程访问了不在有效范围中的地址,或以不正确的方式访问了有效地址,那么,内核将会终止该进程,并返回“段错误”信息。 在应用程序中,一般将FrameBuffer设备映射到进程地址空间,比如下面的程序就可打开/dev/ib0设备,并通过mmap系统调用来进行地址映射,随后用memset将屏幕清空。Struct fb_var_screen-info记录了帧缓冲设备和指定显示模式的可修改信息,包括显示屏幕的分辨率、每个像素的比特数和一些时序变量。实现以上过程的函数代码如下: [!--empirenews.page--] 此外,FrameBuffer设备还提供了若干ioctl命令,通过这些命令可以获得显示设备的一些固定信息(比如显示内存大小)以及与显示模式相关的可变信息(比如分辨率、象素结构、扫描线的字节宽度),同时可获得伪彩色模式下的调色板信息等。 3 GUI系统的自主开发 嵌入式GUI的总体设计思想是把所有操作都由对象和消息驱动,通过对现有GUI的分析来对多种嵌入式应用系统根据GUI的要求进行总结,然后抽象出各种组件类。嵌入式GUI的所有组件和数据都被设计成对象,组件对象通过消息来通信。嵌入式GUI在消息驱动下可形成整体并构成系统。其整体框架和体系结构如图2所示。 系统中的所有消息节点将构成空闲队列和消息队列,其中消息队列存放当前EGUI系统中没有处理的消息。消息队列由消息管理器进行操作和管理。图2中的输入设备抽象层、操作系统抽象层和组件对象集合都是消息发生器,它们都会产生EGUI消息。调用消息管理器的操作可将生成的消息放入到消息队列中。消息管理器用于管理消息队列和空闲队列,当有消息产生时,消息管理器将执行消息入队PUSH ()操作,其处理过程是先从空闲队列中摘下一个节点,形成一个消息节点,再将它挂到消息队列的队尾。桌面对象管理器负责分发消息,它可通过调用消息管理器的出队操作POP()来取得待处理的消息,处理过程是将消息队列的第一个消息节点摘下,并取得该消息节点的信息,然后将该消息节点挂到空闲队列的队尾。桌面对象管理器取得消息后,将按照一定的策略对取得的消息进行分发,并让接收该消息的组件对象中的消息处理函数来处理该消息。分发消息时,如果消息指定了接收对象,则将消息路由到接收对象;而非键盘的系统消息。将被路由到桌面对象管理器的第一个子对象;对于用户定义的消息,系统会将其路由到指定的对象。而组件对象处理消息时,如果处理操作要改变屏幕数据,组件对象将调用绘图操作Draw重绘自己的外观。整个系统就是这样不断地产生消息、分发消息、处理消息,从而形成一个无限循环,同时驱动EGUI运行。 4 结束语 针对当前嵌入式GUI的特点,本文给出了可支持汉字显示、键盘输入的多线程嵌入式GUI系统的设计方法。该方法设计的系统采用窗口模式,而且便于操作,同时具有可视化界面、操作灵活、资源占用少等优点,并可支持JPG格式的图像文件。

    时间:2012-02-29 关键词: Linux gui 于嵌入 方案设 设计教程

  • 基于Linux的嵌入式POS的GUI及数据库研究

    POS(PointofSale)是目前各商场、饭店、加油站等广泛提供的刷卡消费业务的辅助工具,位于商场、加油站等地的POS机将获得的用户*的数据(卡号、业务资料等)通过通信线路传给*服务处理系统上,经过处理的信息返回到POS机,从而完成用户的刷卡消费业务。为了实现上述数据交换过程,在POS机与银行主机之间必须进行数据通信。 目前使用最广泛的POS机接入方式是有线接入方式,而有线接入方式主要有两种:一是基于电话网的点到点拨号接入方式和基于DDN的专线接入方式。无线POS机是目前POS机行业的一项新技术,移动性强,平均交易时间短,并能随身携带。目前在全国各大商场和超市内随处可见POS刷卡机,但它们大多都是通过电话线联网进行通信,移动性差,不灵活,限制了业务发展。无线POS机成功的解决了这一难题,它通过一个POS和无线调制解调器的一体机在GPRS/CDMA网上联网传输信息。 1 Linux下的图形用户开发工具Q t Qt是Trolltech(挪威)公司的产品。Qt是一个多平台的C++图形用户界面应用程序框架,它能给用户提供精美的图形用户界面所需要的所有元素,而 且它是基于一种面向对象的思想,所以用户对其对象的扩展是相当容易的,并且它还支持真正的组件编程。 在一台装有Linux操作系统的机器上建立Qt/Embeded开发环境:首先需要拥有三个软件安装包: tmake工具安装包,Qt/Embeded安装包,Qt的X11版安装包。 Qt包含了许多支持嵌入式系统开发的工具,其中两个最实用的工具是qmake和Qtdesigner(图形设计器)。Qt中有三个主要的基类:QObject、QapplicaTION和QW idget。 在Qt中编程,利用Signal和Slot进行对象之间的通信是Qt的主要特征。它与W indows中的消息机制非常类似,但是Signal和Slot机制真正实现了一种消息的封装。当对象的状态改变时,发出Signa,l通知所有的Slot接受Signa,l尽管它不知道哪些函数是Slot。一个Signal可以发给多个Slo,t Slot也可以接收多个Signal。Slot除了可以接收Signal以外,与其他的成员函数没有区别。这种机制比使用回调函数要灵活,但是会减慢程序的运行速度。不过在现在高速CPU的面前,这种损失是无足轻重的,而且它还能保证程序的简明性和灵活性,非常便利。 QT支持包括Unix、Linux、W indows在内的多种操作系统平台。Linux下常用的KDE桌面环境就是基于QT编写的。QT使用了Unicode作为内部编码,可以同时支持多种编码。目前的版本对国际化标准支持非常完备,这就为本地化提供了可能[4]。 2 小型嵌入式数据库M ySQL /SQLite SQLite作为一个嵌入式的数据库,主要的是程序小(200多K),速度快,支持ANSISQL-92的大部分标准功能。SQLite使用文件作为数据库,查询出的所有记录都放在内存中,它的sql句法比较简单易用,支持的类型也比较全。字符串和blob类型可以支持4GB的长度。它还支持事务处理。在单用户情况下,它的速度是最快的。多用户下,速度不及别的数据库。 特点:①支持符合acid(原子性,一致性,隔离性,持久性)特性的事务处理;②0配置,不需要任何安装和管理;③符合SQL92的绝大多数标准;④完整的数据库只存储在单个磁盘文件当中;⑤数据库文件可以被不同的机器共享,并与字节序无关;⑥string和BLOB的大小只受到可用内存的限制;⑦总共不到30000行代码。代码空间不到250K;⑧比现在的C/S结构的大部分数据库要快;⑨不依赖于任何其他的库;⑩支持数据库大小可以达到2的41次方,即2个TB。 SQLite的弱点:①没有专有的安全措施,数据库是一个文件;②没有内嵌的压缩、解压机制,数据库文件看上去太大。 MySQL是SQL数据库管理系统,MySQL是开源的,开源意味着任何人都可以使用和修改该软件,任何人都可以从Internet上下载和使用MySQL而不需要支付任何费用。MySQL服务器工作在客户/服务器或嵌入系统中,MySQL数据库服务器是一个客户/服务器系统,它由多线程SQL服务器组成,支持不同的后端、多个不同的客户程序和库、管理工具和广泛的应用程序接口(APIs)。 3 POS系统的硬件配置 POS系统硬件配置,见图1所示。     4 本POS系统介绍 由于我们使用的是Red hat9自带的Qtdesigner,由于是处于研究阶段,而且是免费的,所以暂时采用此软件.此软件没有集成开发环境(IDE),我们采用Qt的Qt designer画出基本的功能,然后由KDevelop修改添加源代码,通过Qt自带的uic(user inteRFace compiler)工具将. ui编译成. cpp和. h文件,最后通过修改makefile,达到我们编译此界面的目的。 (1)需要配置unixODBC,把unixODBC放到/usr/local下,解压缩,然后运行. /configure,其中需要一些环境变量参数的设置,系统生成一些makefile文件,运行make将unixODBC编译,然后make install安装unix-ODBC,即unixODBC安装好了。 (2)配置ODBC,选择数据库及其驱动。 (3)将Qt连接上数据库,完成连接。 5 开发流程 系统开发流程见图2所示。     6 具体介绍 本系统针对商场或专卖店而设计,系统的核心功能模块是主控模块,主要是系统初始化,与通信模块,数据库,条码扫描,键盘,RFID接口,显示器及打印机等模块的连接。另外系统预留,与银联卡及会员卡端口,以备系统扩展之用。 系统采用消息队列机制, 系统始终维持两个数据库的运行,主服务器的中央数据库和本地单机的小型数据库。 (1)通信模块:上传:主控模块的响应信息,出错信息,日志信息,交易信息,数据库响应,删除日志响应。下发:控制信息,查询日志,删除日志,查询,修改,删除数据库信息。     其中的主要消息有:①上传交易信息成功,上传交易信息失败;②本地数据库中无该商品;③键盘消息的处理,主要是按键处理;④写日志成功,写日志失败;⑤来自服务器的控制消息:删除日志,查询当前机器的工作状态,日志打包发送至服务器,本地pos机重启,关机等;⑥接受条码信息;⑦如果本地数据库无该商品,向服务器数据库发送查询信息。 (2)数据库SQLite说明:①SQLite编译、安装;②SQLiteODBC编译、安装。这个要配置SQLite源代码的目录。如果出现找不到SQLite的情况,在Makefile文件中加上路径;③建立SQLite中的一个数据库。SQLite文件夹下有个demo文件,或者参照Readme直接使用SQL语言生成;④系统ODBC配置。在Linux中将刚刚做好的数据库配置为系统数据源,即让QT能找到;⑤QT中使用数据显示组件,选择上述的数据源,然后组件就可以自动显示数据库中的数据了。Server端采用MSQL/SQLite+Linux; Client端采用MSQL/SQLite+uCLinux;显示通过串口实现。 (3)数据库设计: Server: ①product PNo  Name  DescripTIon  InstockPrice TotalNumLeftNum ②sale ONo Total Date ③order ONo PNo Saleprice Number Client:①product PNo NAME Saleprice ②sale ONo Total Date ③order ONo PNo Saleprice Number 使用jdbc测定了sqlite3插入数据的效率,使用整体事务与不使用整体事务,差别明显。cpu: 1G,内存: 512MB使用整体事务: 1000000条记录,需要93s。使用逐个插入提交事务: 1 min只能处理20条记录。

    时间:2012-06-25 关键词: Linux gui pos 设计教程

  • 基于MATLAB GUI的钻井工具姿态采集

    0引 言 在石油钻井中,准确测量井眼姿态是进行井眼轨迹控制的前提。为此,本文充分结合单片机和MATLAB的优点,基于事件驱动的通信机制,提出了一种MATLAB环境下基于GUI的PC与片上系统C8051F060实时串行通信的可视化数据处理方法,并实现了对井眼姿态的监测。该方法极大地简化了开发流程,提高了系统开发效率。更重要的是MATLAB的运算能力,为数据处理提供了保障。 1 系统介绍 在本系统中,上位机是PC,下位机采用silabs公司推出的高速片上系统(SoC)C8051F060,使用三轴加速度计来敏感井眼姿态的变化。三轴加速度计两两正交,输出正方向满足右手螺旋法则,将三轴加速度的输出值通过坐标间的相互转换,利用三角关系式即可得到当前井眼空间姿态。由于PC串口与SoC的UART使用的是不同的电压标准,所以两者间通过电压转换芯片sp3223相连。三轴加速度敏感到的姿态信号经过调理电路和多路开关后,被SoC内部的A/D采样,采集得到的数据存储到片外存储器。数据的存储设备采用三星公司生产的超大容量存储器K9K8G08U0M,满足了系统长时间采集存储的需要。 借助GUI开发的上位机软件通过串口实现与下位机间的命令及数据传输,并对下位机采集的数据进行处理。 2硬件系统 C8051060是完全集成的混合信号片上系统型MCU,其内部CIP-51内核采用流水线结构,指令执行速度可达25 MIPS。使用如此高性能的单片机使得系统硬件电路设计大为简化,单片机的UART、串口通过电压转换模块SP3223与PC进行通信,而C8051060的双串口为多系统的级联提供了方便。数据采集功能由其内部的ADC完成,采集的数据通过口线存储到片外的大容量存储器K9K8G08U0M。 系统硬件框图如图1所示,其中实线为数据流,虚线为控制流。系统工作时,由上位机通过命令来控制下位机进行相应的操作。进行数据采集时,单片机控制电源给传感器供电。各路信号经过各自的调理电路后被送入多路开关。单片机通过控制多路开关来选择所要采样的信号,并将其送入SoC内置的ADC进行采样。采样值被存储后等待与上位机的通信。     3下位机软件 下位机SoC接收到PC的下发消息后,通过串口中断程序转入相应的子程序,执行相应操作,最后返回一个握手信号做为状态标志,确认命令是否被正确执行。 C8051060使用UART0与PC进行串行通信。将该串口的工作方式设置为方式3,具有硬件地址识别和多处理器通讯的功能,并且用定时器1作为波特率发生器,设定波特率为115 200 b/s,每帧数据占11位--1个起始位,8个数据位,1个可编程的第九位,1个结束位。 该软件的子程序包括:清参数区、清数据区、发送参数、接收参数、开始采集、接收数据、复位等,各子程序的具体实现在此不进行详细描述。软件框图如图2所示。     4上位机软件 本系统使用MATLAB提供的图像用户界面开发环境(GUIDE)完成界面设计及上位机软件编制。GUI"所见即所得"的编程方式简单明快,非常容易上手。本软件借助MATLAB自带的工具箱和系统中的Activex控件,编制了菜单栏和工具栏及各功能模块,实现了命令、参数以及数据的双向传输及显示、数据的滤波处理及绘图。 4.1串行通信的实现 MATLAB本身是一个跨平台的软件,并不具备直接访问硬件的能力,但是可以通过对serial类的操作,实现MATLAB对串口的支持。 要想在MATLAB中使用串行口,首先要借助serial类建立串口对象,并在使用前将该串口对象打开。数据传输完毕后,需关闭该串口对象,避免影响其他程序无法对该串口对象的使用。在系统不再使用该串口或者退出系统时,需要将该串口对象清除并从MATLAB工作空间清除,避免占用内存和影响其他系统使用。 在使用串口进行数据传输时,需要对串口进行读写操作。读写串口的方式分为二进制、文本两种,类似于一般的文件操作。为了提高传输的速度,结合实际情况,本系统采用串口二进制异步读写方式。MATLAB程序通过串行口将命令发送到下位机,并通过串行口接收下位机上传的握手信号及数据。 串行通信的部分源码如下:         使用串口进行读写操作时,还需注意的一点就是对串口数据校验方式属性(Parity)的设置,如果该设置与下位机软件不匹配,将造成读写错误而又难以查找原因。 4.2 GUI界面中activx控件的使用 在MATLAB的GUIDE中所提供的基本控件非常少,难以满足本系统的需要。因此本系统调用系统中的Activex控件FlexArray、FlexGrid实现了数据在表格中的显示,调用axes控件实现了数据图形绘制。 本程序中用到的控件(包括Activex控件),在其创建及属性设置过程中,使用了全程序法、GUIDE属性法和两者相结合的方法。全程序法是只借助MATLAB提供的句柄功能创建及设置控件。而GUIDE属性法类似VB的设计风格,容易上手,但是这种方法使得m文件过于依赖fig文件。两者结合的方法使得设计更加灵活。下面以GUIDE属性法和全程序法相结合的方法创建、调用FlexArray控件为例,讲解本系统中的数据显示部分。基本控件的操作比较简单,在此不进行详述。 FlexArray控件的全称是,该控件的文件即C:WINDOWSSystem32VSFLEX3.OCX,如果本机上没有的话,可以到网上下载,或到其他机子上复制,然后使用regsvr32.exe注册即可。做好这些准备工作之后,点击GUI左侧的工具箱中的Activex按钮后,在设计区拖拉,弹出"Select an Activex Control"对话框,对话框中的"Activex Control List"列表框列出了在当前计算机上注册的所有Activex控件,在该列表框中选中 控件,单击"Create"按钮,该控件便在GUI的空白编辑区被创建。 创建成功后,GUI自动为该控件生成的句柄做为图形窗口句柄handles的成员被存储,对于第N个被创建的Activex控件,其句柄为handles.activexN,以后借用该句柄就可以通过函数来调用对应的Activex控件。控件的属性设置可以通过双击控件或者右键菜单打开属性设置窗口来进行,也可以通过在m文件中通过set命令设定。通过get可以获取Activex控件的属性。 要读取或设定FlexArray控件表格中某单元格的内容时,首先通过handles.activexl.row=i;handles.activexl.col=j;语句指向目标单元格,然后通过fa=get(handles.activexl,′text′);fa=str2num(fa);语句将目标单元格中的内容转换为数值赋给变量fa.通过set命令设置目标单元格中的内容,也可以设置固定栏标题,只是注意对于行固定栏的行号是0,列固定栏的列号是0。 4.3滤波处理及图形绘制 如果使用采集到的传感器输出数据直接计算井眼姿态,将会造成较大的误差。主要原因是:(1)在钻进中,由于钻进环境恶劣,振动和旋转都会对传感器输出造成较大影响;(2)电路本身的电气噪声,对采集数据存在一定的影响。 在消除旋转对实验数据的影响后,再借助MATLAB语言实现滤波功能,具体实现流程如下:根据实验数据,在MATLAB的FDAtool工具箱中设计滤波器,滤波效果与实际情况吻合后,将该滤波器的传递函数使用MATLAB语言实现,添加到"数据处理"功能按钮对应的程序中,完成数据处理的全部功能。 将滤波前后的数据借助axeS控件绘图显示,可以看到数据处理前后对真实井眼姿态描述的差异。 5应用实例 本系统已经应用于智能旋转导向系统的室内实验,图3是在室内直井钻井平台上进行模拟钻井实验的钻进过程中,利用本软件进行操作的截图。该图较好地展示了该软件的功能:数据、命令的双向传输及显示、数据的后续处理功能。图中曲线显示区域黑线代表的是采集到的y轴重量加速度的数值GY,红线代表的是经过数据处理后的GY,不难发现,后者的波动范围明显缩小,曲线更为光滑。然后利用处理过的三轴加速度数值,对钻井工具的空间姿态角进行计算,能够得到与实际情况较为吻合的空间姿态,为矿井的钻进中空间姿态的准确测量,提供了一个可供借鉴和参考的方法,能够使钻井过程中减少停钻次数,为提高钻井效率和钻井安全增加了保证。     6结论 具有数据处理、串口操作控制功能和Activex控件合理调用功能的上位机软件,再加上高性能片上系统C8051F060作为主芯片的井下电路,两者组成了模拟钻井姿态采集处理系统,在115200的串口波特率下,实现了对多路井下信号的采集、处理,从实验结果来看,井斜角、工具面角等空间角度的计算结果与实际情况较为符合,完全适用于钻井工具的空间姿态测量应用。强大的数据处理功能,再加上人机操作界面,这使得MATLAB在工业现场监控方面将获得更广阔的应用。

    时间:2012-10-20 关键词: matlab gui 设计教程

  • 如何将AWTK应用部署到嵌入式开发环境中

    如何将AWTK应用部署到嵌入式开发环境中

    AWTK已经在多个嵌入式平台做好了移植,并提供了相应的模板工程,如:嵌入式Linux、AWorksOS、RT1052裸系统以及STM32裸系统等。AWTK应用程序在Windows调试好之后,部署到这些嵌入式开发环境非常方便,只需要简单的几个步骤就可以了,具体的内容请看下文。 下面我们就以HelloDesigner-Demo为例,说明如何将应用部署到嵌入式开发环境中。 把应用部署到嵌入式Linux 下面以ZLG周立功Linux开发套件M6708-T(Cortex-A9)为载体,如何将应用部署到嵌入式Linux中,操作步骤如下: (1)安装交叉编译器(Ubuntu16 x64) 在M6708-T开发套件光盘资料中,找到 arm-poky-linux-gnueabi编译器的安装脚本并执行,默认安装在类似如下的目录: /opt/poky/1.7/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi (2)下载AWTK整合包 在AWTK官网下载整合发布包,将整合包其解压到Linux系统目录中(如:/home/user): (3)修改编译工具链 修改awtk-linux-fb/awtk_config.py文件: ·设置TOOLS_PREFIX为arm-poky-linux-gnueabi编译器的路径,如下图所示: ·如果CPU支持硬浮点,则开启“-mfloat-abi=hard ”,如下图所示: (4)编译应用程序 将HelloDesigner-Demo复制到user_apps目录下。执行下面的命令,目标文件将输出到awtk-linux-fb/build/bin: cd /home/user/awtk-linux-fb scons APP=../user_apps/HelloDesigner-Demo (5)打包应用程序 编译完成后,还需要把应用程序和资源文件打包在一起,才能下载到板子上运行,执行下面的命令,生成压缩包release.tar.gz: cd /home/user/awtk-linux-fb ./release.sh ../user_apps/HelloDesigner-Demo/res (6)运行应用程序 把 release.tar.gz 上传到开发板并解压,然后通过ssh或串口调助手让板子运行: ./release/bin/demo 把应用部署到AWorksOS 下面以RT1052平台为例,介绍如何将自己的应用移植到AWorksOS平台上。从ZLG官网下载最新的RT1052光盘资料,里面包含自带移植好的AWTK Eclipse工程和AWTK Keil工程。只需屏蔽工程中自带的示例代码文件(通常名字是xxx_demo),然后往工程中添加用户自己的应用代码就可以了。 使用Eclipse构建应用 找到AWorksOS SDK开发包下的aw_m1052_disk-2.0.0目录,然后按下面步骤操作: (1)打开m1052_awtk工程 (2)屏蔽demos示例 屏蔽m1052_awtk工程自带demos应用示例,可按下图所示操作: (3)把应用加入工程 将HelloDesigner-Demo复制到: aw_m1052_disk-2.0.0-test\examples\application\app_awtk_demo\src\user_apps目录下,再刷新工程,显示如下图所示。然后就可以编译和调试工程了。 使用Keil构建应用 找到aw_easyarmrt1052_disk-2.0.1目录(AWorksOS SDK中),然后按下面步骤操作: (1)打开easy_arm_rt1052.uvprojx工程 (2)屏蔽awtk-demo示例 在easy_arm_rt1052工程中,默认提供了一个awtk-demo示例。如果需要将自己的应用添加到该工程,先屏蔽awtk-demo文件夹,可按下图所示操作: (3)把应用加入工程 将HelloDesigner-Demo中的源代码(通常在src目录下),添加到这个Keil工程中,可按下图所示操作。然后就可以编译和调试工程了。 把应用部署到其他平台 ·用于RT1052裸系统的awtk-easyarm-rt1052-raw工程 ·用于STM32裸系统的awtk-stm32f429igtx-raw工程 以上这些工程都可以在AWTK的官网或者GitHub找到。如果想把自己的应用添加到这些Keil工程上编译运行,方法都大同小异,即先屏蔽工程中自带的示例代码文件(通常名字是xxx_demo),然后往工程中添加用户自己的应用代码。 RT1052裸系统Keil工程 (1)获取awtk-easyarm-rt1052-raw源码 git clone https://github.com/zlgopen/awtk-easyarm-rt1052-raw.git (2)打开awtk_gui_demo.uvprojx工程 (3)屏蔽Chart-Demo示例 在awtk_gui_demo工程中,默认提供了一个Chart-Demo示例。如果需要将自己的应用添加到该工程,先屏蔽Chart-Demo文件夹,可按下图所示操作: (4)把应用加入工程 将HelloDesigner-Demo的源代码(通常在src目录下),添加到这个Keil工程中,可按下图所示操作。然后就可以编译和调试工程了。 STM32裸系统Keil工程 下面以STM32F429为例,说明如何在工程中添加自己的应用,步骤如下: (1)获取STM32f429igtx源码 git clone https://github.com/zlgopen/awtk-stm32f429igtx-raw.git (2)获取AWTK源码 我们要把AWTK的源码放到工程目录中一起参与编译,并要需确保AWTK SDK版本与应用的一致性。获取AWTK源码的方式有下面两种: ·方式一(推荐使用该方式): 找到Designer的安装目录,将AWTK\SDK\awtk整个目录复制到awtk-stm32f429igtx-raw目录下。 ·方式二: 按照下面命令从GitHub上下载最新的AWTK源码。 cd awtk-stm32f429igtx-raw git clone https://github.com/zlgopen/awtk.git (3)打开awtk.uvprojx工程 (4)屏蔽AWTK-DEMO示例 在awtk工程中,默认提供了一个AWTK-DEMO示例。如果需要将自己的应用添加到该工程,先屏蔽AWTK-DEMO文件夹,可按下图所示操作: (5)把应用加入工程 将HelloDesigner-Demo的源代码(通常在src目录下),添加到这个Keil工程中,可按下图所示操作。然后就可以编译和调试工程了。 本文的详细内容请看:《AWTK开发实践》中的“第11章 把应用部署到嵌入式开发环境”。

    时间:2020-03-25 关键词: 嵌入式 gui awtk

首页  上一页  1 2 3 4 5 6 7 下一页 尾页
发布文章

技术子站

更多

项目外包

更多

推荐博客