出版時間:2010-5 出版社:北京航空航天大學(xué)出版社 作者:李玉東,李玉萍 編著 頁數(shù):209
Tag標(biāo)簽:無
前言
第一個問題,為什么要寫這本書?現(xiàn)在很多面向嵌入式Linux編程的書籍理論性很強,但并不針對某一領(lǐng)域,對于解決某一領(lǐng)域的特定問題指導(dǎo)性較弱。利用嵌入式Linux來構(gòu)建系統(tǒng),應(yīng)用于便攜式終端產(chǎn)品的居多,就軟件方面而言,這類產(chǎn)品主要有兩個環(huán)節(jié)需要把握:一是Linux內(nèi)核(包括驅(qū)動)的移植;二是GUI(Graphical User Interface,即圖形用戶界面)層與應(yīng)用層軟件的設(shè)計。本書就是基于后一個環(huán)節(jié)展開的。有人說,嵌入式Linux的最大問題是其GUI沒有統(tǒng)一標(biāo)準(zhǔn)。但不知道這是它的缺點還是優(yōu)點,是否應(yīng)該由如Microsoft或Nokia這種級別的公司在這個操作系統(tǒng)平臺上構(gòu)建一個全世界都一樣的用戶界面,然后大家都用它的API來開發(fā)應(yīng)用程序呢?這個問題暫且不討論。嵌入式產(chǎn)品對于界面的需要千差萬別,MP3、MP4、導(dǎo)航儀、電視機頂盒、手機等五花八門。如果所有的界面都從“開始”菜單開始,操作起來不一定都很方便,另外,操作方式是用手指、遙控器、鼠標(biāo)還是別的什么東西是可以選擇的,因此,對于嵌入式產(chǎn)品,作者認(rèn)為個性化用戶界面才是合適的,任何一個GUI都不可能有如此好的適應(yīng)性和可配置性,把一個PDA風(fēng)格的GUI系統(tǒng)移植到機頂盒上,或把一個手機風(fēng)格的GUI移植到工控機里都是沒有意義的。解決問題的最好辦法,就是自己構(gòu)建一個小型的GUI環(huán)境,只針對具體應(yīng)用,與其他系統(tǒng)無關(guān)。那么,可能有人會說,量體裁衣,開發(fā)一個適合于自有項目的GUI環(huán)境固然很好,但這會不會很復(fù)雜,是不是會使項目周期拉長呢?本書可以告訴你,開發(fā)一個小型的嵌入式GUI系統(tǒng)其實很容易!何況網(wǎng)絡(luò)上有如此之多的開源代碼可供參考。當(dāng)然,無償復(fù)制開源軟件用于商業(yè)目的是不允許的。但人們的思想是自由的,這一點誰也否認(rèn)不了。另外,現(xiàn)在已經(jīng)開發(fā)完并開源的面向嵌入式Linux的GUI系統(tǒng)固然很多,而且還有一些人又在開發(fā)這個“柜”、那個“柜”的,但沒有人仔細(xì)討論到底一個嵌入式Linux GUI系統(tǒng)的體系結(jié)構(gòu)如何能讓使用者從全局把握系統(tǒng),從而開發(fā)出自己的GUI環(huán)境,作者認(rèn)為這是“授之以魚”還是“授之以漁”的問題。所以,作者寫了這本書,通過嵌入式Linux特定環(huán)節(jié)的應(yīng)用實例,即中間件層的GUI軟件,來闡釋Linux開發(fā),同時使讀者對于消息驅(qū)動的、輕量級窗口系統(tǒng)的實現(xiàn)有較為徹底的理解。第二個問題,這本書有什么特點?本書只針對GUI這個環(huán)節(jié)討論技術(shù)問題,討論其如何在嵌入式Linux上實現(xiàn),并用到了Linux開發(fā)的技術(shù)細(xì)節(jié),所以本書第一個特點是針對性強。另外,作者不想把這本書搞成一個Linux編程的百科全書,講清楚一個問題是最重要的,所以本書第二個特點是精煉。本書出版之前,其早期版本作者一直放在網(wǎng)站上,有很多人下載并在網(wǎng)絡(luò)上傳播。這樣做的目的不為賺錢,只希望對大家都有所幫助。由于時間有限,書中可能還存在一些錯誤。另外,嵌入式Linux以及GUI技術(shù)的飛速發(fā)展,使得書中提到的一些概念有可能不再新穎,或者其中提到的GUI的實現(xiàn)方法不見得適用于任何項目。但通過本書,可以了解到作者對于一個小型窗口系統(tǒng)的實現(xiàn)思路。如果書中提到的概念或用于示例的LGUI實現(xiàn)代碼有任何錯誤,歡迎讀者批評指正。本書能夠順利完成并出版,得到了很多老師與朋友的幫助,首先要感謝我的導(dǎo)師——北京大學(xué)人機交互與多媒體實驗室的王衡副教授,她給了我大量的指導(dǎo)與幫助。另外,奚小君、秦藝丹、李夏、李文陽、王文翩、劉彥軍、夏華、劉成功、王成、鄭浩、張明、張小鈴、李志華、趙處一、王成明、李自忠、秦仕軍、范佳新、王小良等朋友也給予了大力支持,在此向他們表示感謝!
內(nèi)容概要
本書針對使用Linux構(gòu)建嵌入式系統(tǒng)的一個關(guān)鍵環(huán)節(jié)——圖形用戶界面(GUI),首先講述了Linux編程的高級技巧,包括多進(jìn)程、多線程等技術(shù);然后通過實例重點講述了窗口系統(tǒng)的基本知識與實現(xiàn)技巧,為讀者開發(fā)自己的面向嵌入式Linux的GUI環(huán)境提供了一個參考實現(xiàn)范例。重點包括:LGUI多窗口的設(shè)計與實現(xiàn)、LGUI的消息管理、窗口與無效區(qū)的管理、設(shè)備上下文與圖形設(shè)備接口的設(shè)計與實現(xiàn)等?! ”緯m用于使用Linux構(gòu)建嵌入式系統(tǒng)的軟件工程師以及希望深入了解窗口系統(tǒng)實現(xiàn)原理的讀者。
書籍目錄
第1章 概論 1.1 嵌入式系統(tǒng)的基本概念 1.2 嵌入式系統(tǒng)的特征 1.3 選擇Linux構(gòu)建嵌入式系統(tǒng) 1.4 GUI在嵌入式Linux系統(tǒng)中的地位及要求 1.5 用戶界面概況 1.5.1 用戶界面的歷史 1.5.2 圖形用戶界面的特征 1.5.3 圖形用戶界面系統(tǒng)的結(jié)構(gòu)模型 1.5.4 用戶界面的發(fā)展:GUI+新人機交互技術(shù) 1.6 Linux圖形環(huán)境及桌面平臺簡介 1.7 各種嵌入式 Linux上的圖形庫與GUI系統(tǒng)介紹 1.7.1 Qt/Embedded 1.7.2 MicroWindows/NanoX 1.7.3 MiniGUI 1.7.4 OpenGUI 1.7.5 GTK+ 1.8 Linux系統(tǒng)中的多語言問題 1.9 一個嵌入式LinuxGUI系統(tǒng)開發(fā)的實例 1.9.1 開發(fā)GUI系統(tǒng)主要考慮的問題 1.9.2 后續(xù)講解的實例第2章 Linux基本編程知識 2.1 編譯器的使用 2.2 函數(shù)庫的使用 2.3 Makefile 2.4 GDB 2.5 建立交叉編譯環(huán)境 2.5.1 什么是交叉編譯環(huán)境 2.5.2 交叉編譯的基本概念 2.5.3 建立arm_linux交叉編譯環(huán)境 2.6 Linux下常見的圖形庫編程簡介 2.6.1 Qt 2.6.2 GTK+第3章 Linux高級程序設(shè)計簡介 3.1 Linux IPC介紹 3.1.1 信號 3.1.2 管道 3.1.3 消息隊列 3.1.4 信號量 3.1.5 共享內(nèi)存 3.1.6 Domain Socket 3.2 Linux多線程編程介紹 3.2.1 創(chuàng)建線程 3.2.2 線程的退出與取消 3.2.3 線程退出時的同步問題 3.2.4 線程清理函數(shù) 3.2.5 線程取消狀態(tài) 3.2.6 線程同步 3.2.7 第三方函數(shù)庫 3.3 FrameBuffer編程簡介第4章 基本體系結(jié)構(gòu) 4.1 基礎(chǔ)知識 4.1.1 嵌入式Linux的GUI到底有什么用 4.1.2 如何定義基本體系結(jié)構(gòu) 4.1.3 為什么用客戶機/服務(wù)器結(jié)構(gòu) 4.1.4 為什么要多進(jìn)程 4.1.5 為什么要多線程 4.2 體系結(jié)構(gòu)綜述 4.2.1 客戶機與服務(wù)器之間的通信通道 4.2.2 客戶機需要與服務(wù)器交換什么信息 4.2.3 服務(wù)器對客戶機進(jìn)程的管理 4.3 進(jìn)程創(chuàng)建與進(jìn)程的管理第5章 多窗口的設(shè)計與實現(xiàn)第6章 GUI中的消息管理第7章 窗口輸出及無效區(qū)的管理第8章 DC與GDI的設(shè)計與實現(xiàn)第9章 控件實現(xiàn)第10章 定制GUI對圖像的支持第11章 字庫及輸入法的實現(xiàn)第12章 GUI的移植第13章 LGUI應(yīng)用開發(fā)模式第14章 GUI系統(tǒng)的效率問題后記——LGUI開發(fā)的一些體會參考文獻(xiàn)
章節(jié)摘錄
插圖:這時候就需要一個“技術(shù)部經(jīng)理”出來說話,他來協(xié)調(diào)每個人發(fā)言的時間,以便每個人表達(dá)的信息都能為別人所了解。那么這個協(xié)調(diào)與被協(xié)調(diào)的關(guān)系算不算是一個客戶機/服務(wù)器結(jié)構(gòu)呢?一般意義上講應(yīng)該說不算,因為所謂客戶機/服務(wù)器結(jié)構(gòu)應(yīng)該是:客戶機發(fā)出請求,服務(wù)器進(jìn)行處理,并將處理的結(jié)果返回到客戶機。技術(shù)部開會的時候并不是每個工程師發(fā)請求到技術(shù)部經(jīng)理,由技術(shù)部經(jīng)理完成處理后返回信息到工程師。在這個系統(tǒng)中,技術(shù)部經(jīng)理只是一個協(xié)調(diào)者的角色,而不是服務(wù)者的角色,所以并不是通常意義上講的客戶機/服務(wù)器結(jié)構(gòu)。但是另一方面,客戶端有胖瘦之分,客戶端要求服務(wù)器端處理的事情可能很復(fù)雜,也可能很簡單。在很復(fù)雜的情況下,客戶端很少自己做事情,大部分事情都由服務(wù)器端完成;相反,客戶端可能要求服務(wù)器做很少的事情,大部分事情由自己完成。無論何種情況,它們之間有一個請求與被請求的關(guān)系、協(xié)調(diào)與被協(xié)調(diào)的關(guān)系。所以,在這里不必過多討論這是不是嚴(yán)格意義上的客戶機/服務(wù)器結(jié)構(gòu),姑且認(rèn)為協(xié)調(diào)者的角色就是服務(wù)器,被協(xié)調(diào)者的角色就是客戶機。在多個進(jìn)程同時運行的情況下,任何一個進(jìn)程在對屏幕進(jìn)行輸出的時候,都需要了解當(dāng)前屏幕上的哪些區(qū)域是町以輸出的,哪些區(qū)域是不可以輸出的。具體實現(xiàn)的時候,有兩種方法:一是所有的輸出都由一個服務(wù)進(jìn)程來完成,由這個服務(wù)進(jìn)程來確定當(dāng)前對于哪些屏幕區(qū)域的輸出請求是允許的,哪些是不允許的,這樣就避免了多個進(jìn)程對于屏幕區(qū)域的競爭;另一種方法就是其他進(jìn)程只從服務(wù)進(jìn)程那里請求并得到允許輸出的區(qū)域,而具體的輸出操作由自己完成。前一種方法面臨的問題是需要在進(jìn)程之間不停地傳遞大量數(shù)據(jù)。不同進(jìn)程之間除非通過IPc,否則因為不同的進(jìn)程空問不允許互相訪問數(shù)據(jù),大塊的數(shù)據(jù)需要在進(jìn)程之間傳遞,這是非常耗費資源的操作,這在嵌入式環(huán)境中更是不可取的。而后一種方法需要輸出的進(jìn)程只請求允許輸出的屏幕區(qū)域,輸出的操作由進(jìn)程自己完成,相對而言.效率會有很大提高。而LGUI就是采取了這種方式。4.1.4 為什么要多進(jìn)程從GUI的角度講,多進(jìn)程實際上是多個進(jìn)程對于屏幕的輸出管理。如果有很多進(jìn)程在同時運行,但并沒有屏幕輸出的要求,就談不上多進(jìn)程的管理。LGUI是一個支持多進(jìn)程、多線程的客戶機/服務(wù)器系統(tǒng)。為什么要多進(jìn)程?單個進(jìn)程不是更簡單嗎?當(dāng)然,并不是所有的嵌入式環(huán)境都要求多個進(jìn)程同時運行,或者同時要求進(jìn)行屏幕輸出。例如,一個機頂盒的GUI系統(tǒng),就不會這樣復(fù)雜。但在一些復(fù)雜的嵌入式環(huán)境中,多進(jìn)程是必需的,例如PDA等。不能要求用戶在PDA中添加一項功能,就重新將系統(tǒng)編譯一下。
后記
當(dāng)前,手持設(shè)備、智能終端、信息家電等嵌入式系統(tǒng)正得到蓬勃的發(fā)展。而現(xiàn)在出現(xiàn)的市場只是冰山一角。就像十多年前人們的夢想已變成活生生的現(xiàn)實一樣,一個網(wǎng)絡(luò)化、智能化的生活形態(tài)已經(jīng)越來越清晰地展現(xiàn)在人們的面前。而嵌入式系統(tǒng)的發(fā)展,正在為這個大潮起著推波助瀾的作用。與面向桌面計算的PC不同,嵌入式系統(tǒng)的最大特色是“個性化”,沒有固定模式,尤其是用戶界面。這注定了“定制”將會無處不在。這也使得嵌入式系統(tǒng)的市場將在很大程度上會“碎塊化”,沒有哪家公司可以統(tǒng)一市場,形成事實上的標(biāo)準(zhǔn)。嵌入式系統(tǒng)定制化的特點本身就要求系統(tǒng)是開放的,可量身定做的,這也就是為什么有很多公司從WinCE轉(zhuǎn)向Linux的原因。另外,Linux的低成本特點,可大大降低最終嵌入式系統(tǒng)的成本。嵌入式系統(tǒng)的蓬勃發(fā)展,使得很多業(yè)內(nèi)的大公司推出了專門針對嵌入式設(shè)備的專用芯片。由于Linux開放源碼、易于移植,并且由于Linux目前在嵌人式系統(tǒng)中所占據(jù)的舉足輕重的地位,幾乎所有的芯片制造商在推出新的芯片時,都會投入大量的人力、物力來移植Linux,并提供豐富的開發(fā)工具。有些公司甚至?xí)峁┌–PU、SDRAM、FLASH、LCD、TouchPanel、KeyBoard在內(nèi)的功能齊全的測試板和所有這些外部設(shè)備基于Linux的驅(qū)動程序。這使得嵌入式Linux的GUI系統(tǒng)成為一個完整產(chǎn)品構(gòu)架中非常重要的環(huán)節(jié),如果在GUI基礎(chǔ)上進(jìn)一步構(gòu)造面向某一行業(yè)的應(yīng)用,為行業(yè)用戶提供解決方案,將為嵌入式Linux的發(fā)展起到一定的推動作用。開發(fā)一個中等規(guī)模的系統(tǒng),首先需要有全局意識,但除此之外,對一個完全陌生的系統(tǒng),并不完全是“需求一設(shè)計一編碼一調(diào)試”的過程,而是需要不斷地反復(fù)。不斷地通過編寫代碼來證明設(shè)計是可以實現(xiàn)的,且該種實現(xiàn)方法的非功能指標(biāo)是滿足設(shè)計要求的,然后再重新調(diào)整最初的框架。這正是一個軟件工程中所講的“迭代”過程。唯一滿足工程設(shè)計標(biāo)準(zhǔn)的文檔,就是源代碼清單。對于一個需求明確、功能復(fù)雜的系統(tǒng),可以通過一些圖表展示系統(tǒng)設(shè)計,但經(jīng)過驗證的框架性的代碼也許才是最好的設(shè)計文檔。在對系統(tǒng)功能、實現(xiàn)的環(huán)境都了解有限的情況下,憑空進(jìn)行設(shè)計,絕大多數(shù)情況下是沒有任何意義的。
編輯推薦
《精通嵌入式Linux編程:構(gòu)建自己的GUI環(huán)境》是由北京航空航天大學(xué)出版社出版的。
圖書封面
圖書標(biāo)簽Tags
無
評論、評分、閱讀與下載