?? minigui lite 版本的新改進.htm
字號:
<TABLE cellSpacing=0 cellPadding=0 width=137 align=right border=0>
<TBODY>
<TR>
<TD align=middle bgColor=#cc6633><FONT face=helvetica,helv,arial
color=#ffffff size=-1><B>目錄:</B></FONT></TD></TR>
<TR>
<TD width="100%" bgColor=#000000><FONT face=helvetica,helv,arial
size=-3><IMG height=1 alt="" src="MiniGUI Lite 版本的新改進.files/c.gif"
width=1 border=0></FONT></TD></TR>
<TR>
<TD width="100%" bgColor=#ffffff><FONT face=helvetica,helv,arial
size=-3><IMG height=4 alt="" src="MiniGUI Lite 版本的新改進.files/c.gif"
width=1 border=0></FONT></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/minigui-6/index.shtml#1"><FONT
face=宋體 size=2>引言:為什么要開發(fā)Lite版本</FONT></A> </TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/minigui-6/index.shtml#2"><FONT
face=宋體 size=2>Lite版本簡介</FONT></A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/minigui-6/index.shtml#3"><FONT
face=宋體 size=2>Lite版本的設(shè)計</FONT></A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/minigui-6/index.shtml#4"><FONT
face=宋體 size=2>Lite版本的一些實現(xiàn)細節(jié)</FONT></A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/minigui-6/index.shtml#4"><FONT
face=宋體 size=2>總結(jié)語</FONT></A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/minigui-6/index.shtml#resources"><FONT
face=宋體 size=2>資源</FONT></A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/minigui-6/index.shtml#author"><FONT
face=宋體 size=2>有關(guān)作者</FONT></A></TD></TR>
<TR>
<TD bgColor=#000000><FONT face=helvetica,helv,arial size=-3><IMG
height=3 alt="" src="MiniGUI Lite 版本的新改進.files/c.gif"
width=137></FONT></TD></TR></TBODY></TABLE><BR><BR><!-- comments #6: html content of the paper -->
<BLOCKQUOTE><EM>MiniGUI從0.98開始推出Lite版本。Lite版本是MiniGUI邁向嵌入式應(yīng)用重要的一步。在Lite版本中,我們使用了自己設(shè)計的引擎,拋棄了pthread庫,從而使得MiniGUI能夠輕裝上陣,更穩(wěn)定,更高效率,也更符合嵌入式系統(tǒng)應(yīng)用。本文介紹了MiniGUI
Lite版本的基于Unix IPC實現(xiàn)的多進程機制。并詳細介紹了一些實現(xiàn)細節(jié)。</EM></BLOCKQUOTE><A id=1
name=1></A>
<P><STRONG class=subhead>1 引言:為什么要開發(fā)Lite版本</STRONG></P>
<P>現(xiàn)在,大多數(shù)UNIX系統(tǒng)采用X 窗口系統(tǒng)作為圖形用戶界面,MS Windows 則采用
Microsoft公司自己設(shè)計的GUI系統(tǒng)。這兩種GUI系統(tǒng)也代表著目前通用GUI系統(tǒng)的兩種實現(xiàn)。比如,著名的自由軟件MicroWindows就同時實現(xiàn)了類似于MS
Windows的MicroWindows API 和類似于X Window的NanoX API。</P>
<P>MiniGUI 原來就采用了類似于MS Windows的體系結(jié)構(gòu),并且建立了基于線程的消息傳遞和窗口管理機制。然而,它是基于POSIX
線程的,這種實現(xiàn)提供最大程度上的數(shù)據(jù)共享,但也同時造成MiniGUI體系結(jié)構(gòu)上的脆弱。如果某個線程因為非法的數(shù)據(jù)訪問而終止運行,則整個系統(tǒng)都將受到影響。</P>
<P>另一種方法是采用UNIX進程間通信機制建立窗口系統(tǒng),即類似 X Window
的客戶/服務(wù)器體系。但是這種體系結(jié)構(gòu)也有它的先天不足,主要是通常的 IPC 機制無法提供高效的數(shù)據(jù)復(fù)制,大量的 CPU
資源用于各進程之間復(fù)制數(shù)據(jù)。在 PDA 等設(shè)備中,這種 CPU 資源的浪費將最終導(dǎo)致系統(tǒng)性能的降低以及設(shè)備耗電量的增加。</P>
<P>為了解決以上各種問題,同時也為了讓 MiniGUI更加適合于嵌入式系統(tǒng),我們開發(fā)了MiniGUI Lite 版本。</P><A id=2
name=2></A>
<P><STRONG class=subhead>2 Lite版本簡介</STRONG></P>
<P>在MiniGUI Lite 版本中,我們可以同時運行多個 MiniGUI 應(yīng)用程序。首先我們啟動一個服務(wù)器程序
mginit,然后我們可以從中啟動其他做為客戶運行的 MiniGUI
應(yīng)用程序。如果因為某種原因客戶終止,服務(wù)器可以繼續(xù)運行。mginit程序建立了一個虛擬控制臺窗口。我們可以從這個虛擬控制臺的命令行啟動其他的程序,甚至可以通過
gdb 調(diào)試這些程序。 這大大方便了MiniGUI應(yīng)用程序的調(diào)試。</P>
<P>MiniGUI-Lite 區(qū)別于 MiniGUI 原有版本的最大不同在于我們可以在 MiniGUI-Lite
程序中創(chuàng)建多個窗口,但不能啟動新的線程建立窗口。除此之外,其他幾乎所有的 API 都和 MiniGUI 原有版本是兼容的。因此,從 MiniGUI
原有版本向 MiniGUI-Lite 版本的移植是非常簡單的。象mglite-exec 包中的程序,其中所有的程序均來自 miniguiexec
包,而每個源文件的改動不超過 5 行。</P><A id=3 name=3></A>
<P><STRONG class=subhead>3 Lite版本的設(shè)計</STRONG></P>
<P>設(shè)計之初,我們確定MiniGUI Lite 版本的開發(fā)目的:</P>
<OL>
<LI>保持與原先 MiniGUI 版本在源代碼級 98% 以上的兼容。
<LI>不再使用 LinuxThreads。
<LI>可以同時運行多個基于 MiniGUI Lite 的應(yīng)用程序,即多個進程,并且提供前后臺進程的切換。 </LI></OL>
<P>顯然,要滿足這三個設(shè)計目的,如果采用傳統(tǒng)的 C/S 結(jié)構(gòu)對現(xiàn)有 MiniGUI 進行改造,應(yīng)該不難實現(xiàn)。但傳統(tǒng) C/S
結(jié)構(gòu)的缺陷卻無法避免。經(jīng)過對 PDA 等嵌入式系統(tǒng)的分析,我們發(fā)現(xiàn),某些 PDA
產(chǎn)品具有運行多個任務(wù)的能力,但同一時刻在屏幕上進行繪制的程序,一般不會超過兩個。因此,只要確保將這兩個進程的繪制相互隔離,就不需要采用復(fù)雜的 C/S
結(jié)構(gòu)處理多個進程窗口之間的互相剪切。在這種產(chǎn)品中,如果采用基于傳統(tǒng) C/S 結(jié)構(gòu)的多窗口系統(tǒng),實際是一種浪費。</P>
<P>因此,我們對 MiniGUI-Lite 版本進行了如下簡化設(shè)計:</P>
<OL>
<LI>每個進程維護自己的主窗口 Z 序,同一進程創(chuàng)建的主窗口之間互相剪切。也就是說,除了只有一個線程,只有一個消息循環(huán)之外,一個進程與原有的
MiniGUI 版本之間沒有任何區(qū)別。每個進程在進行屏幕繪制時,不需要考慮其他進程。
<LI>建立一個簡單的客戶/服務(wù)器體系,但確保最小化進程間的數(shù)據(jù)復(fù)制功能。因此,在服務(wù)器和客戶之間傳遞的數(shù)據(jù)僅限于輸入設(shè)備的輸入數(shù)據(jù),以及客戶和服務(wù)器之間的某些請求和響應(yīng)數(shù)據(jù)。
<LI>有一個服務(wù)器進程(mginit),它負責初始化一些輸入設(shè)備,并且通過 UNIX Domain 套接字將輸入設(shè)備的消息發(fā)送到前臺的
MiniGUI Lite 客戶進程。
<LI>服務(wù)器和客戶被分別限定在屏幕的某兩個不相交矩形內(nèi)進行繪制,同一時刻,只能有一個客戶及服務(wù)器進行屏幕繪制。其他客戶可繼續(xù)運行,但屏幕輸入被屏蔽。服務(wù)器可以利用
API 接口將某個客戶切換到前臺。同時,服務(wù)器和客戶之間采用信號和 System V 信號量進行同步。
<LI>服務(wù)器還采用 System V IPC 機制提供一些資源的共享,包括位圖、圖標、鼠標、字體等等,以便減少實際內(nèi)存的消耗。
</LI></OL><A id=4 name=4></A>
<P><STRONG class=subhead>4 Lite版本的一些實現(xiàn)細節(jié)</STRONG></P><STRONG>4.1
系統(tǒng)初始化</STRONG>
<P>應(yīng)用程序的入口點為main()函數(shù),而MiniGUI應(yīng)用程序的入口點為MiniGUIMain,在這兩個入口點之間,是MiniGUI的初始化部分和結(jié)束部分。如圖
1所示。</P>
<P align=center><IMG height=224 alt=""
src="MiniGUI Lite 版本的新改進.files/image01.gif" width=337 border=0><BR>圖 1
MiniGUI應(yīng)用程序流程</P>
<P>在系統(tǒng)初始化時,MiniGUI區(qū)分兩種情況:服務(wù)器(Server)和客戶(Client)。針對這兩種不同的情況,隨后的各項操作均有不同的處理,這主要依據(jù)全局變量mgServer。由于僅僅根據(jù)名稱判斷是否為服務(wù)器,所以服務(wù)器的名字只能是"mginit"。
InitGUI()是對MiniGUI進行初始化的函數(shù),它主要負責:</P>
<OL>
<LI>獲取有關(guān)終端的信息。
<LI>初始化圖形抽象層。
<LI>如果是服務(wù)器,則裝入共享資源,若為客戶則與共享資源建立連接。
<LI>建立與窗口活動有關(guān)的運行環(huán)境。
<LI>如果為服務(wù)器,則初始化事件驅(qū)動抽象層(IAL),如果為客戶,則打開與服務(wù)器事件驅(qū)動器的通道。
<LI>如果為服務(wù)器,則設(shè)定空閑處理為IdleHandler4Server,如果為客戶,則設(shè)定空閑處理為IdleHandle4Client。
</LI></OL>
<P>流程如圖 2(為突出重點,我們忽略了一些細節(jié)):</P>
<P align=center><IMG height=441 alt=""
src="MiniGUI Lite 版本的新改進.files/image02.gif" width=505 border=0><BR>圖 2
InitGUI流程</P><STRONG>4.2 共享資源初始化</STRONG>
<P>共享資源是客戶服務(wù)器模型中的重要元素,它由服務(wù)器負責創(chuàng)建和釋放,而提供所有客戶程序共享的數(shù)據(jù)資源。它的初始化過程由圖
3所示的調(diào)用流完成。</P>
<P align=center><IMG height=147 alt=""
src="MiniGUI Lite 版本的新改進.files/image03.gif" width=625 border=0><BR>圖 3
InitGUI調(diào)用流</P>
<P>如果是服務(wù)器,則初始化此結(jié)構(gòu),src/kernel/sharedres.c/LoadSharedResource()負責完成這一任務(wù),它的執(zhí)行流如圖
4所示:</P>
<P align=center><IMG height=295 alt=""
src="MiniGUI Lite 版本的新改進.files/image04.gif" width=313 border=0><BR>圖 4
LoadSharedResource 流程</P>
<P>對于客戶,則只需要與此結(jié)構(gòu)進行連接即可,它在src/kernel/sharedres.c/AttachSharedResource()實現(xiàn),參見圖
5:</P>
<P align=center><IMG height=193 alt=""
src="MiniGUI Lite 版本的新改進.files/image05.gif" width=296 border=0><BR>圖 5
AttachSharedResource 流程</P><STRONG>4.3 服務(wù)器客戶通信連接初始化</STRONG>
<P>在客戶服務(wù)器模型的討論中,我們還將詳細的討論服務(wù)器客戶的通信機制,這里只給出初始化的調(diào)用關(guān)系。見圖 6。</P>
<P align=center><IMG height=157 alt=""
src="MiniGUI Lite 版本的新改進.files/image06.gif" width=469 border=0><BR>圖 6
通信連接的初始化</P>
<P>ServerStartUp實現(xiàn)流程如圖 7所示:</P>
<P align=center><IMG height=254 alt=""
src="MiniGUI Lite 版本的新改進.files/image07.gif" width=296 border=0><BR>圖 7
ServerStartUp 流程</P>
<P>ClientStartUp()實現(xiàn)如圖 8所示:</P>
<P align=center><IMG height=192 alt=""
src="MiniGUI Lite 版本的新改進.files/image08.gif" width=296 border=0><BR>圖 8
ClientStartUp流程</P><STRONG>4.4 多進程模型</STRONG>
<P>Lite版本是支持客戶服務(wù)器(C/S)方式的多進程系統(tǒng),在運行過程中有且僅有一個服務(wù)器程序在運行,它的全局變量mgServer被設(shè)為TRUE,其余的MiniGUI應(yīng)用程序為客戶,mgServer變量被設(shè)為FALSE。各個應(yīng)用程序分別運行于各自不同的進程空間,如圖
9所示:</P>
<P align=center><IMG height=325 alt=""
src="MiniGUI Lite 版本的新改進.files/image09.gif" width=459 border=0><BR>圖 9
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -