本書主要介紹嵌入式Linux接口開發(fā)技術(shù),首先介紹Linux的基礎(chǔ)知識(shí)、嵌入式Linux C的開發(fā)基礎(chǔ)和Linux系統(tǒng)的文件操作,然后在此基礎(chǔ)上詳細(xì)介紹嵌入式系統(tǒng)常用接口的編程,最后通過一個(gè)完整的案例開發(fā)來介紹嵌入式系統(tǒng)的綜合設(shè)計(jì)。對于每種接口,本書先介紹其原理,然后通過典型的外設(shè)來介紹嵌入式Linux的接口編程。在編程過程中采用示波器和邏輯分析儀來進(jìn)行驗(yàn)證,通過形象化的手段來提高讀者的動(dòng)手能力,加深讀者對本書知識(shí)點(diǎn)的理解。
前 言
寫作背景
由于Linux具有開源、資源占用少等特點(diǎn),在服務(wù)器、智能終端和嵌入式系統(tǒng)中大有用武之地。與傳統(tǒng)PC程序的開發(fā)不同,嵌入式系統(tǒng)的開發(fā)涉及軟件和硬件兩個(gè)方面,是一個(gè)協(xié)同工作的過程。目前,在嵌入式系統(tǒng)的硬件和軟件中,應(yīng)用比較廣泛的是ARM體系結(jié)構(gòu)的微處理器和Linux系統(tǒng)。本書是基于ARM體系結(jié)構(gòu)的微處理器和Linux編寫的。
在進(jìn)行嵌入式Linux C開發(fā)時(shí),需要開發(fā)者熟練掌握C語言、電子電路分析、通信協(xié)議以及驅(qū)動(dòng)程序開發(fā)等知識(shí)。在多年的科研和教學(xué)過程中,作者發(fā)現(xiàn):
(1)部分學(xué)生對常用電子儀器設(shè)備的使用方法掌握得不熟練。
(2)部分學(xué)生在學(xué)習(xí)器件接口的原理后,僅僅停留在理論學(xué)習(xí)的階段,面對實(shí)際的器件卻無從下手,無法將理論和實(shí)踐聯(lián)系起來,不具備解決實(shí)際問題的能力。
(3)部分學(xué)生沒有掌握良好的編程技巧和程序分層設(shè)計(jì)的思想,導(dǎo)致程序的可讀性和可移植性較差。
(4)目前市面上一些嵌入式開發(fā)板的外設(shè)不豐富,不利于學(xué)生進(jìn)行實(shí)踐。
面對上述問題,本書從嵌入式系統(tǒng)的開發(fā)基礎(chǔ)入手,詳細(xì)介紹了GPIO接口、PWM、UART串口、I2C總線和SPI總線的原理以及實(shí)現(xiàn)方法,并以此為基礎(chǔ)介紹了常用外設(shè)的使用方法。本書通過理論敘述和編程實(shí)踐相結(jié)合的方式,幫助讀者深入理解嵌入式系統(tǒng)常用接口的原理和開發(fā)。另外,本書結(jié)合具體的實(shí)例,詳細(xì)介紹了示波器和邏輯分析儀的使用方法,可幫助讀者掌握這些電子儀器設(shè)備的使用方法。
本書專門設(shè)計(jì)了配套的嵌入式開發(fā)板,該開發(fā)板包含豐富的外設(shè),可幫助讀者掌握相關(guān)的知識(shí)。另外,本書配套的嵌入式開發(fā)板保留了通用協(xié)議的接口,可進(jìn)一步擴(kuò)展外設(shè)。本書提供了書中所有實(shí)例的代碼,代碼分為bsp、driver和application三層,分別對應(yīng)通信協(xié)議代碼、外設(shè)驅(qū)動(dòng)代碼和應(yīng)用程序代碼。這種分層的代碼結(jié)構(gòu),不僅可讀性高,易于讀者理解,在更換嵌入式開發(fā)板或開發(fā)環(huán)境時(shí),還具有很高的移植性。
內(nèi)容框架
本書從Linux的開發(fā)基礎(chǔ)講起,詳細(xì)介紹了嵌入式Linux接口開發(fā)技術(shù)。第1~3章是Linux的入門知識(shí);第4章介紹了本書所用的嵌入式開發(fā)板,包括安裝系統(tǒng)、調(diào)試方法等;第5~8章介紹了各種接口的開發(fā),在介紹接口通信協(xié)議的基礎(chǔ)上給出了簡單的編程實(shí)例;第9章介紹了嵌入式系統(tǒng)的綜合設(shè)計(jì),通過一個(gè)完整的案例開發(fā),幫助讀者學(xué)習(xí)和掌握嵌入式系統(tǒng)的開發(fā)方法。
讀者對象
本書主要介紹嵌入式Linux接口開發(fā)技術(shù),讀者應(yīng)當(dāng)具備C語言和電子電路的基礎(chǔ)知識(shí)。本書主要面向嵌入式Linux設(shè)備驅(qū)動(dòng)程序、應(yīng)用程序的開發(fā)工程師,以及ARM嵌入式系統(tǒng)的設(shè)計(jì)工程師。
勘誤和支持
由于作者的水平有限,書中難免會(huì)有錯(cuò)誤或不足之處,懇請讀者批評(píng)指正。作者將本書配套的源代碼、電路圖、模塊使用手冊等資料上傳到了GitHub,訪問地址為https://github.com/ dengkuanchina/book-Embedded-System-Linux-C。歡迎讀者在GitHub提交Issues留言,與作者溝通。
致謝
本書既是江蘇省高等教育教改研究立項(xiàng)課題(2019JSJG622)和南京市級(jí)高等教育人才培養(yǎng)創(chuàng)新基地項(xiàng)目建設(shè)成果,也是作者所在單位與南京優(yōu)奈特信息科技有限公司(蘇嵌教育)開展校企合作人才培養(yǎng)的成果。在本書的編寫過程中,董振華、黃苗玉、田晨林、朱連杰、毛汝勇、吳振、徐棟、孔祥宇等老師和學(xué)生給予了熱情支持,并提出了很多寶貴意見;本書的出版得到了電子工業(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 在虛擬機(jī)上安裝Linux系統(tǒng) (3)
1.2.1 什么是虛擬機(jī) (3)
1.2.2 VMware Workstation虛擬機(jī)的配置 (3)
1.2.3 安裝Linux系統(tǒng) (7)
1.2.4 使用Ubuntu系統(tǒng)的注意事項(xià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)
練習(xí)題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 初識(shí)gcc編譯器 (43)
2.3.2 gcc命令的常用選項(xiàng)及編譯過程 (43)
2.3.3 庫的使用 (45)
2.4 構(gòu)建工具 (47)
2.4.1 Makefile文件 (47)
2.4.2 Makefile文件的特性 (49)
練習(xí)題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)典范例:文件復(fù)制 (62)
3.4 帶緩存的文件I/O操作涉及的函數(shù) (64)
3.4.1 標(biāo)準(zhǔn)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)
練習(xí)題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)
練習(xí)題4 (102)
第5章 嵌入式Linux接口編程:GPIO和PWM (103)
5.1 示波器的基本用法 (103)
5.1.1 示波器簡介 (103)
5.1.2 示波器的觸發(fā)方式和觸發(fā)條件 (107)
5.1.3 示波器的運(yùn)算功能 (109)
5.2 GPIO編程 (110)
5.2.1 bsp_gpio接口函數(shù)簡介 (112)
5.2.2 GPIO的輸入和輸出 (114)
5.2.3 通過示波器三種觸發(fā)方式觀察電壓信號(hào)波形 (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)
練習(xí)題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接口信號(hào)的波形分析 (130)
6.2.1 UART接口信號(hào)的生成 (130)
6.2.2 通過示波器捕獲UART接口信號(hào)的波形 (131)
6.2.3 通過邏輯分析儀捕獲UART接口信號(hào)的波形 (133)
6.3 UART編程 (137)
6.3.1 嵌入式Linux的UART接口函數(shù) (137)
6.3.2 串口測試程序 (138)
6.4 藍(lán)牙模塊的原理與編程 (141)
6.4.1 藍(lán)牙模塊的原理 (141)
6.4.2 藍(lán)牙模塊的接口函數(shù) (141)
6.4.3 藍(lán)牙模塊的編程 (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)
練習(xí)題6 (157)
第7章 嵌入式Linux接口編程:I2C (159)
7.1 I2C總線協(xié)議的基礎(chǔ) (159)
7.1.1 I2C總線的物理層特點(diǎn) (160)
7.1.2 I2C總線的通信時(shí)序 (160)
7.2 I2C總線的接口函數(shù) (163)
7.3 通過邏輯分析儀測試I2C總線協(xié)議 (167)
7.4 ADC和DAC的原理與編程 (169)
7.4.1 PCF8591芯片的基礎(chǔ)知識(shí) (170)
7.4.2 PCF8591芯片的接口函數(shù) (172)
7.4.3 PCF8591芯片的編程 (173)
7.5 E2PROM的原理與編程 (175)
7.5.1 AT24C02芯片的基礎(chǔ)知識(shí) (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)
練習(xí)題7 (190)
第8章 嵌入式Linux接口編程:SPI (193)
8.1 SPI總線協(xié)議的基礎(chǔ) (193)
8.1.1 SPI總線的接口定義 (193)
8.1.2 單從機(jī)模式 (194)
8.1.3 多從機(jī)模式 (194)
8.1.4 SPI總線的起始信號(hào)和停止信號(hào) (194)
8.1.5 SPI總線的數(shù)據(jù)有效性 (194)
8.1.6 SPI總線的通信模式 (195)
8.2 SPI總線的接口函數(shù) (196)
8.3 通過邏輯分析儀測試SPI總線的信號(hào)波形 (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)
練習(xí)題8 (213)
第9章 嵌入式系統(tǒng)的綜合設(shè)計(jì) (215)
9.1 嵌入式系統(tǒng)開發(fā)流程 (215)
9.2 基于RS-485的分布式溫濕度監(jiān)控和報(bào)警系統(tǒng) (216)
9.2.1 項(xiàng)目論證和需求 (216)
9.2.2 系統(tǒng)的總體設(shè)計(jì) (216)
9.2.3 系統(tǒng)硬件的設(shè)計(jì) (217)
9.2.4 系統(tǒng)通信協(xié)議的設(shè)計(jì) (218)
9.2.5 系統(tǒng)軟件的設(shè)計(jì) (220)
9.2.6 系統(tǒng)的測試和調(diào)試 (228)
附錄A 底板電路圖 (231)
參考文獻(xiàn) (233)