编辑推荐
嵌入式Linux系统开发过程中,从硬件设计到系统移植、软件开发的各方面内容,从底层系统设计到上层应用开发,均以具体的电路或程序实例来进行讲解。目的是带领读者熟悉嵌入式产品开发的全流程。本书由浅入深、循序渐进、内容丰富,取材典型,可作为大中专院校嵌入式相关专业的本科生、研究生的教材使用,也可供从事嵌入式Linux开发的工程师参考。
1、硬件平台应用广泛。
2、系统性强
3、实例方式讲解,方式新颖
4、结合Linux驱动+QT4+数据库(Sqlite)教材,并可以给出大量实际项目实例。
内容简介
本书全面介绍了嵌入式Linux系统开发过程中,从硬件设计到系统移植、软件开发的各方面内容,包含硬件设备的设计原理(囊括了常见硬件,如RAM、Flash、UART、USB、LCD和电源管理等)、Linux操作系统的安装及相关嵌入式开发软件的使用、嵌入式Linux编程所需的基本知识(Makefile语法、shell编程等)、BootLoader和内核、文件系统、QT4的移植、驱动程序的编写和测试、QT4应用程序的编写。
本书从底层系统设计到上层应用开发,均以具体的电路或程序实例来进行讲解。目的是带领读者熟悉嵌入式产品开发的全流程。本书由浅入深、循序渐进、内容丰富,取材典型,可作为大中专院校嵌入式相关专业的本科生、研究生的教材使用,也可供从事嵌入式Linux开发的工程师参考。
作者简介
刘龙本科硕士皆毕业于东北师范大学物理系,从事教育工作8年。曾荣获校突出贡献个人称号。2006年起至今从事嵌入式Linux教学工作,对此有一定了解。发表关于单片机及嵌入式方向文章,核心及EI级别,文章6篇。第二作者文章5篇。2008年与某公司合作开发基于EP9315与Linux的大型游戏机板卡一部。
内页插图
目录
目录
硬件设计篇
第1章 硬件系统概述 2
1.1 硬件系统资源 2
1.2 S5PV210处理器 3
1.2.1 S5PV210微处理器概述 3
1.2.2 内部各模块介绍 4
第2章 核心板电路设计 10
2.1 S5PV210芯片地址分配 10
2.2 DDR2 SDRAM芯片 13
2.2.1 DDR2 SDRAM工作
原理 13
2.2.2 DDR2 SDRAM硬件
设计 16
2.3 SLC Nand Flash芯片 17
2.3.1 Nor Flash与NAND
Flash对比 17
2.3.2 SLC与MLC NAND
Flash技术对比 18
2.3.3 K9F4G08UOB引脚
功能 19
2.3.4 NAND Flash硬件设计 21
2.4 DM9000A以太网控制器 23
2.4.1 DM9000a引脚及功能 24
2.4.2 DM9000硬件设计 25
2.5 WM8960X音频编解码芯片 27
2.5.1 IIS总线接口概述 27
2.5.2 WM8960概述 27
2.5.3 WM8960硬件设计 29
第3章 扩展板电路设计 32
3.1 LED电路 32
3.1.1 发光二极管简介 32
3.1.2 发光二极管的检测 33
3.1.3 发光二极管电路设计 33
3.2 蜂鸣器电路 34
3.2.1 蜂鸣器简介 34
3.2.2 蜂鸣器电路设计 35
3.3 按键电路 36
3.3.1 按键分类 36
3.3.2 按键设计技巧 36
3.3.3 按键电路设计 38
3.4 串行通信接口电路 39
3.4.1 RS-232C标准 39
3.4.2 MAX3232芯片 40
3.4.3 串行通信接口电路
设计 41
3.5 EEPROM电路 42
3.5.1 I2C总线协议概述 42
3.5.2 AT24C02介绍 43
3.5.3 AT24C02的读写操作 44
3.5.4 AT24C02电路设计 46
3.6 SD卡电路 46
3.6.1 SD卡概述 46
3.6.2 SD卡的物理接口 47
3.6.3 SD卡的应用模式 48
3.6.4 S5PV210与SD卡的
电路设计 50
3.7 重力传感器电路 50
3.8 USB电路 51
3.8.1 USB基础知识 51
3.8.2 USB设备检测 53
3.8.3 USB2.0 OTG 接口 53
3.8.4 S5PV210的USB接口
电路设计 54
3.9 LCD电路 55
3.9.1 液晶显示屏(LCD) 55
3.9.2 S5PV210内部LCD
控制器 56
3.9.3 LCD接口电路设计 56
3.10 HDMI高清多媒体接口 57
3.10.1 HDMI概述 57
3.10.2 HDMI物理接口 58
3.10.3 S5PV210的HDMI
接口电路设计 59
3.11 RJ45网络接口 60
3.12 电源及复位电路 61
3.12.1 AMS1086电源芯片 61
3.12.2 RT9011电源芯片 62
3.12.3 IMP811电源监控及
复位芯片 62
驱动开发篇
第4章 嵌入式Linux开发环境构建 66
4.1 基本概念 66
4.2 常用Linux命令 67
4.3 软件包安装及配置 69
4.3.1 PuTTY安装及配置 69
4.3.2 VMware8安装 72
4.3.3 Redhat Enterprise5.5
安装 73
4.4 交叉编译器安装 83
4.5 Windows与Linux共享文件
设置 83
4.6 TFTP与NFS服务器配置 87
4.6.1 配置TFTP服务器 88
4.6.2 配置NFS服务器 89
第5章 Make工程管理及Shell
编程 92
5.1 Make工程管理 92
5.1.1 Make工程管理器 92
5.1.2 Make工作步骤 93
5.1.3 Make程序示例 93
5.1.4 Makefile语法 96
5.2 Shell编程 99
5.2.1 Bash ShelL简介 99
5.2.2 Bash Shell常用命令 100
5.2.3 重定向与管道 104
5.2.4 简单Shell应用 108
5.2.5 Shell编程语法 109
系统移植篇
第6章 移植U-Boot 136
6.1 BootLoader简介 136
6.2 常见的BootLoader 137
6.3 U-Boot分析 138
6.4 U-Boot移植 140
6.4.1 配置U-Boot 140
6.4.2 修改内存配置 141
6.4.3 修改DM9000网卡配置 146
6.4.4 修改电源管理功能 149
6.4.5 加入USB下载功能 151
6.4.6 添加启动zImage内
核支持 151
6.5 U-Boot常用命令 153
6.6 U-Boot启动参数分析 156
6.7 烧写U-Boot至Nand Flash 158
6.7.1 将U-Boot烧写至
SD卡 158
6.7.2 将U-Boot烧写至
Flash 165
第7章 移植Linux内核 166
7.1 Linux内核版本简介 166
7.2 内核源码结构 167
7.3 内核移植准备 168
7.3.1 内核编译过程 168
7.3.2 Linux Makefile分析 169
7.3.3 内核Kconfig分析 172
7.3.4 内核配置及编译命令 176
7.4 内核移植 177
7.4.1 内核基本配置 177
7.4.2 修改NANDFlash
分区 182
7.4.3 修改LCD信息 183
7.4.4 DM9000驱动移植 188
7.4.5 蜂鸣器驱动修改 193
7.4.6 RTC驱动修改 193
7.4.7 USB驱动移植 194
7.4.8 TSC2007触摸屏驱动
移植 197
7.4.9 FT5406触摸屏驱动
移植 199
7.4.10 WM8960声卡驱动
移植 200
7.5 调试、烧写内核 203
第8章 制作根文件系统 205
8.1 根文件系统组成 205
8.2 制作根文件系统 207
8.2.1 生成根文件系统
目录 207
8.2.2 配置编译BusyBox 209
8.2.3 使用glibc库文件 211
8.2.4 建立配置文件 212
8.3 网络挂载及固化根文件系统 217
8.3.1 NFS挂载根文件系统 217
8.3.2 烧写根文件系统至
NAND Flash 219
第9章 移植触摸库及Qt4库 222
9.1 移植Tslib触摸库 222
9.2 移植QTE库 223
9.3 Linux下Qt Creator开发环境
安装及配置 226
9.4 QWT安装配置 232
9.4.1 QWT在X86平台上的
安装 233
9.4.2 QWT在ARM平台上
的安装 234
9.5 QWT简单示例 235
项目实战篇
第10章 驱动开发基础 242
10.1 驱动程序中的基本概念 242
10.1.1 设备驱动程序概述 242
10.1.2 设备驱动的分类 242
11.1.3 驱动程序、操作系统、
应用程序的关系 243
10.1.4 常见的系统调用
函数 244
10.2 驱动开发要点 247
10.2.1 用户态和内核态 247
10.2.2 模块机制 248
10.3 Hello World驱动程序 248
10.3.1 驱动模块组成 249
10.3.2 Hello World驱动模
块程序 250
10.3.3 编译Hello World
模块 250
10.3.4 调试Hello World
模块 252
前言/序言
《嵌入式Linux应用与系统编程实践》 一、 前言 在快速发展的嵌入式系统领域,Linux凭借其开源、灵活、强大的特性,已成为众多开发者的首选平台。从智能家居到工业自动化,从车载娱乐到医疗设备,嵌入式Linux无处不在,并不断挑战着技术创新的边界。本书正是基于这一背景,旨在为广大嵌入式开发爱好者、初学者以及希望深入理解Linux系统层面的工程师们,提供一套系统、实用的学习路径和实践指导。 本书不同于市面上许多侧重于硬件平台或特定操作系统内核讲解的图书,我们将目光聚焦于嵌入式Linux的应用层开发和系统级编程。我们深知,一个成熟的嵌入式Linux产品,不仅仅依赖于底层的硬件驱动和内核调度,更在于上层应用的稳定高效运行,以及对操作系统特性的深度挖掘和灵活运用。因此,本书将以“实践”为核心,通过大量的代码示例、案例分析和调试技巧,带领读者逐步掌握在嵌入式Linux环境下进行软件开发的各项关键技能。 我们将从Linux系统的基础概念入手,循序渐进地深入到进程管理、内存管理、文件系统、网络通信、多线程并发等核心系统编程主题。同时,本书还将重点关注嵌入式开发特有的挑战,例如资源受限环境下的优化、实时性需求的处理、以及与其他硬件模块的交互方式。我们力求让读者不仅理解“是什么”,更能掌握“怎么做”,并能够举一反三,解决实际开发中遇到的各种问题。 本书的编写,参考了大量经典的Linux编程书籍和开源项目,并结合了多年嵌入式Linux开发实践的经验。我们致力于用清晰的语言、严谨的逻辑,以及具有实际指导意义的内容,帮助读者构建扎实的嵌入式Linux软件开发功底。希望本书能成为您在嵌入式Linux开发旅程中的得力助手。 二、 内容梗概 本书的内容设计,力求覆盖嵌入式Linux应用与系统编程的广度和深度,以“由浅入深,实践导向”为原则。我们将围绕以下几个核心模块展开: 第一部分:嵌入式Linux开发环境搭建与基础 1. Linux开发环境的构建: 介绍交叉编译工具链的原理与使用,如何配置和使用构建系统(如Buildroot或Yocto Project的入门概念),以及常见的开发板和虚拟机环境的搭建。我们将强调理解环境的配置对后续开发效率的重要性,并提供详细的操作步骤。 2. Linux命令行与Shell脚本: 深入讲解嵌入式开发中常用的Linux命令,以及Shell脚本在自动化任务、系统部署中的强大作用。通过实例演示,让读者掌握如何编写高效的Shell脚本来简化开发流程。 3. Linux文件系统与常用工具: 介绍Linux文件系统的基本结构、文件权限管理、链接等概念。掌握如`find`、`grep`、`sed`、`awk`等文本处理工具,以及`make`、`gdb`等开发调试工具的使用。 第二部分:嵌入式Linux系统编程核心 1. 进程与线程管理: 进程概念与创建: 深入理解进程的生命周期、PCB(Process Control Block)的概念,掌握`fork()`、`exec()`系列函数族的使用,以及进程间通信(IPC)的多种机制,包括管道(pipe)、命名管道(FIFO)、消息队列(Message Queue)、共享内存(Shared Memory)和信号量(Semaphore)。 线程概念与创建: 介绍线程与进程的区别,Pthreads库的使用,线程的创建、同步与互斥(mutexes)、条件变量(condition variables)的应用。特别关注在嵌入式系统中,线程模型如何影响资源利用和实时性。 2. 内存管理与虚拟内存: 内存分配: 讲解`malloc`、`calloc`、`realloc`、`free`等动态内存分配函数的原理与使用,以及内存泄漏的检测与预防。 虚拟内存与分页: 介绍Linux虚拟内存模型、页表、TLB等概念,理解进程地址空间的布局。讲解`mmap()`函数在内存映射文件、匿名映射、设备映射中的高级应用。 3. 文件I/O与设备文件: 标准I/O与系统I/O: 对比`stdio.h`和`unistd.h`中的文件操作函数,理解其在缓冲机制、性能上的差异。 文件描述符: 深入理解文件描述符的概念,掌握`open()`、`read()`、`write()`、`lseek()`、`close()`等函数的使用,以及`fcntl()`函数实现的高级文件控制。 设备文件: 介绍Linux中“一切皆文件”的哲学,理解字符设备、块设备、网络设备的概念,以及如何通过`/dev`目录下的设备文件与硬件进行交互。 4. 信号与异常处理: 信号机制: 详细讲解Linux信号的类型、发送、接收与处理。掌握`signal()`、`sigaction()`函数的使用,以及可靠信号处理的注意事项。 异常处理: 介绍`setjmp()`/`longjmp()`实现的长跳转,以及`try-catch-finally`(GCC扩展)在某些场景下的应用。 第三部分:嵌入式Linux网络通信编程 1. Socket编程基础: 网络协议栈: 简要回顾TCP/IP协议族的基本概念,包括IP地址、端口、TCP/UDP的区别。 Socket API: 详细讲解Socket API,包括`socket()`、`bind()`、`listen()`、`accept()`、`connect()`、`send()`/`recv()`、`sendto()`/`recvfrom()`等函数的使用。 TCP服务器与客户端: 通过完整的代码示例,实现一个基于TCP的简单服务器和客户端,演示连接建立、数据传输与断开过程。 UDP通信: 实现基于UDP的通信,对比TCP在可靠性、连接性方面的特点。 2. 高级网络编程: I/O多路复用: 深入讲解`select()`、`poll()`、`epoll()`等I/O多路复用技术,理解其在处理大量并发连接时的优势,并编写高效的多路复用服务器。 网络配置与管理: 介绍嵌入式Linux系统中网络接口的配置、IP地址管理,以及常用的网络诊断工具。 嵌入式网络应用: 探讨在嵌入式设备上实现HTTP客户端/服务器、MQTT通信等实际应用场景。 第四部分:嵌入式Linux系统优化与性能调优 1. 性能剖析与调试: 性能剖析工具: 介绍`strace`、`ltrace`、`gprof`、`perf`等工具,用于跟踪系统调用、库函数调用,分析程序性能瓶颈。 内存调试: 使用`valgrind`等工具检测内存泄漏、内存越界等问题。 2. 嵌入式Linux系统优化: 代码优化: 讲解算法优化、数据结构选择、避免不必要的系统调用等常用优化技巧。 多线程与并行: 探讨如何利用多线程或多进程实现并行计算,提高处理效率。 资源管理: 在资源受限的嵌入式环境下,如何合理分配CPU、内存、I/O资源。 3. 实时性考量(初步): 进程优先级与调度: 介绍Linux进程调度的基本策略,以及如何通过`nice`值、`SCHED_FIFO`、`SCHED_RR`等进行简单的实时性控制。 中断与延迟: 简要讨论中断处理对实时性的影响。 第五部分:嵌入式Linux开发实战案例 本书将穿插多个精心设计的实战案例,例如: 多线程数据采集与处理系统: 结合传感器接口,演示如何使用多线程同时采集数据并进行实时分析。 简单的嵌入式Web服务器: 利用Socket编程和HTTP协议,搭建一个可在嵌入式设备上运行的Web服务器,用于远程监控和控制。 网络摄像头流媒体服务: 讲解如何利用Linux提供的多媒体框架(如V4L2)和网络通信技术,实现视频流的采集与传输。 基于SQLite的本地数据存储: 演示如何在嵌入式设备上使用轻量级数据库SQLite进行数据持久化。 三、 目标读者 本书的目标读者群广泛,主要包括: 嵌入式系统初学者: 希望系统学习嵌入式Linux系统编程和应用开发,为进入该领域打下坚实基础的工程师和学生。 有一定C/C++基础但缺乏Linux系统编程经验的开发者: 希望将C/C++技能应用于嵌入式Linux平台的开发者。 Android应用开发者: 希望深入理解Android系统底层,学习Linux系统编程,以便进行更底层的开发或优化。 Linux应用开发者: 希望将Linux应用开发经验拓展到资源受限的嵌入式环境中的开发者。 电子工程、计算机科学相关专业的在校学生: 作为学习嵌入式Linux开发的辅助教材。 四、 本书特色 实践性强: 全书以大量实用的代码示例贯穿始终,强调“动手实践”,帮助读者将理论知识转化为实际技能。 内容系统全面: 覆盖了嵌入式Linux应用开发和系统编程的绝大多数核心技术点,形成完整的知识体系。 深入浅出: 概念讲解清晰易懂,同时深入剖析底层原理,帮助读者知其然更知其所以然。 面向嵌入式挑战: 充分考虑了嵌入式系统资源受限、实时性要求等特点,提供了相应的解决方案和优化建议。 贴近实际开发: 案例分析紧密结合实际开发需求,帮助读者解决真实项目中的问题。 语言严谨、逻辑清晰: 力求内容准确、条理分明,便于读者理解和吸收。 五、 结语 嵌入式Linux开发是一个充满挑战与机遇的领域。掌握了扎实的系统编程和应用开发技能,将为您打开通往更广阔技术世界的大门。本书期望能成为您学习和实践嵌入式Linux的得力伙伴,伴随您在技术探索的道路上不断前进。我们相信,通过本书的学习,您将能够自信地驾驭嵌入式Linux平台,设计和开发出稳定、高效、智能的嵌入式产品。
第二段评价 对于我这种主要从事嵌入式Linux应用层开发的工程师来说,这本书无疑是一本“硬核”的参考。我并没有直接去编译和烧录书中的内核代码,但我对其中关于Linux设备驱动模型和框架的讲解尤为关注。作者对字符设备、块设备、网络设备驱动的编写流程,以及总线、设备、驱动模型的匹配机制,进行了非常系统和深入的阐述。特别是对Linux内核中一些重要的子系统,如kobject、kset、sysfs的介绍,虽然这些内容在应用开发中不一定直接接触,但理解了它们的工作原理,对于排查驱动层面的问题,或者与内核进行更有效的交互,有着至关重要的作用。书中关于线程同步机制的讲解,特别是自旋锁、互斥锁、信号量的使用场景和注意事项,以及对上下文切换的深入剖析,也让我对Linux系统的高并发处理有了更清晰的认识。虽然我对S5PV210具体硬件的了解不多,但书中关于Linux内核移植、交叉编译环境的搭建,以及根文件系统的构建等章节,对于任何想深入了解嵌入式Linux系统底层的开发者来说,都是不可或缺的知识。我尤其喜欢作者在讲解驱动编写时,会结合具体的代码实例,并对代码的每一部分进行详尽的解释,这使得枯燥的代码变得生动起来。尽管我可能不会去实现书中的每一个硬件接口的驱动,但学习其编写的通用方法和设计思想,对我未来开发自己的驱动或者理解第三方驱动,大有裨益。