嵌入式Linux的MiniGUI研究和移植

2021-04-06 18:03:43 字數 4587 閱讀 2130

摘要:分析嵌入式作業系統下典型的圖形使用者介面minigui的結構和特點,並提出將其移植到sunplus的***720上的方案。

引 言

1 嵌入式linux下的gui概況

1.1 gui在嵌入式系統中的地位

由於嵌入式系統實時性要求非常高,對gui的要求也更高。這些系統一般不希望建立在龐大累贅的、非常消耗系統資源的作業系統和gui之上,比如windows或x window,太過龐大和臃腫。這樣,這些系統對輕型gui的需求更加突出。另外嵌入式系統往往是一種定製裝置,它們對gui的需求也各不相同。有些系統只要求一些圖形功能,而有些系統要求完備的gui支援,因此,gui也必須是可定製的。嵌入式系統對gui的基本要求包括輕型、占用資源少、高效能、高可靠性及可配置[1]。

1.2 目前嵌入式系統中gui的實現

儘管實時嵌入式系統對gui的需求越來越明顯,但目前gui的實現方法各有不同[1]:

① 某些大型廠商有能力自己開發滿足自身需要的gui系統。

② 某些廠商沒有將gui作為乙個軟體層從應用程式中剝離,gui的支援邏輯由應用程式自己來負責。

③ 採用某些比較成熟的gui系統,比如 mini gui、microwindows 或者其它gui系統。

比較常用的有如下幾種gui系統:緊縮的x window 系統、minigui、microwindows、opengui及qt/embedded 等。下面簡單介紹這些系統。

(1)minigui

minigui[2]由原清華大學教師魏永明先生開發,是一種面向嵌入式系統或者實時系統的圖形使用者介面支援系統。它主要執行於linux控制台,實際可以執行在任何一種具有posix執行緒支援的 posix相容系統上。minigui同時也是國內最早出現的幾個自由軟體專案之一。稍後將對它作詳細的介紹。

(2)microwindows

microwindows[3]是乙個著名的開放原始碼的嵌入式gui軟體。microwindows提供了現代圖形視窗系統的一些特性。microwindows api介面支援類win32 api,介面試圖和win32完全相容。它還實現了一些win32使用者模組功能。microwindows採用分層設計方法,以便不同的層面能夠在需要的時候改寫,基本上用 c 語言實現。microwindows已經支援 intel 16位和32位cpu、mips r4000 以及 arm 晶元;但作為乙個視窗系統,該專案提供的視窗處理功能還需要進一步完善,比如控制項或構件的實現還很不完備,鍵盤和滑鼠等的驅動還很不完善。

(3)opengui

opengui[4]在linux系統上存在已經很長時間了。這個庫是用c++編寫的,只提供c++介面。opengui基於乙個用彙編實現的x86圖形核心,提供了乙個高層的c/c++圖形/視窗介面。opengui提供了二維繪圖原語、訊息驅動的api及bmp檔案格式支援。opengui功能強大,使用方便。opengui 支援滑鼠和鍵盤的事件,在linux上基於frame buffer或者svgalib實現繪圖。由於其基於彙編實現的核心並利用mmx指令進行了優化,opengui執行速度非常快。正由於其核心用彙編實現,可移植性受到了影響。通常在驅動程式一級,效能和可移植性是矛盾的,必須找到乙個折衷。

(4)qt/embedded

qt/embedded[5]是著名的qt庫開發商trolltech 的面向嵌入式系統的qt版本。這個版本的主要特點是可移植性較好,許多基於qt的x window程式可以非常方便地移植到嵌入式系統;但是該系統不是開放原始碼的,如果使用這個庫,可能需要支付昂貴的授權費用。

2 minigui的特點和體系結構

2.1 minigui的特點

minigui的主要特點有[1]:

◇ 遵循gpl條款的純自由軟體。

◇ 提供了完備的多視窗機制,包括:

多個單獨執行緒中執行的多視窗;

單個執行緒中主視窗的附屬;

對話方塊和預定義的控制項類(按鈕、單行和多行編輯框、列表框、進度條及工具欄等);

訊息傳遞機制。

◇ 多字符集和多字型支援,目前支援 iso8859-1、gb2312及big5 等字符集,並且支援各種光柵字型和 truetype、type 1 等向量字型。

◇ 全拼和五筆等漢字輸入法支援。

◇ bmp、gif、jpeg及pcx 等常見影象檔案的支援。

◇ windows的資源檔案支援,如位圖、圖示、游標、插入符、定時器及加速鍵等。

◇ 小巧。包含全部功能的庫檔案大小為300 kb左右。

◇ 可配置。可根據專案需求進行定製配置和編譯。

◇ 高穩定性和高效能。minigui已經在linux發行版安裝程式、cnc系統及藍點嵌入式系統等關鍵應用程式中得到了實際應用。

◇ 可移植性好。目前,minigui可以在x window 和linux控制台上執行。中科院eeos開發組已經成功地將minigui移植到了他們的posix相容系統上。藍點軟體(北京)研發中心也已經成功地將 minigui移植到了兩款基於strongarm的嵌入式系統上。

2.2 minigui的體系結構

從整體結構上看,minigui是分層設計的,層次結構如圖1所示。在最底層,gal和ial提供底層圖形介面以及滑鼠和鍵盤的驅動;中間層是minigui 的核心層,包括視窗系統必不可少的各個模組;最頂層是api,即程式設計介面。gal和ial為 minigui提供了底層的linux控制台或者x window 上的圖形介面以及輸入介面,而pthread用於提供核心級執行緒支援的c函式庫。

利用gal和ial,大大提高了minigui的可移植性,並且使程式的開發和除錯變得更加容易。可以在x window上開發和除錯自己的minigui程式,通過重新編譯就可以讓minigui應用程式執行在特殊的嵌入式硬體平台上。

3 minigui的移植

3.1 滑鼠和鍵盤驅動程式

滑鼠驅動程式非常簡單。抽象意義上講,初始化滑鼠後,每次使用者移動滑鼠,就可以得到乙個x 和 y 方向上的位移值。驅動程式內部維護滑鼠的當前位置,使用者移動滑鼠後,當前位置被加上位移值,並通過上層cursor支援,反映到螢幕上,使用者就會認為滑鼠被正確地「移動」了。現在有各種各樣的滑鼠,例如ms滑鼠、ps/2滑鼠、匯流排滑鼠及gpm滑鼠等,其主要差別在於初始化和資料報格式上。鍵盤驅動程式的實現也比較簡單,在此不作詳細的介紹。

3.2 圖形驅動程式

hal提供的介面函式大多與圖形相關,主要就是通過呼叫圖形驅動程式來完成任務的。圖形驅動程式遮蔽了底層驅動的細節,實現底層驅動相關的功能,而不是硬體相關的一些功能,如一些畫圓和畫線的gdi函式、普通的剪下,可直接在hal介面層實現。

***720的顯示驅動是基於frame buffer的驅動程式的。通過對sdram中的frame buffer和video bitstream buffer寫入,就可以實現對tv和顯示器的重新整理。畫素的寫入方式和順序如圖3所示[6]。

下面介紹各界面函式:

open,close

基本的初始化和關閉函式。在open函式裡要選擇子圖形驅動程式,將其實現的函式賦給本psd 結構的函式指標。這裡只考慮基於frame buffer的圖形引擎的初始化。

setpalette,getpalette

當使用8位或以下的圖形模式時,要使用系統調色盤。這裡是調色盤處理函式,它們和windows api中的概念類似。linux系統利用ioctl 提供了處理調色盤的介面。

allocatememgc,mapmemgc,freememgc

記憶體螢幕是乙個偽螢幕。在對螢幕圖形操作過程中,比如移動視窗,先生成乙個記憶體螢幕,將物理螢幕的乙個區域拷貝到記憶體螢幕,再拷貝到物理螢幕的新位置,這樣就減少了螢幕直接拷貝的延時。allocatememgc用於給記憶體螢幕分配空間,mapmemgc做一些初始化工作,而freememgc則釋放記憶體螢幕。

drawpixel、readpixel、drawhline、drawvline及fillrect

這些是底層圖形函式。分別是畫點、讀點、畫水平線、畫豎直線及畫乙個實心矩形。之所以在底層實現這麼多函式,是為了提高效率。圖形函式支援多種畫圖模式,常用的有直接設定或alpha混合模式,從而可以支援各種圖形效果。

puthline、gethline、putvline、getvline、putbox、getbox及putboxmask

get* 函式用於從螢幕拷貝畫素到一塊記憶體區,而put*函式用於將存放於記憶體區的畫素畫到螢幕上。putboxmask 與putbox的唯一區別是,如果要畫的畫素是白色,就不會被畫到螢幕上,從而達到一種透明的效果。

4 總結與展望

到目前為止,我們的移植工作已經順利完成。minigui已經能成功執行在我們的***720平台上。作為底層支援的gui系統,minigui也應該像作業系統一樣是開放原始碼的自由軟體,並應該得到開發商的共同推動。到目前為止,已經有多家嵌入式系統開發商採用minigui開發嵌入式系統,並且已經開發出了許多重要的應用程式。我們期望能夠有更多的人加入minigui的開發,共同促成minigui成為嵌入式 linux系統上的標準gui。儘管minigui目前的功能已經非常強大,並且已經成功應用於許多嵌入式系統,但還需要在如下領域進行開發:

◇ 建立乙個 c++ 類庫來封裝minigui的api;

◇ 建立基於傳統程序級客戶/伺服器體系結構的 minigui,以便能夠讓minigui適合於一些較大的嵌入式系統,比如支援全功能瀏覽器的機頂盒。

隨著minigui不斷推廣和功能的加強,它也將在實際應用中不斷走向成熟。實時嵌入式系統上的gui開發正處於開始階段。在這個領域,有許多技術難題等待自由軟體程式設計師去解決。

嵌入式 linux 編譯

第二次換了編譯環境編譯時又提示 make 3 drivers video console vgacon.o 錯誤 1 在網上搜尋結果 根據資訊的大概意思是關於vga的支援問題,在這裡我直接把關於vga的配置選項去掉不選,即 在執行 make menuconfig 配置時 不選vga 驅動。devic...

linux嵌入式開發

我的環境 主機 ubuntu 64位 開發板 mini2440 6 makefile檔案修改 在 opt friendlyarm mini2440 linux 2.6.29下執行 sudo vi.makefile 搜尋arm linux得到乙個結果 cross compile?arm linux 然...

嵌入式 Linux介紹

嵌入式 linux介紹 一 嵌入式是一門it技術。嵌入式這門it技術是幹什麼的?他有什麼價值?專門生產功能專一的智慧型電子產品 電子裝置 什麼是電子裝置?通電的東西,嵌入式來搞定,而且沒通電的影象化介面屬於應用層的那種,嵌入式也可以搞定。二 嵌入式開發的分類 基於系統平台的開發 做出來的產品有搭載系...