热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

嵌入式系统下Microwindows的实现

文章标题:嵌入式系统下Microwindows的实现。Linux是中国IT实验室的一个技术频道。包含桌面应用,Linux系统管理,内核研究,嵌入式系统和开源等一些基本分类

  前 言
  目前,伴随着各种手持、无线及嵌入式设备的迅猛发展,相应的软硬件设计也发生了很大的变化。许多设备都使用了 Intel,MIPS,摩托罗拉的32位微处理器及大屏幕的液晶图形显示器。由于在过去10年中,桌面操作模式取得了巨大成功,于是许多开发者在嵌入式设计中开始使用类似于桌面的操作系统。其中一个比较好的方案就是使用Linux操作系统。由于Linux在嵌入式系统上具有桌面电脑的全部功能和特性,同时作为一种开放式源码,它允许各种各样的修改,并且还可以根据用户的特定要求进行定制。
  
  Microwindows概述
  Microwindows 是一个著名的开放式源码的嵌入式GUI软件,目的是把现代图形视窗环境引入到运行Linux的小型设备和平台上。作为X Window的替代品,Microwindows可以使用更少的RAM和文件存储空间(100K-600K)提供与X Window相似的功能。该体系结构允许设计者轻松加入各种显示设备、鼠标、触摸屏和键盘等。Linux2.2以上版本的内核代码允许用户将图形显存作为帧缓存进行存取,这样当用户对显示设备进行写入、控制时可以避免对内存映射区进行操作,因此用户可以在不了解底层图形硬件或没有使用过X Window的情况下进行图形程序的开发。这就是为什么现在在嵌入式系统中广泛使用Microwindows的原因。Microwindows 的可移植性非常好,基本上用 C 语言实现,只有某些关键代码使用了汇编以提高速度。Microwindows支持 Intel 16位、32位CPU,MIPS R4000 以及 arm 芯片。
  Microwindows 已经移植到一些掌上电脑。它的图形引擎被设计成能够运行在任何支持readpixel, writepixel, drawhorzline 和drawvertline, 和setpalette 的系统之上。在底层函数的支持之下,上层实现了位图,字体,光标以及颜色的支持。Microwindows支持新的Linux内核帧缓存结构,目前提供每像素1、2、4、8、16、24和32位的支持,另外还支持彩色显示和灰度显示,其中彩色显示包括真彩色(每像素15、16和32位)和调色板(每像素1, 2, 4 和 8 位)两种模式。在彩色显示模式下,所有的颜色用RGB格式给出,系统再将它转换成与之最相似的可显示颜色,而在单色模式下中则是转换成不同的灰度级。Microwindows支持窗口覆盖和子窗口概念、完全的窗口和客户区剪切、比例和固定字体,还提供了字体和位图文件处理工具。系统使用了优化的绘制函数,这样当用户在移动窗口时可以提供更好的响应。内存图形绘制和移动的实现使得屏幕画图显得很平滑,这点特别在显示动画、多边形绘制、任意区域填充、剪切时有用。
  尽管Microwindows完全支持Linux,但是它内部的可移植结构是基于一个相对简单的屏幕设备接口,可在许多不同的RTOS和裸机上运行。这种特性的优点突出体现在用户设计的图形程序不需重写就可以被不同的工程共享,甚至可以运行在不同RTOS的不同对象上。
  Microwindows系统以图形方式支持在主机平台上的仿真目标平台。这样,为Linux设计的Microwindows应用程序就可以在台式机上进行编写和开发而不用进行交叉编译就可测试和运行,并且直接在目标平台上运行。台式主机上运行的目标应用程序在X window中显示,这一点通过由Microwindows提供的X window屏幕驱动来完成,而不是通过帧缓存驱动。该驱动可以在像素位素和颜色深浅方面准确的模拟目标平台上的显示器,这样即使桌面系统是24位颜色,它也可以预览显示2bpp灰度级的目标应用程序。
  Microwindows采用分层设计方法。在最底层,屏幕,鼠标/触摸屏以及键盘驱动程序提供了对物理设备访问的能力。在中间层,实现了一个可移植的图形引擎,支持行绘制,区域填充,剪切以及颜色模型等。在上层,实现多种API以适应不同的应用环境。
  
  两种API:Win32和Nano-X
  Microwindows中使用两种流行的图形编程接口:Microsoft Windows Win32/WinCE图形显示接口(GDI)和Xlib-like接口。前者应用于所有的Windows CE和Win32应用程序,后者就象Nano-X,应用于所有Linux X插件集的最底层。这样做可以让大量的Windows程序员开发图形应用程序,类似地也可以让Linux图形程序员用X接口开发图形应用程序。
  
  Nano-X程序设计
  本文中将用Nano-X API设计一个应用程序,并且讨论底层Nano-X程序的设计问题。Nano-X允许应用程序使用client/server网络协议或本地UNIX的主域接口。这样可以让几个应用程序在嵌入式设备或远程主机上运行而连接到Microwindows 的服务器上显示,这些特点使得Nano-X的操作非常像X Windows系统。在底层和大部分有关创建、删除窗口以及基本画图函数方面,Nano-X API和X的Xlib库很相似。另外,由于Microwindows被设计得很小,很多选项可以用资源包中的配置文件来进行设置。
  下面的过程是建立一个Nano-X服务器的一个具体操作。
  (1)初始化
  Mcrowindows的资源包可以从http://microwindows.org下载。首先通过编译为主机和嵌入式目标平台建立一个Nano-X 的服务器。大多数的设置选项在配置文件中,所以在解压缩该资源包后进入microwin/src目录里编辑配置文件。下面是一些最重要的ARCH选项:
  ARCH=LINUX-NATIVE
  ARCH=LINUX-arm
  ARCH=LINUX-MIPS
  ARCH=LINUX-POWERPC
  为LINUX-NATIVE设置ARCH选项的目的是通知系统为当前运行的主机的Linux系统生成程序,而为其他选项设置ARCH则是要给一个RISC目标平台进行交叉编译。Microwindows中使用Arch.rules文件为每一个选项确定一个具体的设置。
  下面的设置项用于提供Nano-X 服务器的图像支持:
  HAVE_BMP_SUPPORT=Y
  HAVE_GIF_SUPPORT=Y
  HAVE_JPEG_SUPPORT=Y
  设置JPEG图像选项时必须给出外部jpeg解压缩库的位置,例如LIBJPEG=/usr/lib/libjpeg.a。大部分系统都提供了解压库,也可从Microwindows网站上下载。另外一个重要设置项为选择是否提供大小可变字体支持,缺省项是在drivers/genfont.c中提供固定大小的位图字体。如想显示更大的字体,例如运行一个嵌入式浏览器,则可加入对TrueType 或 Adobe Type 1字体的支持。当选项确定以后,就可以根据显示的需要指定字体文件和像素点的大小,相应Microwindows会根据外部字体文件来生成大小适当的字体。最新的版本还可支持外部中文字体,其中所有的字体可用8位ASCII 码、 Unicode-16或UTF-8确定。其中UTF-8是Unicode的字节流编码方案。
  有关字符支持的选项如下:
  HAVE_FREETYPE_SUPPORT=Y
  HAVE_T1LIB_SUPPORT=Y
  HAVE_HZK_SUPPORT=Y
  FreeType 和T1lib外部库分别用于支持TrueType 和 Adobe Type 1字体。这些库必须预先编译并且在配置文件中应指定其位置。Microwindows的网站上提供的所有库函数的下载。
  
  (2)配置输出显示设备
  由于Microwindows可在帧缓存系统和X Windows下运行,每一种显示驱动需要确定不同的设置。如果已经在Linux桌面上运行了X ,最好首先用X屏幕驱动建立系统,然后再为嵌入式设备生成一个帧缓存。下列选项用以配置X屏幕驱动:
  X11=Y
  SCREEN_WIDTH=640
  SCREEN_HEIGHT=480
  SCREEN_PIXTYPE=MWPF_TRUECOLOR0888
  Microwindows通过这些选项在X 桌面上生成一个640x480的虚窗口,采用了8位色彩模式(红、绿、兰各用8位表示)输出。通过改变设置,可以在自己的桌面上控制目标嵌入式设备的仿真。例如仿真一个每像素16位的显示,SCREEN_PIXTYPE=MWPF_TRUECOLOR565。其中MWPF常数在src/include/mwtypes.h 头文件中有详尽的解释。
  由于必须确定Linux系统内核支持帧缓存,因此设置帧缓存显示比较复杂。其设置如下:
  X11=N
  FRAMEBUFFER=Y
  FBVGA=Y
  VTSWITCH=Y
  PORTRAIT_MODE=N
  FBVGA选项引入了对16色VGA平面模式屏幕驱动的支持,但是该选项不可用于嵌入式系统。VTSWITCH选项允许Microwindows在帧缓存控制器上运行,按下ALT键可打开另一个虚拟控制器。一些嵌入式系统要求该选项关闭。PORTRAIT_MODE选项利用 L/R键来指定系统偏向于左/右运行,这一点和康柏公司出品的iPAQ PDA非常类似。
  
  (3)Linux内核帧缓存支持
  如果在运行Nano-X 服务器时显示“Can’t open /dev/fb0”,说明没有打开帧缓存或是系统内核没有引入帧缓存驱动。最简单的识别方式是当启动系统时是否看见一个企鹅图标,如果没有图标则确认下列选项是否在/usr/src/linux/.config文件中:
  CONFIG_FB=y
  CONFIG_FB_VGA16=y
  CONFIG_FBCON_VGA=y
  CONFIG_FBCON_CFB4=y
  CONFIG_FBCON_CFB8=y
  如果系统支持图形卡而不是标准的老式VGA,可以不用CONFIG_FB_VGA16选项。在重建内核之前,需要备份旧的内核,并且在lilo.conf文件中写明备份位置。启用帧缓存是大部分嵌入式系统的标准设置。
  最后一项重要配置是为Microwindows指定鼠标或触摸屏输入的驱动程序。目前Microwindows上的鼠标是通过GPM工具或直接使用串口。指令GPMMOUSE=Y是选择GPM支持,设置之后运行gpm工具,例如‘gpm ?R ?t ps2’(支持 PS/2 鼠标);指令SERMOUSE=Y 是选择串口,同时还要在src/drivers/mou_ser.c 中设置MOUSE_TYPE和MOUSE_PORT两个环境变量。
  
  (4)创建一个完整的演示系统
  一旦在配置文件中设置好选项后,只要用户不再改动,参数就保持不变。同时在src目录中还有很多针对不同平台的样本配置文件。要创建一个 Nano-X 服务器并且运行演示程序,首先进入microwin/src目录,然后键入“make”。所有的程序在microwin/src/bin目录中生成,客户链接库也放在microwin/src/lib目录下。要运行演示程序,首先运行Nano-X 服务器 (在bin/nano-X下),然后再运行应用程序。
  
  bin/nano-X & sleep 1; bin/world
  在运行demonstration world plotting程序之前运行休
推荐阅读
  • svnWebUI:一款现代化的svn服务端管理软件
    svnWebUI是一款图形化管理服务端Subversion的配置工具,适用于非程序员使用。它解决了svn用户和权限配置繁琐且不便的问题,提供了现代化的web界面,让svn服务端管理变得轻松。演示地址:http://svn.nginxwebui.cn:6060。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文是一位90后程序员分享的职业发展经验,从年薪3w到30w的薪资增长过程。文章回顾了自己的青春时光,包括与朋友一起玩DOTA的回忆,并附上了一段纪念DOTA青春的视频链接。作者还提到了一些与程序员相关的名词和团队,如Pis、蛛丝马迹、B神、LGD、EHOME等。通过分享自己的经验,作者希望能够给其他程序员提供一些职业发展的思路和启示。 ... [详细]
  • 本文详细介绍了云服务器API接口的概念和作用,以及如何使用API接口管理云上资源和开发应用程序。通过创建实例API、调整实例配置API、关闭实例API和退还实例API等功能,可以实现云服务器的创建、配置修改和销毁等操作。对于想要学习云服务器API接口的人来说,本文提供了详细的入门指南和使用方法。如果想进一步了解相关知识或阅读更多相关文章,请关注编程笔记行业资讯频道。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了在Mac上安装Xamarin并使用Windows上的VS开发iOS app的方法,包括所需的安装环境和软件,以及使用Xamarin.iOS进行开发的步骤。通过这种方法,即使没有Mac或者安装苹果系统,程序员们也能轻松开发iOS app。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • GPT-3发布,动动手指就能自动生成代码的神器来了!
    近日,OpenAI发布了最新的NLP模型GPT-3,该模型在GitHub趋势榜上名列前茅。GPT-3使用的数据集容量达到45TB,参数个数高达1750亿,训练好的模型需要700G的硬盘空间来存储。一位开发者根据GPT-3模型上线了一个名为debuid的网站,用户只需用英语描述需求,前端代码就能自动生成。这个神奇的功能让许多程序员感到惊讶。去年,OpenAI在与世界冠军OG战队的表演赛中展示了他们的强化学习模型,在限定条件下以2:0完胜人类冠军。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • [翻译]微服务设计模式5. 服务发现服务端服务发现
    服务之间需要互相调用,在单体架构中,服务之间的互相调用直接通过编程语言层面的方法调用就搞定了。在传统的分布式应用的部署中,服务地 ... [详细]
author-avatar
当官的好办事_625
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有