前 言
寫作背景
由于Linux具有開源、資源占用少等特點,在服務器、智能終端和嵌入式系統(tǒng)中大有用武之地。與傳統(tǒng)PC程序的開發(fā)不同,嵌入式系統(tǒng)的開發(fā)涉及軟件和硬件兩個方面,是一個協(xié)同工作的過程。目前,在嵌入式系統(tǒng)的硬件和軟件中,應用比較廣泛的是ARM體系結(jié)構(gòu)的微處理器和Linux系統(tǒng)。本書是基于ARM體系結(jié)構(gòu)的微處理器和Linux編寫的。
在進行嵌入式Linux C開發(fā)時,需要開發(fā)者熟練掌握C語言、電子電路分析、通信協(xié)議以及驅(qū)動程序開發(fā)等知識。在多年的科研和教學過程中,作者發(fā)現(xiàn):
(1)部分學生對常用電子儀器設備的使用方法掌握得不熟練。
(2)部分學生在學習器件接口的原理后,僅僅停留在理論學習的階段,面對實際的器件卻無從下手,無法將理論和實踐聯(lián)系起來,不具備解決實際問題的能力。
(3)部分學生沒有掌握良好的編程技巧和程序分層設計的思想,導致程序的可讀性和可移植性較差。
(4)目前市面上一些嵌入式開發(fā)板的外設不豐富,不利于學生進行實踐。
面對上述問題,本書從嵌入式系統(tǒng)的開發(fā)基礎(chǔ)入手,詳細介紹了GPIO接口、PWM、UART串口、I2C總線和SPI總線的原理以及實現(xiàn)方法,并以此為基礎(chǔ)介紹了常用外設的使用方法。本書通過理論敘述和編程實踐相結(jié)合的方式,幫助讀者深入理解嵌入式系統(tǒng)常用接口的原理和開發(fā)。另外,本書結(jié)合具體的實例,詳細介紹了示波器和邏輯分析儀的使用方法,可幫助讀者掌握這些電子儀器設備的使用方法。
本書專門設計了配套的嵌入式開發(fā)板,該開發(fā)板包含豐富的外設,可幫助讀者掌握相關(guān)的知識。另外,本書配套的嵌入式開發(fā)板保留了通用協(xié)議的接口,可進一步擴展外設。本書提供了書中所有實例的代碼,代碼分為bsp、driver和application三層,分別對應通信協(xié)議代碼、外設驅(qū)動代碼和應用程序代碼。這種分層的代碼結(jié)構(gòu),不僅可讀性高,易于讀者理解,在更換嵌入式開發(fā)板或開發(fā)環(huán)境時,還具有很高的移植性。
內(nèi)容框架
本書從Linux的開發(fā)基礎(chǔ)講起,詳細介紹了嵌入式Linux接口開發(fā)技術(shù)。第1~3章是Linux的入門知識;第4章介紹了本書所用的嵌入式開發(fā)板,包括安裝系統(tǒng)、調(diào)試方法等;第5~8章介紹了各種接口的開發(fā),在介紹接口通信協(xié)議的基礎(chǔ)上給出了簡單的編程實例;第9章介紹了嵌入式系統(tǒng)的綜合設計,通過一個完整的案例開發(fā),幫助讀者學習和掌握嵌入式系統(tǒng)的開發(fā)方法。
讀者對象
本書主要介紹嵌入式Linux接口開發(fā)技術(shù),讀者應當具備C語言和電子電路的基礎(chǔ)知識。本書主要面向嵌入式Linux設備驅(qū)動程序、應用程序的開發(fā)工程師,以及ARM嵌入式系統(tǒng)的設計工程師。
勘誤和支持
由于作者的水平有限,書中難免會有錯誤或不足之處,懇請讀者批評指正。作者將本書配套的源代碼、電路圖、模塊使用手冊等資料上傳到了GitHub,訪問地址為https://github.com/ dengkuanchina/book-Embedded-System-Linux-C。歡迎讀者在GitHub提交Issues留言,與作者溝通。
致謝
本書既是江蘇省高等教育教改研究立項課題(2019JSJG622)和南京市級高等教育人才培養(yǎng)創(chuàng)新基地項目建設成果,也是作者所在單位與南京優(yōu)奈特信息科技有限公司(蘇嵌教育)開展校企合作人才培養(yǎng)的成果。在本書的編寫過程中,董振華、黃苗玉、田晨林、朱連杰、毛汝勇、吳振、徐棟、孔祥宇等老師和學生給予了熱情支持,并提出了很多寶貴意見;本書的出版得到了電子工業(yè)出版社的大力支持,在此表示衷心的感謝。
作 者
2021年2月
目 錄
第1章 Linux基礎(chǔ) (1)
1.1 Linux簡介 (1)
1.1.1 Linux的發(fā)展 (1)
1.1.2 常見的Linux發(fā)行版 (1)
1.1.3 Linux系統(tǒng)的下載 (2)
1.2 在虛擬機上安裝Linux系統(tǒng) (3)
1.2.1 什么是虛擬機 (3)
1.2.2 VMware Workstation虛擬機的配置 (3)
1.2.3 安裝Linux系統(tǒng) (7)
1.2.4 使用Ubuntu系統(tǒng)的注意事項 (10)
1.3 Linux的文件系統(tǒng) (14)
1.4 Linux系統(tǒng)的常用命令 (16)
1.4.1 系統(tǒng)命令 (16)
1.4.2 文本文件編輯命令 (19)
1.4.3 工作目錄命令 (20)
1.4.4 打包壓縮與搜索命令 (23)
1.4.5 命令在Linux系統(tǒng)中的執(zhí)行 (25)
1.5 鏈接方式 (26)
1.5.1 軟鏈接和硬鏈接 (26)
1.5.2 ln命令 (26)
1.6 輸入/輸出重定向、管道符與環(huán)境變量 (27)
1.6.1 輸入/輸出重定向 (27)
1.6.2 管道符 (29)
1.6.3 重要的環(huán)境變量 (29)
1.7 Vim編輯器與Shell腳本命令 (30)
1.7.1 Vim編輯器 (30)
1.7.2 Shell腳本命令 (32)
1.8 用戶身份與文件權(quán)限 (35)
1.8.1 passwd命令 (35)
1.8.2 文件權(quán)限 (36)
1.8.3 chmod命令 (37)
1.8.4 su命令與sudo命令 (37)
練習題1 (38)
第2章 嵌入式Linux C開發(fā)基礎(chǔ) (41)
2.1 C語言概述 (41)
2.2 嵌入式Linux C開發(fā)工具 (41)
2.3 嵌入式編譯器gcc (42)
2.3.1 初識gcc編譯器 (43)
2.3.2 gcc命令的常用選項及編譯過程 (43)
2.3.3 庫的使用 (45)
2.4 構(gòu)建工具 (47)
2.4.1 Makefile文件 (47)
2.4.2 Makefile文件的特性 (49)
練習題2 (52)
第3章 Linux系統(tǒng)的文件操作 (55)
3.1 Linux系統(tǒng)的文件類型 (55)
3.2 Linux系統(tǒng)的文件描述符 (56)
3.3 不帶緩存的文件I/O操作涉及的函數(shù) (56)
3.3.1 creat函數(shù) (57)
3.3.2 open函數(shù) (58)
3.3.3 read函數(shù) (61)
3.3.4 write函數(shù) (61)
3.3.5 lseek函數(shù) (61)
3.3.6 close函數(shù) (62)
3.3.7 經(jīng)典范例:文件復制 (62)
3.4 帶緩存的文件I/O操作涉及的函數(shù) (64)
3.4.1 標準I/O庫中的緩存類型 (64)
3.4.2 fopen函數(shù) (66)
3.4.3 fclose函數(shù) (67)
3.4.4 fwrite函數(shù) (67)
3.4.5 fread函數(shù) (68)
3.4.6 fseek函數(shù) (69)
3.4.7 fgetc、getc和getchar函數(shù) (70)
3.4.8 fputc、putc和putchar函數(shù) (72)
3.4.9 字符串讀取函數(shù)fgets與gets (74)
3.5 格式化輸入/輸出函數(shù) (76)
3.5.1 格式化輸入函數(shù):scanf、fscanf和sscanf (76)
3.5.2 格式化輸出函數(shù):printf、fprintf和sprintf (78)
練習題3 (81)
第4章 嵌入式開發(fā)板 (83)
4.1 嵌入式開發(fā)板簡介 (83)
4.1.1 嵌入式開發(fā)板的核心板 (85)
4.1.2 嵌入式開發(fā)板的底板 (87)
4.2 嵌入式Linux系統(tǒng)的安裝和嵌入式開發(fā)板的初步使用 (92)
4.2.1 在嵌入式開發(fā)板中安裝嵌入式Linux系統(tǒng) (92)
4.2.2 嵌入式開發(fā)板的初步使用 (93)
4.2.3 文件傳輸 (98)
4.3 編譯方式 (100)
練習題4 (102)
第5章 嵌入式Linux接口編程:GPIO和PWM (103)
5.1 示波器的基本用法 (103)
5.1.1 示波器簡介 (103)
5.1.2 示波器的觸發(fā)方式和觸發(fā)條件 (107)
5.1.3 示波器的運算功能 (109)
5.2 GPIO編程 (110)
5.2.1 bsp_gpio接口函數(shù)簡介 (112)
5.2.2 GPIO的輸入和輸出 (114)
5.2.3 通過示波器三種觸發(fā)方式觀察電壓信號波形 (116)
5.3 PWM編程 (118)
5.3.1 PWM原理 (118)
5.3.2 bsp_pwm接口函數(shù)簡介 (119)
5.3.3 通過軟件PWM控制LED的亮滅 (120)
5.3.4 通過硬件PWM控制蜂鳴器的聲音 (121)
5.3.5 軟件PWM和硬件PWM的對比 (123)
練習題5 (125)
第6章 嵌入式Linux接口編程:UART (127)
6.1 串行通信協(xié)議的基礎(chǔ) (127)
6.1.1 串行通信協(xié)議的數(shù)據(jù)格式 (127)
6.1.2 串行通信協(xié)議的電氣規(guī)則和電路連接方式 (129)
6.2 UART接口信號的波形分析 (130)
6.2.1 UART接口信號的生成 (130)
6.2.2 通過示波器捕獲UART接口信號的波形 (131)
6.2.3 通過邏輯分析儀捕獲UART接口信號的波形 (133)
6.3 UART編程 (137)
6.3.1 嵌入式Linux的UART接口函數(shù) (137)
6.3.2 串口測試程序 (138)
6.4 藍牙模塊的原理與編程 (141)
6.4.1 藍牙模塊的原理 (141)
6.4.2 藍牙模塊的接口函數(shù) (141)
6.4.3 藍牙模塊的編程 (145)
6.5 485型溫濕度傳感器的原理與編程 (148)
6.5.1 RS-485接口的通信原理 (149)
6.5.2 485型溫濕度傳感器簡介 (151)
6.5.3 485型溫濕度傳感器接口函數(shù) (152)
6.5.4 485型溫濕度傳感器的編程 (155)
練習題6 (157)
第7章 嵌入式Linux接口編程:I2C (159)
7.1 I2C總線協(xié)議的基礎(chǔ) (159)
7.1.1 I2C總線的物理層特點 (160)
7.1.2 I2C總線的通信時序 (160)
7.2 I2C總線的接口函數(shù) (163)
7.3 通過邏輯分析儀測試I2C總線協(xié)議 (167)
7.4 ADC和DAC的原理與編程 (169)
7.4.1 PCF8591芯片的基礎(chǔ)知識 (170)
7.4.2 PCF8591芯片的接口函數(shù) (172)
7.4.3 PCF8591芯片的編程 (173)
7.5 E2PROM的原理與編程 (175)
7.5.1 AT24C02芯片的基礎(chǔ)知識 (176)
7.5.2 AT24C02芯片的接口函數(shù) (178)
7.5.3 AT24C02芯片的編程 (179)
7.6 OLED顯示屏的原理與編程 (181)
7.6.1 OLED顯示屏的原理 (181)
7.6.2 OLED顯示屏的接口函數(shù) (183)
7.6.3 OLED顯示屏的編程 (187)
練習題7 (190)
第8章 嵌入式Linux接口編程:SPI (193)
8.1 SPI總線協(xié)議的基礎(chǔ) (193)
8.1.1 SPI總線的接口定義 (193)
8.1.2 單從機模式 (194)
8.1.3 多從機模式 (194)
8.1.4 SPI總線的起始信號和停止信號 (194)
8.1.5 SPI總線的數(shù)據(jù)有效性 (194)
8.1.6 SPI總線的通信模式 (195)
8.2 SPI總線的接口函數(shù) (196)
8.3 通過邏輯分析儀測試SPI總線的信號波形 (199)
8.4 三軸加速度傳感器的原理與編程 (201)
8.4.1 ADXL345芯片的工作原理 (202)
8.4.2 ADXL345芯片的接口函數(shù) (206)
8.4.3 ADXL345芯片的編程 (210)
8.5 UART、I2C和SPI的對比 (213)
練習題8 (213)
第9章 嵌入式系統(tǒng)的綜合設計 (215)
9.1 嵌入式系統(tǒng)開發(fā)流程 (215)
9.2 基于RS-485的分布式溫濕度監(jiān)控和報警系統(tǒng) (216)
9.2.1 項目論證和需求 (216)
9.2.2 系統(tǒng)的總體設計 (216)
9.2.3 系統(tǒng)硬件的設計 (217)
9.2.4 系統(tǒng)通信協(xié)議的設計 (218)
9.2.5 系統(tǒng)軟件的設計 (220)
9.2.6 系統(tǒng)的測試和調(diào)試 (228)
附錄A 底板電路圖 (231)
參考文獻 (233)