知识大全 基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(八)

Posted 图形

篇首语:笛里谁知壮士心,沙头空照征人骨。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(八)相关的知识,希望对你有一定的参考价值。

基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(八)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  作者 魏永明    主题八 MiniGUI 和其他嵌入式 Linux 上的图形及图形用户界面系统     为了让读者对嵌入式 Linux 当中能够使用的图形及图形用户界面有个较为全面的认识 本文将为读者介绍一些嵌入式 Linux 系统中常见的图形及图形用户界面系统 并作为 基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南 系列的最后一篇文章 本文首先概述了 Linux 图形领域的基本设施 然后描述了一些可供嵌入式 Linux 系统使用的高级图形库以及图形用户界面支持系统 并大概比较了这些系统的优缺点 希望能对嵌入式 Linux 系统的开发有所帮助    Linux 图形领域的基础设施  本小节首先向读者描述 Linux 图形领域中常见的基础设施 之所以称为基础设施 是因为这些系统(或者函数库) 一般作为其他高级图形或者图形应用程序的基本函数库 这些系统(或者函数库)包括 X Window SVGALib FrameBuffer 等等      X Window  提起 Linux 上的图形 许多人首先想到的是 X Window 这一系统是目前类 UNIX 系统中处于控制地位的桌面图形系统 无疑 X Window 作为一个图形环境是成功的 它上面运行着包括 CAD建模工具和办公套件在内的大量应用程序 但必须看到的是 由于 X Window 在体系接口上的原因 限制了其对游戏 多媒体的支持能力 用户在 X Window 上运行 VCD 播放器 或者运行一些大型的三维游戏时 经常会发现同样的硬件配置 却不能获得和 Windows 操作系统一样的图形效果――即使使用了加速的 X Server 其效果也不能令人满意 另外 大型的应用程序(比如 Mozilla 浏览器)在 X Window 上运行时的响应能力 也相当不能令人满意 当然 这里有 Linux 内核在进程调度上的问题 也有 X Window 的原因     X Window 为了满足对游戏 多媒体等应用对图形加速能力的要求 提供了 DGA(直接图形访问)扩展 通过该扩展 应用程序可以在全屏模式下直接访问显示卡的帧缓冲区 并能够提供对某些加速功能的支持     Tiny X是XServer在嵌入式系统的小巧实现 它由Xfree Core Team 的Keith Packard开发 它的目标是运行于小内存系统环境 典型的运行于X CPU 上的Tiny X Server 尺寸接近(小于) MB      SVGALib  SVGALib 是 Linux 系统中最早出现的非 X 图形支持库 这个库从最初对标准 VGA 兼容芯片的支持开始 一直发展到对老式 SVGA 芯片的支持以及对现今流行的高级视频芯片的支持 它为用户提供了在控制台上进行图形编程的接口 使用户可以在 PC 兼容系统上方便地获得图形支持 但该系统有如下不足     接口杂乱 SVGALib 从最初的 vgalib 发展而来 保留了老系统的许多接口 而这些接口却不能良好地迎合新显示芯片的图形能力   未能较好地隐藏硬件细节 许多操作 不能自动使用显示芯片的加速能力支持   可移植性差 SVGALib 目前只能运行在 x 平台上 对其他平台的支持能力较差(Alpha 平台除外)   发展缓慢 有被其他图形库取代的可能 SVGALib 作为一个老的图形支持库 目前的应用范围越来越小 尤其在 Linux 内核增加了 FrameBuffer 驱动支持之后 有逐渐被其他图形库替代的迹象   对应用的支持能力较差 SVAGLib 作为一个图形库 对高级图形功能的支持 比如直线和曲线等等 却不能令人满意 尽管 SVGALib 有许多缺点 但 SVGALib 经常被其他图形库用来初始化特定芯片的显示模式 并获得映射到进程地址空间的线性显示内存首地址(即帧缓冲区) 而其他的接口却很少用到 另外 SVGALib 中所包含的诸如键盘 鼠标和游戏杆的接口 也很少被其他应用程序所使用     因此 SVGALib 的使用越来越少 笔者也不建议用户使用这个图形库 当然 如果用户的显示卡只支持标准 VGA 模式 则 SVGALib 还是比较好的选择      FrameBuffer  FrameBuffer 是出现在 xx 内核当中的一种驱动程序接口 这种接口将显示设备抽象为帧缓冲区 用户可以将它看成是显示内存的一个映像 将其映射到进程地址空间之后 就可以直接进行读写操作 而写操作可以立即反应在屏幕上 该驱动程序的设备文件一般是 /dev/fb /dev/fb 等等 比如 假设现在的显示模式是 x 位色 则可以通过如下的命令清空屏幕     $ dd if=/dev/zero of=/dev/fb bs= count=     在应用程序中 一般通过将 FrameBuffer 设备映射到进程地址空间的方式使用 比如下面的程序就打开 /dev/fb 设备 并通过 mmap 系统调用进行地址映射 随后用 memset 将屏幕清空(这里假设显示模式是 x 位色模式 线性内存模式)     int fb;  unsigned char* fb_mem;    fb = open ( /dev/fb O_RDWR);  fb_mem = mmap (NULL * PROT_READ|PROT_WRITE MAP_SHARED fb );    memset (fb_mem * );    FrameBuffer 设备还提供了若干 ioctl 命令 通过这些命令 可以获得显示设备的一些固定信息(比如显示内存大小) 与显示模式相关的可变信息(比如分辨率 象素结构 每扫描线的字节宽度) 以及伪彩色模式下的调色板信息等等     通过 FrameBuffer 设备 还可以获得当前内核所支持的加速显示卡的类型(通过固定信息得到) 这种类型通常是和特定显示芯片相关的 比如目前最新的内核( )中 就包含有对 S Matrox nVidia Dfx 等等流行显示芯片的加速支持 在获得了加速芯片类型之后 应用程序就可以将 PCI 设备的内存I/O(memio)映射到进程的地址空间 这些 memio 一般是用来控制显示卡的寄存器 通过对这些寄存器的操作 应用程序就可以控制特定显卡的加速功能     PCI 设备可以将自己的控制寄存器映射到物理内存空间 而后 对这些控制寄存器的访问 给变成了对物理内存的访问 因此 这些寄存器又被称为 memio 一旦被映射到物理内存 Linux 的普通进程就可以通过 mmap 将这些内存 I/O 映射到进程地址空间 这样就可以直接访问这些寄存器了     当然 因为不同的显示芯片具有不同的加速能力 对memio 的使用和定义也各自不同 这时 就需要针对加速芯片的不同类型来编写实现不同的加速功能 比如大多数芯片都提供了对矩形填充的硬件加速支持 但不同的芯片实现方式不同 这时 就需要针对不同的芯片类型编写不同的用来完成填充矩形的函数     说到这里 读者可能已经意识到 FrameBuffer 只是一个提供显示内存和显示芯片寄存器从物理内存映射到进程地址空间中的设备 所以 对于应用程序而言 如果希望在 FrameBuffer 之上进行图形编程 还需要完成其他许多工作 举个例子来讲 FrameBuffer 就像一张画布 使用什么样子的画笔 如何画画 还需要你自己动手完成      LibGGI  LibGGI 试图建立一个一般性的图形接口 而这个抽象接口连同相关的输入(鼠标 键盘 游戏杆等)抽象接口一起 可以方便地运行在 X Window SVGALib FrameBuffer 等等之上 建立在 LibGGI 之上的应用程序 不经重新编译 就可以在上述这些底层图形接口上运行 但不知何故 LibGGI 的发展几乎停滞      Linux 图形领域的高级函数库     Xlib 及其他相关函数库  在 X Window 系统中进行图形编程时 可以选择直接使用 Xlib Xlib 实际是对底层 X 协议的封装 可通过该函数库进行一般的图形输出 如果你的 X Server 支持 DGA 则可以通过 DGA 扩展直接访问显示设备 从而获得加速支持 对一般用户而言 由于 Xlib 的接口太原始而且复杂 因此一般的图形程序选择其他高级一些的图形库作为基础 比如 GTK QT 等等 这两个函数同时还是一些高级的图形用户界面支持函数库 由于种种原因 GTK QT 等函数库存在有庞大 占用系统资源多的问题 不太适合在嵌入式系统中使用 这时 你可以选择使用 FLTK 这是一个轻量级的图形函数库 但它的主要功能集中在用户界面上 提供了较为丰富的控件集      SDL  SDL(Simple DirectMedia Layer)是一个跨平台的多媒体游戏支持库 其中包含了对图形 声音 游戏杆 线程等等的支持 目前可以运行在许多平台上 其中包括 X Window X Window with DGA Linux FrameBuffer 控制台 Linux SVGALib 以及Windows DirectX BeOS 等等     因为 SDL 专门为游戏和多媒体应用而设计开发 所以它对图形的支持非常优秀 尤其是高级图形能力 比如 Alpha 混和 透明处理 YUV 覆蓋 Gamma 校正等等 而且在 SDL 环境中能够非常方便地加载支持 OpenGL 的 Mesa 库 从而提供对二维和三维图形的支持     可以说 SDL 是编写跨平台游戏和多媒体应用的最佳平台 也的确得到了广泛应用 相关信息 可参阅      Allegro  Allegro 是一个专门为 x 平台设计的游戏图形库 最初的 Allegro 运行在 DOS 环境下 而目前可运行在 Linux FrameBuffe 控制台 Linux SVGALib X Window 等系统上 Allegro 提供了一些丰富的图形功能 包括矩形填充和样条曲线生成等等 而且具有较好的三维图形显示能力 由于 Allegro 的许多关键代码是采用汇编编写的 所以该函数库具有运行速度快 资源占用少的特点 然而 Allegro 也存在如下缺点     对线程的支持较差 Allegro 的许多函数是非线程安全的 不能同时在两个以上的线程中使用   对硬件加速能力的支持不足 在设计上没有为硬件加速提供接口     有关 Allegro 的进一步信息 可参阅      Mesa D  Mesa D 是一个兼容 OpenGL 规范的开放源码函数库 是目前 Linux 上提供专业三维图形支持的 cha138/Article/program/Oracle/201311/18758

相关参考

知识大全 32位嵌入式系统和嵌入式Linux

32位嵌入式系统和嵌入式Linux  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  嵌入式Linu

知识大全 Linux用作嵌入式操作系统

Linux用作嵌入式操作系统  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  LinuxasanE

知识大全 恰当选择嵌入式Linux环境下的GUI系统(图)

恰当选择嵌入式Linux环境下的GUI系统(图)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 制作基于软盘的Linux系统

制作基于软盘的Linux系统  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  作者张宏伟欧阳平平 

知识大全 android系统是基于Linux对吗

android系统是基于Linux对吗  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!android

知识大全 向基于Linux的OracleRAC10g集群添加新节点

向基于Linux的OracleRAC10g集群添加新节点  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 在solairs上运行linux上的二进制文件

  和sparc上的solaris相比Intelx上的solaris的另一个优点是在Intel架构的计算机之间有更加优良的互操作能力    由于嵌入Linux的软件二进制文件的系统调用被从新设计来和S

知识大全 基于flush()不能按顺序输出时的解决办法

  如果是在linux下首先确认是否添加ob_start()和ob_flush()复制代码代码如下:ob_start();for($i=;$i<=;$i++)echo$i"<br/>

知识大全 安卓系统可以下载吗

安卓系统可以下载吗?就是在普通手机上安装安卓系统,可以吗?不可以。Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机