MiniGUI 的軟件架構
4.1 基于 MiniGUI 的嵌入式系統結構
為什么 MiniGUI 能夠在如此眾多的嵌入式操作系統上運行?這是因為 MiniGUI 具有良好的軟件
架構,通過抽象層將 MiniGUI 上層和底層操作系統隔離開來。如圖 4.1 所示,基于 MiniGUI 的應用程序一般通過 ANSI C 庫、操作系統和驅動程序接口以及 MiniGUI 自身提供的 API 來實現自己的功能;MiniGUI 中的“可移植層”可將特定操作系統及底層硬件的細節隱藏起來,而上層應用程序則無需關心底層的硬件平臺輸出和輸入設備。
圖 4.1 MiniGUI 和嵌入式操作系統的關系
另外,MiniGUI 特有的運行模式概念,也為跨操作系統的支持提供了便利。
4.2 MiniGUI 運行模式
如前所述,和 Linux 這樣的類 UNIX 操作系統相比,一般意義上的傳統嵌入式操作系統具有一些
特殊性。舉例而言,諸如 uClinux、uC/OS-II、eCos 等操作系統,通常運行在沒有 MMU(內存管理單元,用于提供虛擬內存支持)的 CPU 上;這時,往往就沒有進程的概念,而只有線程或者任務的概念,這樣,MiniGUI 的運行環境也就大相徑庭。因此,為了適合不同的操作系統環境,我們可將MiniGUI 配置成三種不同的運行模式:
?? MiniGUI-Threads。運行在 MiniGUI-Threads 上的程序可以在不同的線程中建立多個窗口,
但所有的窗口在一個進程或者地址空間中運行。這種運行模式主要用來支持大多數傳統意義上
的嵌入式操作系統,比如 VxWorks、ThreadX、Nucleus、OSE、pSOS、uC/OS-II、eCos
等等。當然,在 Linux 和 uClinux 上,MiniGUI 也能以 MiniGUI-Threads 的模式運行。
?? MiniGUI-Processes5。和 MiniGUI-Threads 相反,MiniGUI-Processes 上的每個程序是單獨的進程,每個進程也可以建立多個窗口,并且實現了多進程窗口系統。MiniGUI-Processes 適合于具有完整 UNIX 特性的嵌入式操作系統,比如嵌入式 Linux。該運行模式在 MiniGUI
V2.0.x 中提供,有關該模式的詳細介紹將在下面闡述。
?? MiniGUI-Standalone。這種運行模式下,MiniGUI 可以以獨立任務的方式運行,既不需要多線
程也不需要多進程的支持,這種運行模式適合功能單一的應用場合。比如在一些使用 uClinux
的嵌入式產品中,因為各種原因而缺少線程支持,這時,就可以使用 MiniGUI-Standalone 來
開發應用軟件。
一般而言, MiniGUI-Standalone 模式的適應面最廣, 可以支持幾乎所有的操作系統6 ;
MiniGUI-Threads 模式的適用面次之,可運行在支持多任務的實時嵌入式操作系統,或者具備完整
UNIX 特性的普通操作系統;MiniGUI-Processes 模式的適用面較小,它僅適合于具備完整 UNIX 特性的嵌入式操作系統,比如 Linux。
但不論采用哪種運行模式,MiniGUI 為上層應用軟件提供了最大程度上的一致性;只有少數幾個
涉及初始化的接口在不同運行模式上有所不同。
4.2.1 MiniGUI-Processes 運行模式
MiniGUI-Processes 運行模式是 MiniGUI V2.0.x 在 MiniGUI-Lite 運行模式基礎上為具有多進程
支持的嵌入式操作系統提供的。MiniGUI V1.6.x 及以前版本為具有多進程特性的 Linux 操作系統提供MiniGUI-Lite 運行模式,使之在高效的客戶/服務器架構之上運行多個客戶進程,從而充分利用進程地址空間保護這樣的高級特性,有了這樣的特性,可大大提高基于 MiniGUI 的嵌入式系統的靈活性、穩定性以及可擴展性。比如,我們可以在 MiniGUI-Lite 上運行多個 MiniGUI 客戶進程,而單個進程的異常退出,不會影響其他的 MiniGUI 客戶進程。而且在這種架構之上,我們可以非常方便地集成第三方應用程序。其實,這也是許多嵌入式設備開發商采用 Linux 操作系統的重要理由。
但是,MiniGUI-Lite 運行模式雖然提供了多進程支持,但無法同時管理來自不同進程間的窗口,
因此,MiniGUI-Lite 用層的概念將不同的進程之間的窗口區分開來。這種實現方法雖然可適用于大多數屏幕分辨率較小的嵌入式設備,但仍然給應用程序的開發帶來了不便。
MiniGUI V2.0 則徹底解決了上述問題。MiniGUI V2.0 在 MiniGUI-Lite 運行模式基礎上,實現了
完整的多進程環境中的窗口系統,來自不同進程的窗口可以在同一桌面上協調存在。圖 4.2 給出了
MiniGUI V1.6.x 的 MiniGUI-Lite 運行模式及 MiniGUI 2.0.x 的 MiniGUI-Processes 運行模式在運行相同應用程序情況下的界面效果。
圖 4.2 MiniGUI V1.6.x 的 MiniGUI-Lite 運行模式及 MiniGUI 2.0.x 的 MiniGUI-Processes 運行模式圖 4.2 中,第一個屏幕運行了 vcongui 和推箱子游戲這兩個客戶進程。可以看到,我們在運行推箱子程序之后,就看不到 vcongui 程序了;第二個屏幕運行 vcongui、picview 和推箱子游戲這三個客戶進程,但我們可在桌面上看到所有的客戶進程窗口。
相比 MiniGUI-Lite,MiniGUI-Processes 運行模式具有明顯的優勢。這使得 MiniGUI 不僅可適用
于傳統的嵌入式操作系統(MiniGUI-Threads),還可適用于具有多進程特性的嵌入式操作系統,比如Linux 操作系統。另外,MiniGUI-Processes 也保留了 MiniGUI-Lite 的層概念,用戶可以將來自不同客戶進程的窗口放到不同的層中,從而實現類似 X Window 那樣的工作區。有了 MiniGUI-Processes運行模式,MiniGUI 的應用領域將進一步擴大,不僅可用于高端的嵌入式設備,還可能用于桌面環境。
4.2.2 各操作系統上可運行的 MiniGUI 運行模式
表 4.1 給出了 MiniGUI V2.0.x 和 V1.6.x 在各操作系統上可支持的運行模式。
表 4.1 MiniGUI 在操作系統上的運行模式
4.3 窗口系統
在 MiniGUI 中窗口組織為層次體系結構的形式。根窗口作為所有窗口的祖先,除了根窗口以外的
所有窗口都有父窗口,每一個窗口都可能有子窗口、兄弟窗口、祖先窗口和子孫窗口等。在同一級的窗口可以重疊,但是某個時刻只能有一個窗口輸出到重疊區域。
MiniGUI 中有三種窗口類型:主窗口、對話框和控件窗口(子窗口)。主窗口通常包括一些子窗口,
這些子窗口通常是控件窗口,也可以是自定義窗口類。應用程序還會創建其它類型的窗口,例如對話框
和消息框。對話框本質上就是主窗口,應用程序一般通過對話框提示用戶進行輸入操作。
4.4 通訊機制
MiniGUI 下的通訊是一種類似于 Win32 的消息機制,對于運行在線程模式的 MiniGUI 版本,線
程間的消息傳遞模型如下圖所示,其中的 Desktop 線程充當一個微服務器,所有的消息在 Event 線程獲取出來以后就會投遞給 Desktop 線程,然后再分發到目的應用程序主窗口上面,如圖 4.3 所示。
對于運行在進程版的 MiniGUI 來說,應用程序的消息傳遞則通過套接字來進行,相應的處理模型
如圖4.4 所示。
圖 4.4 MiniGUI-Processes 運行模式的消息通訊機制
4.5 字體
MiniGUI 提供了對點陣字體及矢量字體的支持,到目前為止,MiniGUI 已經實現了對 RBF 和
VBF 字體(這是 MiniGUI 定義的兩種點陣字體格式),以及 TrueType 和 Adobe Type1 字體等的支持。同時 MiniGUI 還提供了對 QPF(Qt Pre-rendered Fonts)字體的支持。同時,MiniGUI 可以對點陣字體進行自動放大處理,并可針對電視等特殊顯示設備實現防鋸齒功能。
目前 MiniGUI 支持 ISO8859-1~ISO8859-15、GB2312、GBK、GB18030、BIG5、EUC-JP、Shift-JIS、EUC-KR、UNICODE(UTF-8、UTF-16 編碼)等字符集。
4.6 輸入設備的支持
MiniGUI 支持各種通用的鼠標設備,對觸摸屏的支持也非常出色,并針對觸摸屏的校正為用戶提
供了校正接口。
MiniGUI 支持最多含 255 個鍵的各種鍵盤。此外,MiniGUI 還提供了對多種鍵盤布局的支持,除
支持常見的美式 PC 鍵盤布局之外,還支持法語、德語等西歐語種的鍵盤布局。
除了常見的輸入設備類型,如 PC 鍵盤、鼠標、觸摸屏之外,MiniGUI 的輸入抽象層機制也允許
支持遙控器、小鍵盤、按鍵等特殊的輸入設備。
4.7 輸入法
輸入法是 MiniGUI 為支持中文、韓文、日文等多字節字符集而引入的機制,和 Windows 系統下
的輸入法類似,輸入法通常以頂層窗口的形式出現,并截獲系統中的按鍵信息,經過適當的處理,將翻譯之后的字符發送到當前活動窗口。MiniGUI 提供了多種輸入法的支持,其中包括內碼、全拼、智能拼音、五筆及自然碼等輸入法。此外,在 MiniGUI 獨立的輸入法組件 mGi 中,還為用戶提供了軟鍵盤輸入法及手寫輸入法的框
架。
評論