編輯推薦
嵌入式係統的知識體係龐大,在授課學時不斷減少的背景下,要根據不同專業對嵌入式課程體係進行具體的設計。對於嵌入式教學存在的種種弊端,應做到“因課施教”。嵌入式學習必須配閤實踐,這是因為實踐可以激發學習興趣,提高學習能力,而且有助於檢驗學習效果。正是在這種背景下,筆者在總結教學團隊的豐富教學經驗的基礎上,從嵌入式操作係統開發的工程實踐齣發,將操作係統安裝、操作係統開發、Linux高級編程、底層驅動等內容有機地結閤在一起,構建起嵌入式係統開發的完整過程。力爭從實際應用角度齣發,培養邏輯思維和創新思維能力,提高分析、解決實際工程問題的能力。
(1)從零開始,輕鬆入門係統闡述理論的同時,兼顧內容的實用性和可讀性,從C語言入手,便於理解和運用。
(2)經典實例,清晰直觀從Linux基本操作入手,以VI、GCC、高級編程為主綫,直到係統驅動開發,均給齣瞭豐富的實例,並給齣瞭實例的完整代碼和運行結果,注重實例的科學分析方法,並妥善處理好知識點與實例的有效銜接。
(3)圖文並茂,操作簡單根據讀者認識和學習嵌入式開發的規律編排內容,將數學工具工程化,將抽象問題形象化,將復雜問題簡單化,將零散問題係統化,並給齣筆者理解的“標簽”。
(4)教學課件配書教案(PPT)可到清華大學齣版社網站本書頁麵下載。
(5)學習輔導書中配套代碼,開發環境,讀者可通過QQ群獲取並在綫學習答疑。
內容簡介
本書係統論述瞭基於ARM處理器的嵌入式Linux係統開發的原理、方法與實踐。全書共15章,分彆介紹瞭嵌入式Linux係統管理、Linux編程基礎、Linux高級編程、Linux內核開發、Linux係統移植和Linux驅動程序開發等。 本書內容吸收瞭作者在Linux係統教學、科研和實際項目研發中的經驗,實踐性強。在內容編排上,按照讀者學習的一般性規律,結閤大量實例論述,能夠使讀者高效地掌握嵌入式Linux係統的基本原理和應用方法。本書既可以作為高等院校相關專業的教材,也可以作為從事嵌入式係統開發人員的參考用書。
作者簡介
作者簡介 馮新宇黑龍江科技大學副教授,長期從事嵌入式係統項目開發和相關教學工作。曾主持或參與嵌入式相關課題和項目開發20餘項;近10年來一直作為指導教師參與全國電子設計大賽、飛思卡爾電子設計大賽、黑龍江省電子設計大賽等工作,所指導的學生多次獲得各種賽事重大奬勵。代錶性著作有《ADS2009射頻電路設計與仿真》、《四鏇翼無人飛行器設計》與《ARMCortex-M3體係結構與編程》。
目錄
第1章Linux概述與係統管理11.1嵌入式係統概述11.1.1嵌入式係統的發展曆史11.1.2嵌入式係統的特點21.1.3嵌入式係統的體係結構21.1.4典型嵌入式係統介紹31.2嵌入式Linux基礎41.2.1Linux發行版本41.2.2Linux定製安裝61.3Linux常用命令181.3.1係統管理相關命令181.3.2文件管理相關命令191.3.3備份壓縮相關命令251.3.4網絡通信相關命令261.3.5其他常用命令301.4服務器配置341.4.1samba服務器341.4.2NFS服務器381.4.3TFTP服務器40習題與練習42第2章Linux腳本編程432.1常用shell命令432.2腳本編寫基礎442.2.1特殊字符442.2.2變量和參數462.2.3退齣和退齣狀態482.3流程控製492.3.1條件測試492.3.2操作符相關主題512.3.3循環控製532.3.4測試與分支55習題與練習58第3章Linux編程基礎593.1編輯器介紹593.1.1vi介紹593.1.2vi的各模式功能鍵603.2程序編譯與調試633.2.1gcc編譯流程643.2.2gcc編譯選項分析643.2.3gdb程序調試69習題與練習75第4章C語言進階764.1C語言的基本知識764.2數據類型774.2.1常量和變量784.2.2進製784.2.3字符794.2.4轉義符與字符集794.2.5類型轉換794.2.6輸入輸齣824.2.7運算符834.3控製語句864.3.1分支語句864.3.2循環語句884.4數組與字符串974.4.1數組的定義974.4.2數組本質探討984.4.3一維數組和二維數組994.4.4字符串1014.5函數1034.5.1函數的定義1034.5.2函數的深度剖析1034.5.3函數的作用剖析1044.6指針1084.6.1指針的本質1084.6.2連續空間的內存地址1084.6.3指針變量1094.6.4指針數組和指針的指針1114.6.5函數和指針1154.7預處理指令1194.7.1宏定義1204.7.2#include1214.7.3條件編譯121習題與練習123第5章文件I/O編程1245.1文件和目錄1245.2目錄操作1265.3文件操作1345.3.1基本概念1345.3.2檢查文件及確定文件的權限1365.3.3創建文件1375.3.4打開文件1385.3.5關閉文件1395.3.6刪除文件1405.3.7文件指針移動1425.3.8其他常用函數1455.4設備控製1485.5Linux時間編程1595.5.1取得目前的時間1595.5.2取得目前時間和日期1605.5.3取得當地目前時間和日期1615.5.4將時間結構數據轉換成經過的秒數1625.5.5設置目前時間1625.5.6取得當前時間1635.5.7將時間和日期以ASCII碼格式錶示1645.5.8將時間和日期以字符串格式錶示164習題與練習165第6章進程控製1666.1進程控製概述1666.1.1進程的定義1666.1.2進程控製塊1676.1.3分配進程描述符1686.1.4進程的創建1686.1.5進程狀態1696.1.6進程調度1716.1.7虛擬內存1726.1.8文件鎖1726.2進程控製編程1736.2.1創建進程1736.2.2進程終止1816.2.3守護進程186習題與練習187第7章進程間通信1887.1進程間通信概述1887.2管道通信1907.2.1無名管道1907.2.2有名管道1927.2.3標準流管道1957.3消息隊列1967.3.1鍵值1967.3.2打開/創建消息隊列1977.3.3發送消息1977.3.4接收消息1987.3.5消息控製1987.4信號2017.4.1信號處理的方式2017.4.2信號操作指令2017.5信號量2077.5.1信號量創建2087.5.2信號量操作2087.6內存共享2147.6.1共享內存創建2147.6.2共享內存的操作2167.6.3共享內存段連接到本進程空間2167.6.4共享內存解除217習題與練習220第8章多綫程技術2218.1Linux多綫程概念2218.2Linux綫程實現2228.2.1綫程創建2228.2.2綫程退齣2248.2.3綫程等待2268.2.4綫程標識獲取2288.2.5綫程清除2298.3綫程函數傳遞及修改綫程的屬性2328.3.1綫程函數傳遞2328.3.2綁定屬性2358.3.3分離屬性2368.3.4優先級屬性2378.3.5綫程的互斥2398.3.6綫程的同步2418.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。 ……
前言/序言
嵌入式係統及其應用是一個龐大的知識體係,筆者在多年的授課過程中,也很難選擇一本閤適的書作為本科學生的授課教材。結閤課堂講稿和學生的部分畢業設計內容,以及在學生學習過程中經常遇到的問題,筆者整理成本書——《嵌入式Linux係統開發——基於ARM處理器通用平颱》,之所以這麼命名,是打破瞭以前ARM9體係或者ARM11體係的框架。Linux操作係統在ARM9之上的處理器均有較好的兼容,讀者稍加修改,代碼就能應用,所以命名時就迴避瞭某一款處理器的限定。關於嵌入式有太多的內容可以介紹,本書側重應用,並結閤瞭當前嵌入式的發展和應用。 嵌入式係統無疑是當前最熱門、最有發展前途的IT應用領域之一。嵌入式係統用在某些特定的專用設備上,通常這些設備的硬件資源(如處理器、存儲器等)非常有限,並且對成本很敏感,有時還對實時響應等要求很高。特彆是隨著消費傢電的智能化,嵌入式更顯重要。像我們平時常見的手機、PDA、電子字典、可視電話、數字相機、數字攝像機、機頂盒、高清電視、遊戲機、智能玩具、交換機、路由器、數控設備或儀錶、汽車電子、傢電控製係統、醫療儀器、航天航空設備等都是典型的嵌入式係統。 嵌入式係統是軟硬結閤的産品,嵌入式開發主要分為兩類。 一類是無綫電相關專業,例如電子工程、通信工程等專業齣身的人,他們主要搞硬件設計,有時需要開發一些與硬件關係最密切的最底層軟件(例如BootLoader、BoardSupportPackage)、最初級的硬件驅動程序等。他們的優勢是對硬件原理非常清楚,不足是他們更擅長定義各種硬件接口,但對復雜的軟件係統往往力不從心(例如嵌入式操作係統原理和復雜的應用軟件等)。 另一類是軟件、計算機專業齣身的人,主要從事嵌入式操作係統和應用軟件的開發。如果我們學軟件的人對硬件原理和接口有較好的掌握,也完全可以編寫BSP和硬件驅動程序。嵌入式硬件設計完成後,各種功能就全靠軟件來實現瞭。嵌入式設備的增值很大程度上取決於嵌入式軟件,設備越智能,係統越復雜,軟件的作用越關鍵,這也是目前的趨勢。 目前,國內外的相關人纔都很稀缺。一方麵,該領域入門門檻較高,不僅要瞭解較底層的軟件(例如操作係統級、驅動程序級軟件),對軟件專業水平要求較高(嵌入式係統對軟件設計的時間和空間效率要求較高),而且必須熟悉硬件的工作原理,所以非專業IT人員很難切入這一領域;另一方麵,該領域較新,發展太快,很多軟硬件技術齣現時間不長或正在齣現(例如ARM處理器、嵌入式操作係統、MPEG技術、無綫通信協議等),掌握這些新技術的人較少。嵌入式人纔稀缺,身價自然就高。嵌入式人纔稀少的根本原因可能是大多數人無條件接觸該領域,這需要相應的嵌入式開發闆和軟件,另外需要有經驗的人進行開發流程的指導。 與企業計算等應用軟件的開發人員不同,嵌入式領域人纔的工作強度通常較低,收入卻很高。從事企業應用軟件的IT人員,這個用戶的係統開發完成後,又要去開發下一個用戶的係統,並且每個用戶的需求和完成時間都必須按客戶要求改變,往往疲於奔命,重復勞動。相比而言,開發嵌入式係統的公司,都有自己的産品計劃,按自己的節奏行事,所開發的産品通常是通用的,不會因客戶的不同而修改。某一型號的産品開發完成後,往往有較長的一段空閑時間(或隻是對軟件進行一些小修補),有時間進行充電和休整。另外,從事嵌入式軟件開發的人員的工作範圍相對狹窄,所涉及的專業技術範圍比較小(ARM、RTOS、MPEG、802.11等),隨著時間的纍積,經驗也逐漸纍積,可“倚老賣老”,寥寥數語的指導就足夠讓初入道者琢磨半年。如果從事應用軟件開發,可能不同的客戶的軟件開發平颱也完全不同,這會使得開發工作也相對更加辛苦。 嵌入式開發更注重的是練習,嵌入式係統開發設計最難的是入門,嵌入式係統開發涉及知識較多,初學者很難從紛雜的知識中快速上手學習,現在市麵上用於嵌入式開發的學習闆比比皆是,價格都比較低廉,讀者可以買一款相對通用的開發闆,按照書中的操作練習,本書將一步一步引導初學者進行嵌入式開發的學習。任何知識的學習都是由淺入深,由感性認識到理性認識,掌握瞭前幾章的學習,相信讀者一定能夠掌握嵌入式入門開發的基本要領。 本書主要由馮新宇編寫。此外,本書第11~15章由蔣洪波編寫。參與編寫的還有楊昕宇、劉宇瑩、劉琳、史殿發、孟瑩等。 感謝廣州碾展公司的技術支持! 感謝您選擇瞭本書,希望我們的努力對您的工作和學習有所幫助,也希望您把對本書的意見和建議反饋給我們。 作者 2017年4月
《嵌入式Linux係統開發——基於ARM處理器通用平颱》:深入剖析,賦能未來 在蓬勃發展的物聯網、人工智能以及移動互聯時代,嵌入式係統扮演著至關重要的角色。它們是無數智能設備的大腦,是驅動現代科技創新的核心力量。而Linux,以其開源、穩定、靈活的特性,已然成為嵌入式係統開發的首選操作係統。在這一背景下,《嵌入式Linux係統開發——基於ARM處理器通用平颱》應運而生,旨在為廣大電子信息類專業的學子和嵌入式開發領域的從業者提供一套全麵、深入、實用的學習指南。 本書以ARM處理器為核心,以Linux為操作係統,係統地闡述瞭嵌入式Linux係統的開發流程、關鍵技術以及實際應用。本書並非簡單羅列零散的知識點,而是力求構建一個完整的知識體係,帶領讀者從宏觀到微觀,逐步掌握嵌入式Linux係統開發的精髓。 一、 奠定堅實基礎:從硬件到軟件的全麵認知 在深入嵌入式Linux開發之前,對硬件和操作係統的基礎知識有紮實的理解是必不可少的。本書的第一部分,將帶領讀者迴顧和梳理嵌入式係統開發所必備的基礎知識。 ARM處理器架構深入解析: ARM處理器憑藉其低功耗、高性能的優勢,已成為嵌入式領域的霸主。本書將詳細介紹ARM處理器的基本架構,包括其指令集(ARM/Thumb)、流水綫、寄存器、存儲器管理單元(MMU)等核心概念。同時,還會探討不同ARM係列處理器的特點和應用場景,幫助讀者理解不同硬件平颱在開發中的差異性。理解CPU的工作原理,是進行底層軟件開發的前提。 Linux操作係統原理概覽: Linux作為一款開源且功能強大的操作係統,其在嵌入式領域的廣泛應用得益於其優秀的內核設計和豐富的生態係統。本書將從宏觀角度介紹Linux操作係統的基本概念,包括進程管理、內存管理、文件係統、設備驅動模型等。這部分內容旨在為讀者打下堅實的理論基礎,理解Linux如何在嵌入式環境中高效運作。 嵌入式係統軟硬件協同開發理念: 嵌入式係統的開發是一個軟硬件緊密集成的過程。本書將強調軟硬件協同開發的理念,介紹如何根據硬件特性選擇閤適的軟件架構,以及如何通過軟件優化來提升硬件性能。這種 holistic 的開發思維,對於解決復雜的嵌入式係統問題至關重要。 二、 構建開發環境:搭建高效的實戰平颱 擁有一個穩定、高效的開發環境是成功進行嵌入式Linux開發的關鍵。本書的第二部分,將詳盡指導讀者如何搭建起完整的開發環境。 交叉編譯工具鏈的安裝與配置: 嵌入式Linux的開發通常需要在宿主機(如PC)上進行交叉編譯,生成在目標闆上運行的代碼。本書將詳細介紹交叉編譯工具鏈(如GCC、Binutils、Glibc)的安裝、配置以及使用方法,並提供常見的配置技巧和故障排除指南。 Bootloader的原理與移植: Bootloader是嵌入式係統啓動的第一道程序,負責初始化硬件並加載操作係統內核。本書將深入講解Bootloader的工作原理,介紹U-Boot等主流Bootloader的結構和移植過程,包括設備樹(Device Tree)的配置,這是現代嵌入式Linux開發不可或缺的一環。 Linux內核的編譯與裁剪: 針對不同的硬件平颱和應用需求,對Linux內核進行裁剪和配置是提升係統性能和資源利用率的關鍵。本書將指導讀者如何獲取Linux內核源碼,進行配置(Kconfig)和編譯,並介紹內核模塊的加載和管理。 根文件係統的構建: 根文件係統包含瞭嵌入式Linux係統運行所需的基本命令、庫文件和應用程序。本書將介紹Buildroot、Yocto Project等主流的根文件係統構建工具,並演示如何根據應用需求構建定製化的根文件係統。 三、 掌握核心技術:深入嵌入式Linux的方方麵麵 在搭建好開發環境後,本書將帶領讀者深入探索嵌入式Linux開發的各項核心技術。 設備驅動程序開發: 設備驅動是連接硬件與操作係統的橋梁。本書將係統地講解Linux設備驅動模型,包括字符設備、塊設備、網絡設備驅動的編寫。重點介紹GPIO、I2C、SPI、UART等常用接口的驅動開發,並結閤實際案例進行演示,幫助讀者理解驅動程序的生命周期和調試方法。 進程間通信(IPC)與多綫程編程: 在復雜的嵌入式係統中,進程間通信和多綫程編程是實現高效協作和並發處理的關鍵。本書將詳細介紹Linux提供的各種IPC機製,如管道、消息隊列、共享內存、信號量,以及多綫程編程的常用API和同步機製。 嵌入式Linux應用程序開發: 嵌入式Linux應用程序是實現係統功能的載體。本書將介紹用戶空間應用程序的開發,包括C/C++語言在嵌入式Linux下的編程技巧,以及如何利用Linux標準庫和第三方庫進行開發。 網絡通信編程: 隨著物聯網的發展,嵌入式設備的網絡通信能力日益重要。本書將介紹Socket編程,涵蓋TCP/IP協議棧的使用,以及HTTP、MQTT等常見應用層協議在嵌入式設備上的實現。 實時性保障與優化: 許多嵌入式應用對實時性有嚴格的要求。本書將探討Linux內核的實時性問題,介紹PREEMPT_RT補丁等技術,並提供係統調優的策略,以滿足高實時性應用的需求。 四、 實踐齣真知:豐富的案例分析與實戰演練 理論知識的學習固然重要,但更重要的是將其轉化為實際能力。本書的第四部分,將通過豐富的案例分析和實戰演練,幫助讀者鞏固所學知識,提升解決實際問題的能力。 基於ARM通用平颱的實戰項目: 本書將選取一款具有代錶性的ARM開發闆(例如,基於ARM Cortex-A係列的某款開發闆),以該開發闆為載體,逐步引導讀者完成一係列實戰項目。這些項目將涵蓋從硬件的初步認識,到嵌入式Linux係統的移植,再到具體應用的開發,例如: LED控製與按鍵掃描: 學習最基礎的GPIO操作,理解輸入輸齣的交互。 LCD顯示與觸摸屏驅動: 掌握圖形界麵的基本繪製和用戶交互的實現。 網絡攝像頭數據采集與傳輸: 學習多媒體數據的處理和網絡通信的應用。 傳感器數據采集與雲平颱接入: 結閤物聯網場景,學習數據采集、處理和遠程通信。 簡單的嵌入式Web服務器: 實現設備遠程控製和狀態監控。 調試技巧與工具運用: 在開發過程中,調試是不可避免的環節。本書將介紹GDB、Valgrind等強大的調試工具,並傳授行之有效的調試技巧,幫助讀者快速定位和解決開發中的問題。 性能分析與優化: 針對嵌入式係統資源受限的特點,本書將指導讀者如何進行係統性能分析,找齣性能瓶頸,並提供內存優化、CPU調度優化等多種性能提升策略。 五、 展望未來:引領嵌入式Linux發展前沿 隨著技術的不斷進步,嵌入式Linux係統也在不斷演進。本書的最後一章,將對嵌入式Linux係統開發的未來發展趨勢進行展望。 容器化技術在嵌入式領域的應用: Docker、Kubernetes等容器化技術正逐漸滲透到嵌入式領域,為嵌入式應用的部署、管理和升級帶來瞭新的機遇。 人工智能與嵌入式Linux的融閤: 邊緣AI的興起,使得嵌入式設備能夠具備更強大的智能處理能力。本書將探討AI模型在嵌入式Linux上的部署和優化。 安全與可靠性設計: 隨著嵌入式係統在關鍵領域的應用,安全性和可靠性變得愈發重要。本書將簡要介紹嵌入式Linux係統的安全加固和容錯設計。 《嵌入式Linux係統開發——基於ARM處理器通用平颱》不僅僅是一本書,更是通往嵌入式Linux開發世界的一扇窗。它以嚴謹的邏輯、清晰的結構、豐富的案例,引領讀者深入理解嵌入式Linux係統的方方麵麵,掌握核心技術,提升實戰能力。無論您是渴望踏入嵌入式開發領域的新手,還是尋求深化技術造詣的在職工程師,本書都將是您寶貴的學習夥伴,助您在日新月異的科技浪潮中,乘風破浪,成就卓越。