前 言
写作背景
由于Linux具有开源、资源占用少等特点,在服务器、智能终端和嵌入式系统中大有用武之地。与传统PC程序的开发不同,嵌入式系统的开发涉及软件和硬件两个方面,是一个协同工作的过程。目前,在嵌入式系统的硬件和软件中,应用比较广泛的是ARM体系结构的微处理器和Linux系统。本书是基于ARM体系结构的微处理器和Linux编写的。
在进行嵌入式Linux C开发时,需要开发者熟练掌握C语言、电子电路分析、通信协议以及驱动程序开发等知识。在多年的科研和教学过程中,作者发现:
(1)部分学生对常用电子仪器设备的使用方法掌握得不熟练。
(2)部分学生在学习器件接口的原理后,仅仅停留在理论学习的阶段,面对实际的器件却无从下手,无法将理论和实践联系起来,不具备解决实际问题的能力。
(3)部分学生没有掌握良好的编程技巧和程序分层设计的思想,导致程序的可读性和可移植性较差。
(4)目前市面上一些嵌入式开发板的外设不丰富,不利于学生进行实践。
面对上述问题,本书从嵌入式系统的开发基础入手,详细介绍了GPIO接口、PWM、UART串口、I2C总线和SPI总线的原理以及实现方法,并以此为基础介绍了常用外设的使用方法。本书通过理论叙述和编程实践相结合的方式,帮助读者深入理解嵌入式系统常用接口的原理和开发。另外,本书结合具体的实例,详细介绍了示波器和逻辑分析仪的使用方法,可帮助读者掌握这些电子仪器设备的使用方法。
本书专门设计了配套的嵌入式开发板,该开发板包含丰富的外设,可帮助读者掌握相关的知识。另外,本书配套的嵌入式开发板保留了通用协议的接口,可进一步扩展外设。本书提供了书中所有实例的代码,代码分为bsp、driver和application三层,分别对应通信协议代码、外设驱动代码和应用程序代码。这种分层的代码结构,不仅可读性高,易于读者理解,在更换嵌入式开发板或开发环境时,还具有很高的移植性。
内容框架
本书从Linux的开发基础讲起,详细介绍了嵌入式Linux接口开发技术。第1~3章是Linux的入门知识;第4章介绍了本书所用的嵌入式开发板,包括安装系统、调试方法等;第5~8章介绍了各种接口的开发,在介绍接口通信协议的基础上给出了简单的编程实例;第9章介绍了嵌入式系统的综合设计,通过一个完整的案例开发,帮助读者学习和掌握嵌入式系统的开发方法。
读者对象
本书主要介绍嵌入式Linux接口开发技术,读者应当具备C语言和电子电路的基础知识。本书主要面向嵌入式Linux设备驱动程序、应用程序的开发工程师,以及ARM嵌入式系统的设计工程师。
勘误和支持
由于作者的水平有限,书中难免会有错误或不足之处,恳请读者批评指正。作者将本书配套的源代码、电路图、模块使用手册等资料上传到了GitHub,访问地址为https://github.com/ dengkuanchina/book-Embedded-System-Linux-C。欢迎读者在GitHub提交Issues留言,与作者沟通。
致谢
本书既是江苏省高等教育教改研究立项课题(2019JSJG622)和南京市级高等教育人才培养创新基地项目建设成果,也是作者所在单位与南京优奈特信息科技有限公司(苏嵌教育)开展校企合作人才培养的成果。在本书的编写过程中,董振华、黄苗玉、田晨林、朱连杰、毛汝勇、吴振、徐栋、孔祥宇等老师和学生给予了热情支持,并提出了很多宝贵意见;本书的出版得到了电子工业出版社的大力支持,在此表示衷心的感谢。
作 者
2021年2月
目 录
第1章 Linux基础 (1)
1.1 Linux简介 (1)
1.1.1 Linux的发展 (1)
1.1.2 常见的Linux发行版 (1)
1.1.3 Linux系统的下载 (2)
1.2 在虚拟机上安装Linux系统 (3)
1.2.1 什么是虚拟机 (3)
1.2.2 VMware Workstation虚拟机的配置 (3)
1.2.3 安装Linux系统 (7)
1.2.4 使用Ubuntu系统的注意事项 (10)
1.3 Linux的文件系统 (14)
1.4 Linux系统的常用命令 (16)
1.4.1 系统命令 (16)
1.4.2 文本文件编辑命令 (19)
1.4.3 工作目录命令 (20)
1.4.4 打包压缩与搜索命令 (23)
1.4.5 命令在Linux系统中的执行 (25)
1.5 链接方式 (26)
1.5.1 软链接和硬链接 (26)
1.5.2 ln命令 (26)
1.6 输入/输出重定向、管道符与环境变量 (27)
1.6.1 输入/输出重定向 (27)
1.6.2 管道符 (29)
1.6.3 重要的环境变量 (29)
1.7 Vim编辑器与Shell脚本命令 (30)
1.7.1 Vim编辑器 (30)
1.7.2 Shell脚本命令 (32)
1.8 用户身份与文件权限 (35)
1.8.1 passwd命令 (35)
1.8.2 文件权限 (36)
1.8.3 chmod命令 (37)
1.8.4 su命令与sudo命令 (37)
练习题1 (38)
第2章 嵌入式Linux C开发基础 (41)
2.1 C语言概述 (41)
2.2 嵌入式Linux C开发工具 (41)
2.3 嵌入式编译器gcc (42)
2.3.1 初识gcc编译器 (43)
2.3.2 gcc命令的常用选项及编译过程 (43)
2.3.3 库的使用 (45)
2.4 构建工具 (47)
2.4.1 Makefile文件 (47)
2.4.2 Makefile文件的特性 (49)
练习题2 (52)
第3章 Linux系统的文件操作 (55)
3.1 Linux系统的文件类型 (55)
3.2 Linux系统的文件描述符 (56)
3.3 不带缓存的文件I/O操作涉及的函数 (56)
3.3.1 creat函数 (57)
3.3.2 open函数 (58)
3.3.3 read函数 (61)
3.3.4 write函数 (61)
3.3.5 lseek函数 (61)
3.3.6 close函数 (62)
3.3.7 经典范例:文件复制 (62)
3.4 带缓存的文件I/O操作涉及的函数 (64)
3.4.1 标准I/O库中的缓存类型 (64)
3.4.2 fopen函数 (66)
3.4.3 fclose函数 (67)
3.4.4 fwrite函数 (67)
3.4.5 fread函数 (68)
3.4.6 fseek函数 (69)
3.4.7 fgetc、getc和getchar函数 (70)
3.4.8 fputc、putc和putchar函数 (72)
3.4.9 字符串读取函数fgets与gets (74)
3.5 格式化输入/输出函数 (76)
3.5.1 格式化输入函数:scanf、fscanf和sscanf (76)
3.5.2 格式化输出函数:printf、fprintf和sprintf (78)
练习题3 (81)
第4章 嵌入式开发板 (83)
4.1 嵌入式开发板简介 (83)
4.1.1 嵌入式开发板的核心板 (85)
4.1.2 嵌入式开发板的底板 (87)
4.2 嵌入式Linux系统的安装和嵌入式开发板的初步使用 (92)
4.2.1 在嵌入式开发板中安装嵌入式Linux系统 (92)
4.2.2 嵌入式开发板的初步使用 (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 示波器的触发方式和触发条件 (107)
5.1.3 示波器的运算功能 (109)
5.2 GPIO编程 (110)
5.2.1 bsp_gpio接口函数简介 (112)
5.2.2 GPIO的输入和输出 (114)
5.2.3 通过示波器三种触发方式观察电压信号波形 (116)
5.3 PWM编程 (118)
5.3.1 PWM原理 (118)
5.3.2 bsp_pwm接口函数简介 (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 串行通信协议的基础 (127)
6.1.1 串行通信协议的数据格式 (127)
6.1.2 串行通信协议的电气规则和电路连接方式 (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接口函数 (137)
6.3.2 串口测试程序 (138)
6.4 蓝牙模块的原理与编程 (141)
6.4.1 蓝牙模块的原理 (141)
6.4.2 蓝牙模块的接口函数 (141)
6.4.3 蓝牙模块的编程 (145)
6.5 485型温湿度传感器的原理与编程 (148)
6.5.1 RS-485接口的通信原理 (149)
6.5.2 485型温湿度传感器简介 (151)
6.5.3 485型温湿度传感器接口函数 (152)
6.5.4 485型温湿度传感器的编程 (155)
练习题6 (157)
第7章 嵌入式Linux接口编程:I2C (159)
7.1 I2C总线协议的基础 (159)
7.1.1 I2C总线的物理层特点 (160)
7.1.2 I2C总线的通信时序 (160)
7.2 I2C总线的接口函数 (163)
7.3 通过逻辑分析仪测试I2C总线协议 (167)
7.4 ADC和DAC的原理与编程 (169)
7.4.1 PCF8591芯片的基础知识 (170)
7.4.2 PCF8591芯片的接口函数 (172)
7.4.3 PCF8591芯片的编程 (173)
7.5 E2PROM的原理与编程 (175)
7.5.1 AT24C02芯片的基础知识 (176)
7.5.2 AT24C02芯片的接口函数 (178)
7.5.3 AT24C02芯片的编程 (179)
7.6 OLED显示屏的原理与编程 (181)
7.6.1 OLED显示屏的原理 (181)
7.6.2 OLED显示屏的接口函数 (183)
7.6.3 OLED显示屏的编程 (187)
练习题7 (190)
第8章 嵌入式Linux接口编程:SPI (193)
8.1 SPI总线协议的基础 (193)
8.1.1 SPI总线的接口定义 (193)
8.1.2 单从机模式 (194)
8.1.3 多从机模式 (194)
8.1.4 SPI总线的起始信号和停止信号 (194)
8.1.5 SPI总线的数据有效性 (194)
8.1.6 SPI总线的通信模式 (195)
8.2 SPI总线的接口函数 (196)
8.3 通过逻辑分析仪测试SPI总线的信号波形 (199)
8.4 三轴加速度传感器的原理与编程 (201)
8.4.1 ADXL345芯片的工作原理 (202)
8.4.2 ADXL345芯片的接口函数 (206)
8.4.3 ADXL345芯片的编程 (210)
8.5 UART、I2C和SPI的对比 (213)
练习题8 (213)
第9章 嵌入式系统的综合设计 (215)
9.1 嵌入式系统开发流程 (215)
9.2 基于RS-485的分布式温湿度监控和报警系统 (216)
9.2.1 项目论证和需求 (216)
9.2.2 系统的总体设计 (216)
9.2.3 系统硬件的设计 (217)
9.2.4 系统通信协议的设计 (218)
9.2.5 系统软件的设计 (220)
9.2.6 系统的测试和调试 (228)
附录A 底板电路图 (231)
参考文献 (233)