本書系統論述了基于ARM處理器的嵌入式Linux系統開發的原理、方法與實踐。全書共15章,分別介紹了嵌入式Linux系統管理、Linux編程基礎、Linux高級編程、Linux內核開發、Linux系統移植和Linux驅動程序開發等。
本書內容吸收了作者在Linux系統教學、科研和實際項目研發中的經驗,實踐性強。在內容編排上,按照讀者學習的一般性規律,結合大量實例論述,能夠使讀者高效地掌握嵌入式Linux系統的基本原理和應用方法。本書既可以作為高等院校相關專業的教材,也可以作為從事嵌入式系統開發人員的參考用書。
嵌入式系統的知識體系龐大,在授課學時不斷減少的背景下,要根據不同專業對嵌入式課程體系進行具體的設計。對于嵌入式教學存在的種種弊端,應做到“因課施教”。嵌入式學習必須配合實踐,這是因為實踐可以激發學習興趣,提高學習能力,而且有助于檢驗學習效果。正是在這種背景下,筆者在總結教學團隊的豐富教學經驗的基礎上,從嵌入式操作系統開發的工程實踐出發,將操作系統安裝、操作系統開發、Linux高級編程、底層驅動等內容有機地結合在一起,構建起嵌入式系統開發的完整過程。力爭從實際應用角度出發,培養邏輯思維和創新思維能力,提高分析、解決實際工程問題的能力。
(1)從零開始,輕松入門系統闡述理論的同時,兼顧內容的實用性和可讀性,從C語言入手,便于理解和運用。
(2)經典實例,清晰直觀從Linux基本操作入手,以VI、GCC、高級編程為主線,直到系統驅動開發,均給出了豐富的實例,并給出了實例的完整代碼和運行結果,注重實例的科學分析方法,并妥善處理好知識點與實例的有效銜接。
(3)圖文并茂,操作簡單根據讀者認識和學習嵌入式開發的規律編排內容,將數學工具工程化,將抽象問題形象化,將復雜問題簡單化,將零散問題系統化,并給出筆者理解的“標簽”。
(4)教學課件配書教案(PPT)可到清華大學出版社網站本書頁面下載。
(5)學習輔導書中配套代碼,開發環境,讀者可通過QQ群獲取并在線學習答疑。
嵌入式系統及其應用是一個龐大的知識體系,筆者在多年的授課過程中,也很難選擇一本合適的書作為本科學生的授課教材。結合課堂講稿和學生的部分畢業設計內容,以及在學生學習過程中經常遇到的問題,筆者整理成本書——《嵌入式Linux系統開發——基于ARM處理器通用平臺》,之所以這么命名,是打破了以前ARM9體系或者ARM11體系的框架。Linux操作系統在ARM9之上的處理器均有較好的兼容,讀者稍加修改,代碼就能應用,所以命名時就回避了某一款處理器的限定。關于嵌入式有太多的內容可以介紹,本書側重應用,并結合了當前嵌入式的發展和應用。
嵌入式系統無疑是當前最熱門、最有發展前途的IT應用領域之一。嵌入式系統用在某些特定的專用設備上,通常這些設備的硬件資源(如處理器、存儲器等)非常有限,并且對成本很敏感,有時還對實時響應等要求很高。特別是隨著消費家電的智能化,嵌入式更顯重要。像我們平時常見的手機、PDA、電子字典、可視電話、數字相機、數字攝像機、機頂盒、高清電視、游戲機、智能玩具、交換機、路由器、數控設備或儀表、汽車電子、家電控制系統、醫療儀器、航天航空設備等都是典型的嵌入式系統。
嵌入式系統是軟硬結合的產品,嵌入式開發主要分為兩類。
一類是無線電相關專業,例如電子工程、通信工程等專業出身的人,他們主要搞硬件設計,有時需要開發一些與硬件關系最密切的最底層軟件(例如BootLoader、BoardSupportPackage)、最初級的硬件驅動程序等。他們的優勢是對硬件原理非常清楚,不足是他們更擅長定義各種硬件接口,但對復雜的軟件系統往往力不從心(例如嵌入式操作系統原理和復雜的應用軟件等)。
另一類是軟件、計算機專業出身的人,主要從事嵌入式操作系統和應用軟件的開發。如果我們學軟件的人對硬件原理和接口有較好的掌握,也完全可以編寫BSP和硬件驅動程序。嵌入式硬件設計完成后,各種功能就全靠軟件來實現了。嵌入式設備的增值很大程度上取決于嵌入式軟件,設備越智能,系統越復雜,軟件的作用越關鍵,這也是目前的趨勢。
目前,國內外的相關人才都很稀缺。一方面,該領域入門門檻較高,不僅要了解較底層的軟件(例如操作系統級、驅動程序級軟件),對軟件專業水平要求較高(嵌入式系統對軟件設計的時間和空間效率要求較高),而且必須熟悉硬件的工作原理,所以非專業IT人員很難切入這一領域;另一方面,該領域較新,發展太快,很多軟硬件技術出現時間不長或正在出現(例如ARM處理器、嵌入式操作系統、MPEG技術、無線通信協議等),掌握這些新技術的人較少。嵌入式人才稀缺,身價自然就高。嵌入式人才稀少的根本原因可能是大多數人無條件接觸該領域,這需要相應的嵌入式開發板和軟件,另外需要有經驗的人進行開發流程的指導。
與企業計算等應用軟件的開發人員不同,嵌入式領域人才的工作強度通常較低,收入卻很高。從事企業應用軟件的IT人員,這個用戶的系統開發完成后,又要去開發下一個用戶的系統,并且每個用戶的需求和完成時間都必須按客戶要求改變,往往疲于奔命,重復勞動。相比而言,開發嵌入式系統的公司,都有自己的產品計劃,按自己的節奏行事,所開發的產品通常是通用的,不會因客戶的不同而修改。某一型號的產品開發完成后,往往有較長的一段空閑時間(或只是對軟件進行一些小修補),有時間進行充電和休整。另外,從事嵌入式軟件開發的人員的工作范圍相對狹窄,所涉及的專業技術范圍比較小(ARM、RTOS、MPEG、802.11等),隨著時間的累積,經驗也逐漸累積,可“倚老賣老”,寥寥數語的指導就足夠讓初入道者琢磨半年。如果從事應用軟件開發,可能不同的客戶的軟件開發平臺也完全不同,這會使得開發工作也相對更加辛苦。
嵌入式開發更注重的是練習,嵌入式系統開發設計最難的是入門,嵌入式系統開發涉及知識較多,初學者很難從紛雜的知識中快速上手學習,現在市面上用于嵌入式開發的學習板比比皆是,價格都比較低廉,讀者可以買一款相對通用的開發板,按照書中的操作練習,本書將一步一步引導初學者進行嵌入式開發的學習。任何知識的學習都是由淺入深,由感性認識到理性認識,掌握了前幾章的學習,相信讀者一定能夠掌握嵌入式入門開發的基本要領。
本書主要由馮新宇編寫。此外,本書第11~15章由蔣洪波編寫。參與編寫的還有楊昕宇、劉宇瑩、劉琳、史殿發、孟瑩等。
感謝廣州碾展公司的技術支持!
感謝您選擇了本書,希望我們的努力對您的工作和學習有所幫助,也希望您把對本書的意見和建議反饋給我們。
作者
2017年4月
馮新宇黑龍江科技大學副教授,長期從事嵌入式系統項目開發和相關教學工作。曾主持或參與嵌入式相關課題和項目開發20余項;近10年來一直作為指導教師參與全國電子設計大賽、飛思卡爾電子設計大賽、黑龍江省電子設計大賽等工作,所指導的學生多次獲得各種賽事重大獎勵。代表性著作有《ADS2009射頻電路設計與仿真》、《四旋翼無人飛行器設計》與《ARMCortex-M3體系結構與編程》。
第1章Linux概述與系統管理1
1.1嵌入式系統概述1
1.1.1嵌入式系統的發展歷史1
1.1.2嵌入式系統的特點2
1.1.3嵌入式系統的體系結構2
1.1.4典型嵌入式系統介紹3
1.2嵌入式Linux基礎4
1.2.1Linux發行版本4
1.2.2Linux定制安裝6
1.3Linux常用命令18
1.3.1系統管理相關命令18
1.3.2文件管理相關命令19
1.3.3備份壓縮相關命令25
1.3.4網絡通信相關命令26
1.3.5其他常用命令30
1.4服務器配置34
1.4.1samba服務器34
1.4.2NFS服務器38
1.4.3TFTP服務器40
習題與練習42
第2章Linux腳本編程43
2.1常用shell命令43
2.2腳本編寫基礎44
2.2.1特殊字符44
2.2.2變量和參數46
2.2.3退出和退出狀態48
2.3流程控制49
2.3.1條件測試49
2.3.2操作符相關主題51
2.3.3循環控制53
2.3.4測試與分支55
習題與練習58
第3章Linux編程基礎59
3.1編輯器介紹59
3.1.1vi介紹59
3.1.2vi的各模式功能鍵60
3.2程序編譯與調試63
3.2.1gcc編譯流程64
3.2.2gcc編譯選項分析64
3.2.3gdb程序調試69
習題與練習75
第4章C語言進階76
4.1C語言的基本知識76
4.2數據類型77
4.2.1常量和變量78
4.2.2進制78
4.2.3字符79
4.2.4轉義符與字符集79
4.2.5類型轉換79
4.2.6輸入輸出82
4.2.7運算符83
4.3控制語句86
4.3.1分支語句86
4.3.2循環語句88
4.4數組與字符串97
4.4.1數組的定義97
4.4.2數組本質探討98
4.4.3一維數組和二維數組99
4.4.4字符串101
4.5函數103
4.5.1函數的定義103
4.5.2函數的深度剖析103
4.5.3函數的作用剖析104
4.6指針108
4.6.1指針的本質108
4.6.2連續空間的內存地址108
4.6.3指針變量109
4.6.4指針數組和指針的指針111
4.6.5函數和指針115
4.7預處理指令119
4.7.1宏定義120
4.7.2#include121
4.7.3條件編譯121
習題與練習123
第5章文件I/O編程124
5.1文件和目錄124
5.2目錄操作126
5.3文件操作134
5.3.1基本概念134
5.3.2檢查文件及確定文件的權限136
5.3.3創建文件137
5.3.4打開文件138
5.3.5關閉文件139
5.3.6刪除文件140
5.3.7文件指針移動142
5.3.8其他常用函數145
5.4設備控制148
5.5Linux時間編程159
5.5.1取得目前的時間159
5.5.2取得目前時間和日期160
5.5.3取得當地目前時間和日期161
5.5.4將時間結構數據轉換成經過的秒數162
5.5.5設置目前時間162
5.5.6取得當前時間163
5.5.7將時間和日期以ASCII碼格式表示164
5.5.8將時間和日期以字符串格式表示164
習題與練習165
第6章進程控制166
6.1進程控制概述166
6.1.1進程的定義166
6.1.2進程控制塊167
6.1.3分配進程描述符168
6.1.4進程的創建168
6.1.5進程狀態169
6.1.6進程調度171
6.1.7虛擬內存172
6.1.8文件鎖172
6.2進程控制編程173
6.2.1創建進程173
6.2.2進程終止181
6.2.3守護進程186
習題與練習187
第7章進程間通信188
7.1進程間通信概述188
7.2管道通信190
7.2.1無名管道190
7.2.2有名管道192
7.2.3標準流管道195
7.3消息隊列196
7.3.1鍵值196
7.3.2打開/創建消息隊列197
7.3.3發送消息197
7.3.4接收消息198
7.3.5消息控制198
7.4信號201
7.4.1信號處理的方式201
7.4.2信號操作指令201
7.5信號量207
7.5.1信號量創建208
7.5.2信號量操作208
7.6內存共享214
7.6.1共享內存創建214
7.6.2共享內存的操作216
7.6.3共享內存段連接到本進程空間216
7.6.4共享內存解除217
習題與練習220
第8章多線程技術221
8.1Linux多線程概念221
8.2Linux線程實現222
8.2.1線程創建222
8.2.2線程退出224
8.2.3線程等待226
8.2.4線程標識獲取228
8.2.5線程清除229
8.3線程函數傳遞及修改線程的屬性232
8.3.1線程函數傳遞232
8.3.2綁定屬性235
8.3.3分離屬性236
8.3.4優先級屬性237
8.3.5線程的互斥239
8.3.6線程的同步241
8.3.7信號量243
習題與練習245
學習Linux環境高級編程,首先學習的是文件的操作。因為有一句很有趣的話“Linux下一切皆文件”。所以掌握了文件操作的方法,也就算摸到了門路。
5.1文件和目錄
首先直觀地感受一下,在終端下輸入命令ls-l,如圖5-1所示。
圖5-1文件目錄
圖5-1的前2行為
drwxr-xr-x2rootroot40962015-06-251111
-rw-r--r--1rootroot02015-06-2511.c
1.drwxr-xr-x
drwxr-xr-x代表的是文件類型和文件權限。常用的文件類型有:
(1)-:普通文件,存各種數據。
(2)d:目錄文件,存結構體,結構體內部標識這個目錄中的文件名稱等信息。
(3)l:鏈接文件,需要注意的是,軟鏈接才是文件,而硬鏈接僅僅是一節點。
(4)c:字符設備,除了塊設備都是字符設備,沒有扇區的概念。
(5)b:塊設備,所有存儲類的驅動都稱為塊設備,包含扇區處理。
(6)p:管道設備,是用內核內存模擬的通道。
從上述說明可以看出,例子中的文件是一個目錄文件,原因是第一個符號代表文件類型,d代表此文件是一個目錄文件。
2.文件權限
文件權限有:
(1)r為讀,二進制權重為100,即4。
(2)w為寫,二進制權重為010,即2。
(3)x為執行,二進制權重為001,即1。
(4)-為無操作,二進制權重為0。
(5)rwx的順序不可改,表示可讀可寫可執行。
(6)-wx表示不能讀,可寫可執行。
上述就是文件權限的表示方法,文件權限是用八進制來表達的,如果一個文件有全部的權限,那么對應八進制里的數是7(4+2+1)。同時讀者會發現有多組rwx,它所表達的不僅僅是它自身的權限。這里涉及一個分組的概念。
(1)u組:創建者(user);
(2)g組:創建者所在組的成員(group);
(3)o組:其他人所具備的權限(other)。
也就是說,例子中的三組rwx都是依照上述順序來說明權限的。例子里的文件權限就是:創建者可讀可寫可執行,所在組的成員可讀可執行,其他成員可讀不可寫不可執行。
3.2
圖中文件類型和權限之后是數字2,這個2表示的是文件節點數,也就是說,此文件是一個目錄文件。所以,目錄的節點數代表該目錄下的文件個數,在這里應該是有兩個文件。如果此文件不是目錄,只是普通文件,那么這個數字就代表硬鏈接的個數。關于鏈接的幾點說明如下:
(1)鏈接分為硬鏈接和軟鏈接(符號鏈接,即快捷方式)。
(2)硬鏈接,只是增加一個引用計數,本質上并沒有物理上的增加文件。硬鏈接不是文件。
(3)符號鏈接,是在磁盤上產生一個文件,這個文件內部寫入了一個指向被鏈接的文件的指針。
(4)采用ln指令,用來在文件之間創建鏈接,默認為創建硬鏈接(目錄不能創建硬鏈接),使用選項-s創建符號鏈接。硬鏈接指向文件本身,符號鏈接指向文件名稱。
(5)Linux里尋找文件的順序是,根據文件名,找到inode編號,根據編號找到inode塊,然后根據inode塊中的屬性信息找到數據塊(即文件內容)。
(6)符號鏈接、硬鏈接、Windows快捷方式都具有指向功能;但它們的區別也很明顯:Windows快捷方式指向文件的位置,符號鏈接是一種文件,創建鏈接時,系統會為符號鏈接重新分配一個inode(節點)編號,但硬鏈接根本不是一種文件,只是一種指向。
(7)創建硬鏈接只是增加一個引用計數,硬鏈接和它的源文件共享一個inode。
……