熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

基於 Linux 和 MiniGUI 的嵌入式系統軟件開發指南(八)

2013-11-13 22:18:58  來源: Oracle 

  作者 魏永明
  
  主題八MiniGUI 和其他嵌入式 Linux 上的圖形及圖形用戶界面系統
  
  為了讓讀者對嵌入式 Linux 當中能夠使用的圖形及圖形用戶界面有個較為全面的認識本文將為讀者介紹一些嵌入式 Linux 系統中常見的圖形及圖形用戶界面系統並作為基於 Linux 和 MiniGUI 的嵌入式系統軟件開發指南系列的最後一篇文章本文首先概述了 Linux 圖形領域的基本設施然後描述了一些可供嵌入式 Linux 系統使用的高級圖形庫以及圖形用戶界面支持系統並大概比較了這些系統的優缺點希望能對嵌入式 Linux 系統的開發有所幫助
   Linux 圖形領域的基礎設施
  本小節首先向讀者描述 Linux 圖形領域中常見的基礎設施之所以稱為基礎設施是因為這些系統(或者函數庫)一般作為其他高級圖形或者圖形應用程序的基本函數庫這些系統(或者函數庫)包括X WindowSVGALibFrameBuffer 等等
  
   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(直接圖形訪問)擴展通過該擴展應用程序可以在全屏模式下直接訪問顯示卡的幀緩沖區並能夠提供對某些加速功能的支持
  
  TinyX是XServer在嵌入式系統的小巧實現它由Xfree Core Team 的Keith Packard開發它的目標是運行於小內存系統環境典型的運行於X CPU 上的TinyX 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_WRITEMAP_SHAREDfb);
  
  memset (fb_mem *);
  
  FrameBuffer 設備還提供了若干 ioctl 命令通過這些命令可以獲得顯示設備的一些固定信息(比如顯示內存大小)與顯示模式相關的可變信息(比如分辨率象素結構每掃描線的字節寬度)以及偽彩色模式下的調色板信息等等
  
  通過 FrameBuffer 設備還可以獲得當前內核所支持的加速顯示卡的類型(通過固定信息得到)這種類型通常是和特定顯示芯片相關的比如目前最新的內核()中就包含有對 SMatroxnVidiaDfx 等等流行顯示芯片的加速支持在獲得了加速芯片類型之後應用程序就可以將 PCI 設備的內存I/O(memio)映射到進程的地址空間這些 memio 一般是用來控制顯示卡的寄存器通過對這些寄存器的操作應用程序就可以控制特定顯卡的加速功能
  
  PCI 設備可以將自己的控制寄存器映射到物理內存空間而後對這些控制寄存器的訪問給變成了對物理內存的訪問因此這些寄存器又被稱為memio一旦被映射到物理內存Linux 的普通進程就可以通過 mmap 將這些內存 I/O 映射到進程地址空間這樣就可以直接訪問這些寄存器了
  
  當然因為不同的顯示芯片具有不同的加速能力對memio 的使用和定義也各自不同這時就需要針對加速芯片的不同類型來編寫實現不同的加速功能比如大多數芯片都提供了對矩形填充的硬件加速支持但不同的芯片實現方式不同這時就需要針對不同的芯片類型編寫不同的用來完成填充矩形的函數
  
  說到這裡讀者可能已經意識到 FrameBuffer 只是一個提供顯示內存和顯示芯片寄存器從物理內存映射到進程地址空間中的設備所以對於應用程序而言如果希望在 FrameBuffer 之上進行圖形編程還需要完成其他許多工作舉個例子來講FrameBuffer 就像一張畫布使用什麼樣子的畫筆如何畫畫還需要你自己動手完成
  
   LibGGI
  LibGGI 試圖建立一個一般性的圖形接口而這個抽象接口連同相關的輸入(鼠標鍵盤游戲桿等)抽象接口一起可以方便地運行在 X WindowSVGALibFrameBuffer 等等之上建立在 LibGGI 之上的應用程序不經重新編譯就可以在上述這些底層圖形接口上運行但不知何故LibGGI 的發展幾乎停滯
  
   Linux 圖形領域的高級函數庫
  
   Xlib 及其他相關函數庫
  在 X Window 系統中進行圖形編程時可以選擇直接使用 XlibXlib 實際是對底層 X 協議的封裝可通過該函數庫進行一般的圖形輸出如果你的 X Server 支持 DGA則可以通過 DGA 擴展直接訪問顯示設備從而獲得加速支持對一般用戶而言由於 Xlib 的接口太原始而且復雜因此一般的圖形程序選擇其他高級一些的圖形庫作為基礎比如GTKQT 等等這兩個函數同時還是一些高級的圖形用戶界面支持函數庫由於種種原因GTKQT 等函數庫存在有龐大占用系統資源多的問題不太適合在嵌入式系統中使用這時你可以選擇使用 FLTK這是一個輕量級的圖形函數庫但它的主要功能集中在用戶界面上提供了較為豐富的控件集
  
   SDL
  SDL(Simple DirectMedia Layer)是一個跨平台的多媒體游戲支持庫其中包含了對圖形聲音游戲桿線程等等的支持目前可以運行在許多平台上其中包括 X WindowX Window with DGALinux FrameBuffer 控制台Linux SVGALib以及Windows DirectXBeOS 等等
  
  因為 SDL 專門為游戲和多媒體應用而設計開發所以它對圖形的支持非常優秀尤其是高級圖形能力比如 Alpha 混和透明處理YUV 覆蓋Gamma 校正等等而且在 SDL 環境中能夠非常方便地加載支持 OpenGL 的 Mesa 庫從而提供對二維和三維圖形的支持
  
  可以說SDL 是編寫跨平台游戲和多媒體應用的最佳平台也的確得到了廣泛應用相關信息可參閱
  
   Allegro
  Allegro 是一個專門為 x 平台設計的游戲圖形庫最初的 Allegro 運行在 DOS 環境下而目前可運行在 Linux FrameBuffe 控制台Linux SVGALibX Window 等系統上Allegro 提供了一些豐富的圖形功能包括矩形填充和樣條曲線生成等等而且具有較好的三維圖形顯示能力由於 Allegro 的許多關鍵代碼是采用匯編編寫的所以該函數庫具有運行速度快資源占用少的特點然而Allegro 也存在如下缺點
  
  對線程的支持較差Allegro 的許多函數是非線程安全的不能同時在兩個以上的線程中使用
  對硬件加速能力的支持不足在設計上沒有為硬件加速提供接口
  
  有關 Allegro 的進一步信息可參閱
  
   MesaD
  MesaD 是一個兼容 OpenGL 規范的開放源碼函數庫是目前 Linux 上提供專業三維圖形支持的
From:http://tw.wingwit.com/Article/program/Oracle/201311/18758.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.