精通嵌入式Linux編程:構(gòu)建自己的GUI環(huán)境
定 價(jià):28 元
- 作者:李玉東 ,李玉萍 著
- 出版時(shí)間:2010/5/1
- ISBN:9787512400665
- 出 版 社:北京航空航天大學(xué)出版社
- 中圖法分類:TP316.81
- 頁(yè)碼:209
- 紙張:膠版紙
- 版次:1
- 開本:16開
本書針對(duì)使用Linux構(gòu)建嵌入式系統(tǒng)的一個(gè)關(guān)鍵環(huán)節(jié)——圖形用戶界面(GUI),首先講述了Linux編程的高級(jí)技巧,包括多進(jìn)程、多線程等技術(shù);然后通過實(shí)例重點(diǎn)講述了窗口系統(tǒng)的基本知識(shí)與實(shí)現(xiàn)技巧,為讀者開發(fā)自己的面向嵌入式Linux的GUI環(huán)境提供了一個(gè)參考實(shí)現(xiàn)范例。重點(diǎn)包括:LGUI多窗口的設(shè)計(jì)與實(shí)現(xiàn)、LGUI的消息管理、窗口與無(wú)效區(qū)的管理、設(shè)備上下文與圖形設(shè)備接口的設(shè)計(jì)與實(shí)現(xiàn)等。
本書適用于使用Linux構(gòu)建嵌入式系統(tǒng)的軟件工程師以及希望深入了解窗口系統(tǒng)實(shí)現(xiàn)原理的讀者。
第一個(gè)問題,為什么要寫這本書?
現(xiàn)在很多面向嵌入式Linux編程的書籍理論性很強(qiáng),但并不針對(duì)某一領(lǐng)域,對(duì)于解決某一領(lǐng)域的特定問題指導(dǎo)性較弱。
利用嵌入式Linux來構(gòu)建系統(tǒng),應(yīng)用于便攜式終端產(chǎn)品的居多,就軟件方面而言,這類產(chǎn)品主要有兩個(gè)環(huán)節(jié)需要把握:一是Linux內(nèi)核(包括驅(qū)動(dòng))的移植;二是GUI(Graphical User Interface,即圖形用戶界面)層與應(yīng)用層軟件的設(shè)計(jì)。本書就是基于后一個(gè)環(huán)節(jié)展開的。
有人說,嵌入式Linux的最大問題是其GUI沒有統(tǒng)一標(biāo)準(zhǔn)。但不知道這是它的缺點(diǎn)還是優(yōu)點(diǎn),是否應(yīng)該由如Microsoft或Nokia這種級(jí)別的公司在這個(gè)操作系統(tǒng)平臺(tái)上構(gòu)建一個(gè)全世界都一樣的用戶界面,然后大家都用它的API來開發(fā)應(yīng)用程序呢?這個(gè)問題暫且不討論。嵌入式產(chǎn)品對(duì)于界面的需要千差萬(wàn)別,MP3、MP4、導(dǎo)航儀、電視機(jī)頂盒、手機(jī)等五花八門。如果所有的界面都從“開始”菜單開始,操作起來不一定都很方便,另外,操作方式是用手指、遙控器、鼠標(biāo)還是別的什么東西是可以選擇的,因此,對(duì)于嵌入式產(chǎn)品,作者認(rèn)為個(gè)性化用戶界面才是合適的,
任何一個(gè)GUI都不可能有如此好的適應(yīng)性和可配置性,把一個(gè)PDA風(fēng)格的GUI系統(tǒng)移植到機(jī)頂盒上,或把一個(gè)手機(jī)風(fēng)格的GUI移植到工控機(jī)里都是沒有意義的。解決問題的最好辦法,就是自己構(gòu)建一個(gè)小型的GUI環(huán)境,只針對(duì)具體應(yīng)用,與其他系統(tǒng)無(wú)關(guān)。
那么,可能有人會(huì)說,量體裁衣,開發(fā)一個(gè)適合于自有項(xiàng)目的GUI環(huán)境固然很好,但這會(huì)不會(huì)很復(fù)雜,是不是會(huì)使項(xiàng)目周期拉長(zhǎng)呢?本書可以告訴你,開發(fā)一個(gè)小型的嵌入式GUI系統(tǒng)其實(shí)很容易!何況網(wǎng)絡(luò)上有如此之多的開源代碼可供參考。當(dāng)然,無(wú)償復(fù)制開源軟件用于商業(yè)目的是不允許的。但人們的思想是自由的,這一點(diǎn)誰(shuí)也否認(rèn)不了。
另外,現(xiàn)在已經(jīng)開發(fā)完并開源的面向嵌入式Linux的GUI系統(tǒng)固然很多,而且還有一些人又在開發(fā)這個(gè)“柜”、那個(gè)“柜”的,但沒有人仔細(xì)討論到底一個(gè)嵌入式Linux GUI系統(tǒng)的體系結(jié)構(gòu)如何能讓使用者從全局把握系統(tǒng),從而開發(fā)出自己的GUI環(huán)境,作者認(rèn)為這是“授之以魚”還是“授之以漁”的問題。
所以,作者寫了這本書,通過嵌入式Linux特定環(huán)節(jié)的應(yīng)用實(shí)例,即中間件層的GUI軟件,來闡釋Linux開發(fā),同時(shí)使讀者對(duì)于消息驅(qū)動(dòng)的、輕量級(jí)窗口系統(tǒng)的實(shí)現(xiàn)有較為徹底的理解。
第二個(gè)問題,這本書有什么特點(diǎn)?
本書只針對(duì)GUI這個(gè)環(huán)節(jié)討論技術(shù)問題,討論其如何在嵌入式Linux上實(shí)現(xiàn),并用到了Linux開發(fā)的技術(shù)細(xì)節(jié),所以本書第一個(gè)特點(diǎn)是針對(duì)性強(qiáng)。
另外,作者不想把這本書搞成一個(gè)Linux編程的百科全書,講清楚一個(gè)問題是最重要的,所以本書第二個(gè)特點(diǎn)是精煉。
本書出版之前,其早期版本作者一直放在網(wǎng)站上,有很多人下載并在網(wǎng)絡(luò)上傳播。這樣做的目的不為賺錢,只希望對(duì)大家都有所幫助。
由于時(shí)間有限,書中可能還存在一些錯(cuò)誤。另外,嵌入式Linux以及GUI技術(shù)的飛速發(fā)展,使得書中提到的一些概念有可能不再新穎,或者其中提到的GUI的實(shí)現(xiàn)方法不見得適用于任何項(xiàng)目。但通過本書,可以了解到作者對(duì)于一個(gè)小型窗口系統(tǒng)的實(shí)現(xiàn)思路。如果書中提到的概念或用于示例的LGUI實(shí)現(xiàn)代碼有任何錯(cuò)誤,歡迎讀者批評(píng)指正。
本書能夠順利完成并出版,得到了很多老師與朋友的幫助,首先要感謝我的導(dǎo)師——北京大學(xué)人機(jī)交互與多媒體實(shí)驗(yàn)室的王衡副教授,她給了我大量的指導(dǎo)與幫助。另外,奚小君、秦藝丹、李夏、李文陽(yáng)、王文翩、劉彥軍、夏華、劉成功、王成、鄭浩、張明、張小鈴、李志華、趙處一、王成明、李自忠、秦仕軍、范佳新、王小良等朋友也給予了大力支持,在此向他們表示感謝!
第1章 概論1
1.1 嵌入式系統(tǒng)的基本概念1
1.2 嵌入式系統(tǒng)的特征1
1.3 選擇Linux構(gòu)建嵌入式系統(tǒng)2
1.4 GUI在嵌入式Linux系統(tǒng)中的地位及要求3
1.5 用戶界面概況4
1.5.1 用戶界面的歷史4
1.5.2 圖形用戶界面的特征4
1.5.3 圖形用戶界面系統(tǒng)的結(jié)構(gòu)模型5
1.5.4 用戶界面的發(fā)展:GUI+新人機(jī)交互技術(shù)6
1.6 Linux圖形環(huán)境及桌面平臺(tái)簡(jiǎn)介6
1.7 各種嵌入式Linux上的圖形庫(kù)與GUI系統(tǒng)介紹13
1.7.1 Qt/Embedded13
1.7.2 MicroWindows/NanoX14
1.7.3 MiniGUI15
1.7.4 OpenGUI16
1.7.5 GTK+17
1.8 Linux系統(tǒng)中的多語(yǔ)言問題18
1.9 一個(gè)嵌入式LinuxGUI系統(tǒng)開發(fā)的實(shí)例21
1.9.1 開發(fā)GUI系統(tǒng)主要考慮的問題22
1.9.2 后續(xù)講解的實(shí)例24
第2章 Linux基本編程知識(shí)25
2.1 編譯器的使用25
2.2 函數(shù)庫(kù)的使用27
2.3 Makefile28
2.4 GDB30
2.5 建立交叉編譯環(huán)境34
2.5.1 什么是交叉編譯環(huán)境34
2.5.2 交叉編譯的基本概念34
2.5.3 建立arm_linux交叉編譯環(huán)境34
2.6 Linux下常見的圖形庫(kù)編程簡(jiǎn)介42
2.6.1 Qt43
2.6.2 GTK+57
第3章 Linux高級(jí)程序設(shè)計(jì)簡(jiǎn)介62
3.1 LinuxIPC介紹62
3.1.1 信號(hào)63
3.1.2 管道68
3.1.3 消息隊(duì)列71
3.1.4 信號(hào)量71
3.1.5 共享內(nèi)存71
3.1.6 DomainSocket73
3.2 Linux多線程編程介紹77
3.2.1 創(chuàng)建線程78
3.2.2 線程的退出與取消81
3.2.3 線程退出時(shí)的同步問題83
3.2.4 線程清理函數(shù)83
3.2.5 線程取消狀態(tài)84
3.2.6 線程同步84
3.2.7 第三方函數(shù)庫(kù)94
3.3 FrameBuffer編程簡(jiǎn)介95
第4章 基本體系結(jié)構(gòu)100
4.1 基礎(chǔ)知識(shí)100
4.1.1 嵌入式Linux的GUI到底有什么用100
4.1.2 如何定義基本體系結(jié)構(gòu)101
4.1.3 為什么用客戶機(jī)/服務(wù)器結(jié)構(gòu)101
4.1.4 為什么要多進(jìn)程102
4.1.5 為什么要多線程103
4.2 體系結(jié)構(gòu)綜述103
4.2.1 客戶機(jī)與服務(wù)器之間的通信通道103
4.2.2 客戶機(jī)需要與服務(wù)器交換什么信息105
4.2.3 服務(wù)器對(duì)客戶機(jī)進(jìn)程的管理107
4.3 進(jìn)程創(chuàng)建與進(jìn)程的管理109
第5章 多窗口的設(shè)計(jì)與實(shí)現(xiàn)110
5.1 窗口樹110
5.2 窗口的Z序112
5.3 窗口的剪切與剪切域112
5.3.1 如何生成窗口剪切域112
5.3.2 窗口/控件剪切域的生成過程113
5.3.3 窗口剪切域的存儲(chǔ)方法114
5.4 進(jìn)程主窗口的初始剪切域與進(jìn)程內(nèi)窗體剪切域115
5.5 客戶端對(duì)剪切域的管理116
5.6 窗口類的注冊(cè)管理117
5.6.1 注冊(cè)內(nèi)容118
5.6.2 如何管理注冊(cè)窗口類118
5.6.3 注冊(cè)窗口類如何發(fā)揮作用121
第6章 GUI中的消息管理123
6.1 外部事件收集與分發(fā)123
6.2 消息隊(duì)列125
6.3 GUI的消息125
6.3.1 LGUI的消息隊(duì)列結(jié)構(gòu)126
6.3.2 通知消息(NotifyMessage)128
6.3.3 郵寄消息129
6.3.4 同步消息131
6.3.5 繪制消息132
6.3.6 其他消息發(fā)送方式134
6.4 LGUI中消息堆的內(nèi)存管理134
第7章 窗口輸出及無(wú)效區(qū)的管理137
7.1 窗口的客戶區(qū)與非客戶區(qū)137
7.2 坐標(biāo)系統(tǒng)137
7.3 輸出管理機(jī)制138
7.4 無(wú)效區(qū)139
第8章 DC與GDI的設(shè)計(jì)與實(shí)現(xiàn)142
8.1 設(shè)備上下文DC的描述142
8.2 GDI145
8.3 預(yù)定義GDI對(duì)象的實(shí)現(xiàn)145
8.4 GDI對(duì)象的描述結(jié)構(gòu)及創(chuàng)建方法146
8.5 將GDI對(duì)象選入DC中147
8.6 GDI繪圖及優(yōu)化147
8.7 圖形庫(kù)156
8.7.1 GD156
8.7.2 Cairo157
8.7.3 AGG157
8.7.4 GDI與GDI+160
第9章 控件實(shí)現(xiàn)163
9.1 如何實(shí)現(xiàn)一個(gè)控件163
9.2 不同消息的處理過程169
第10章 定制GUI對(duì)圖像的支持174
10.1 GUI中圖像解碼的基本需求174
10.2 BMP文件175
10.3 JPEG文件176
10.4 GIF文件177
10.5 PNG文件178
第11章 字庫(kù)及輸入法的實(shí)現(xiàn)180
11.1 字符集與字符編碼180
11.1.1 ASCII碼180
11.1.2 DBCS雙字符集180
11.1.3 Unicode181
11.2 在嵌入式GUI中如何支持字符集與編碼183
11.3 在GUI中選擇合適的字符集184
11.4 關(guān)于字庫(kù)的問題185
11.5 FreeType189
11.6 輸入法192
第12章 GUI的移植194
12.1 操作系統(tǒng)適配層194
12.2 輸入設(shè)備的抽象198
12.3 顯示設(shè)備的差異199
第13章 LGUI應(yīng)用開發(fā)模式200
13.1 應(yīng)用開發(fā)的模式200
13.2 開發(fā)調(diào)試方法202
13.3 應(yīng)用程序簡(jiǎn)例203
第14章 GUI系統(tǒng)的效率問題206
后記——LGUI開發(fā)的一些體會(huì)208
參考文獻(xiàn)210
這時(shí)候就需要一個(gè)“技術(shù)部經(jīng)理”出來說話,他來協(xié)調(diào)每個(gè)人發(fā)言的時(shí)間,以便每個(gè)人表達(dá)的信息都能為別人所了解。那么這個(gè)協(xié)調(diào)與被協(xié)調(diào)的關(guān)系算不算是一個(gè)客戶機(jī)/服務(wù)器結(jié)構(gòu)呢?一般意義上講應(yīng)該說不算,因?yàn)樗^客戶機(jī)/服務(wù)器結(jié)構(gòu)應(yīng)該是:客戶機(jī)發(fā)出請(qǐng)求,服務(wù)器進(jìn)行處理,并將處理的結(jié)果返回到客戶機(jī)。技術(shù)部開會(huì)的時(shí)候并不是每個(gè)工程師發(fā)請(qǐng)求到技術(shù)部經(jīng)理,由技術(shù)部經(jīng)理完成處理后返回信息到工程師。在這個(gè)系統(tǒng)中,技術(shù)部經(jīng)理只是一個(gè)協(xié)調(diào)者的角色,而不是服務(wù)者的角色,所以并不是通常意義上講的客戶機(jī)/服務(wù)器結(jié)構(gòu)。但是另一方面,客戶端有胖瘦之分,客戶端要求服務(wù)器端處理的事情可能很復(fù)雜,也可能很簡(jiǎn)單。在很復(fù)雜的情況下,客戶端很少自己做事情,大部分事情都由服務(wù)器端完成;相反,客戶端可能要求服務(wù)器做很少的事情,大部分事情由自己完成。無(wú)論何種情況,它們之間有一個(gè)請(qǐng)求與被請(qǐng)求的關(guān)系、協(xié)調(diào)與被協(xié)調(diào)的關(guān)系。所以,在這里不必過多討論這是不是嚴(yán)格意義上的客戶機(jī)/服務(wù)器結(jié)構(gòu),姑且認(rèn)為協(xié)調(diào)者的角色就是服務(wù)器,被協(xié)調(diào)者的角色就是客戶機(jī)。
在多個(gè)進(jìn)程同時(shí)運(yùn)行的情況下,任何一個(gè)進(jìn)程在對(duì)屏幕進(jìn)行輸出的時(shí)候,都需要了解當(dāng)前屏幕上的哪些區(qū)域是町以輸出的,哪些區(qū)域是不可以輸出的。具體實(shí)現(xiàn)的時(shí)候,有兩種方法:一是所有的輸出都由一個(gè)服務(wù)進(jìn)程來完成,由這個(gè)服務(wù)進(jìn)程來確定當(dāng)前對(duì)于哪些屏幕區(qū)域的輸出請(qǐng)求是允許的,哪些是不允許的,這樣就避免了多個(gè)進(jìn)程對(duì)于屏幕區(qū)域的競(jìng)爭(zhēng);另一種方法就是其他進(jìn)程只從服務(wù)進(jìn)程那里請(qǐng)求并得到允許輸出的區(qū)域,而具體的輸出操作由自己完成。前一種方法面臨的問題是需要在進(jìn)程之間不停地傳遞大量數(shù)據(jù)。不同進(jìn)程之間除非通過IPc,否則因?yàn)椴煌倪M(jìn)程空問不允許互相訪問數(shù)據(jù),大塊的數(shù)據(jù)需要在進(jìn)程之間傳遞,這是非常耗費(fèi)資源的操作,這在嵌入式環(huán)境中更是不可取的。而后一種方法需要輸出的進(jìn)程只請(qǐng)求允許輸出的屏幕區(qū)域,輸出的操作由進(jìn)程自己完成,相對(duì)而言.效率會(huì)有很大提高。而LGUI就是采取了這種方式。
4.1.4 為什么要多進(jìn)程
從GUI的角度講,多進(jìn)程實(shí)際上是多個(gè)進(jìn)程對(duì)于屏幕的輸出管理。如果有很多進(jìn)程在同時(shí)運(yùn)行,但并沒有屏幕輸出的要求,就談不上多進(jìn)程的管理。
LGUI是一個(gè)支持多進(jìn)程、多線程的客戶機(jī)/服務(wù)器系統(tǒng)。為什么要多進(jìn)程?單個(gè)進(jìn)程不是更簡(jiǎn)單嗎?
當(dāng)然,并不是所有的嵌入式環(huán)境都要求多個(gè)進(jìn)程同時(shí)運(yùn)行,或者同時(shí)要求進(jìn)行屏幕輸出。例如,一個(gè)機(jī)頂盒的GUI系統(tǒng),就不會(huì)這樣復(fù)雜。但在一些復(fù)雜的嵌入式環(huán)境中,多進(jìn)程是必需的,例如PDA等。不能要求用戶在PDA中添加一項(xiàng)功能,就重新將系統(tǒng)編譯一下。