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