标题：精通ARM嵌入式Linux系统开发
基本信息
作者： 杨水清  [1]
出版社：电子工业出版社 
ISBN：9787121161971
上架时间：2012-5-4
出版日期：2012 年5月
开本：16开
页码：1
版次：1-1
所属分类： 计算机 > 操作系统 > Linux
内容简介
计算机书籍
《精通arm嵌入式linux系统开发(含cd光盘1张) 》由浅入深、通俗易懂地讲解了嵌入式linux的系统设计与开发。全书共25章，从嵌入式处理器arm开始，讲解了arm处理器的资源、arm的指令集、ads开发工具、嵌入式系统硬件环境的构建、bootloader、linux内核移植、嵌入式文件系统、嵌入式linux多任务程序开发、嵌入式linux设备驱动开发、嵌入式linux网络程序开发、minigui图形界面开发、设备驱动开发案例、综合案例等内容。书中通过大量的例程来讲解知识要点，并提供了大量极有参考价值的开发案例，读者可以通过这些例程和开发案例对嵌入式linux开发有一个系统的学习和提高。
《精通arm嵌入式linux系统开发(含cd光盘1张) 》共包括4个方面的内容：在嵌入式系统的硬件结构中讲述了嵌入式处理器arm的特点、嵌入式系统硬件环境的构建和ads开发工具的使用；在嵌入式linux系统移植中讲述了目标板软件环境的构建，主要包括boot loader、linux内核、文件系统及交叉开发环境的构建；在嵌入式linux软件开发中讲述了嵌入式linux c语言开发工具的使用、标准库的使用、多任务开发基础和设备驱动开发基础；在嵌入式应用系统实例分析中讲述了嵌入式linux的网络程序开发、minigui图形界面开发、can总线设备驱动设计、dm9000网络驱动设计、sd卡驱动设计和嵌入式b超系统设计。
《精通arm嵌入式linux系统开发(含cd光盘1张) 》语言通俗易懂，内容丰富，注重理解与实例，知识涵盖面广，非常适合从事嵌入式linux系统开发的初级工程师、高校学生、linux程序开发人员阅读和学习。 
目录
《精通arm嵌入式linux系统开发(含cd光盘1张) 》 
第1章 嵌入式系统概述 1 
本章介绍了嵌入式系统的一些基础知识，解释了什么是嵌入式系统、嵌入式系统中的处理器及嵌入式系统中的软件系统。在学习了本章内容后，读者会对嵌入式系统有一个整体的印象。本章将读者引入嵌入式系统开发的大门，从下一章开始，将逐步学习嵌入式系统的开发过程。 
1.1 嵌入式系统简介 1 
1.1.1 嵌入式系统 1 
1.1.2 嵌入式系统的特点 2 
1.1.3 嵌入式系统的发展趋势 2 
1.2 嵌入式系统中的处理器 4 
1.2.1 微处理器 4 
1.2.2 微控制器 4 
1.2.3 数字信号处理器 5 
1.2.4 嵌入式片上系统 5 
1.3 嵌入式系统中的软件系统 5 
1.3.1 嵌入式系统软件 5 
1.3.2 嵌入式系统软件开发的一般过程 6 
1.3.3 嵌入式应用程序的开发 6 
1.4 本章小结 6 
第2章 快速体验——目标板 7 
本章首先介绍了目标板的结构，然后带领读者对该目标板做了一番初次体验，包括软件的安装和简单使用，以及在linux下体验telnet和ftp命令。希望通过本章的讲解，使读者对嵌入式系统开发有一个初步的、感性的认识。 
2.1 目标板结构 7 
.2.2 arm初体验 8 
2.2.1 测试arm处理器 8 
2.2.2 安装ads 1.2 9 
2.2.3 安装multi-ice和配置axd 11 
2.2.4 ads的简单使用 13 
2.2.5 使用telnet和ftp 16 
2.3 本章小结 16 
第3章 arm的内部资源 17 
本章对s3c2440嵌入式处理器片内资源的基本特性及功能进行了简单的描述，希望读者通过对本章的阅读，能对s3c2440嵌入式处理器的片内资源有一个比较全面的了解和掌握，但在此处不过于深入每一个功能模块的具体细节。如果读者有兴趣对s3c2440的各个功能模块进行详细的了解，可以参考相关用户手册。 
3.1 s3c2440微处理器 17 
3.1.1 主要结构 17 
3.1.2 片内资源 18 
3.1.3 体系结构 18 
3.2 s3c2440存储器映射 18 
3.2.1 bank0总线宽度 18 
3.2.2 nwait引脚的作用 19 
3.2.3 nxbreq/nxback引脚操作 19 
3.3 s3c2440内部资源详解 20 
3.3.1 cache高速缓存 20 
3.3.2 时钟和电源管理 20 
3.3.3 中断控制器 22 
3.3.4 脉冲带宽调制定时器（pwm） 23 
3.3.5 实时时钟（rtc） 23 
3.3.6 通用i/o端口 24 
3.3.7 lcd控制器 24 
3.3.8 uart控制器 25 
3.3.9 a/d转换和触摸屏接口 25 
3.3.10 看门狗定时器 26 
3.3.11 iic总线接口 26 
3.3.12 ac’97音频解码器接口 27 
3.3.13 usb设备控制器 27 
3.3.14 sd接口 27 
3.3.15 spi接口 28 
3.3.16 相机接口 28 
3.3.17 工作电压 29 
3.4 本章小结 29 
第4章 熟悉arm处理器 30 
本章首先介绍了arm公司的历史，并列出了目前比较流行的arm处理器系列，读者可以根据不同的需要做出自己的选择。接下来详细介绍了arm的指令集。希望读者通过本章的学习，能对arm处理器有一个大体的认识，熟悉arm的指令集并在实际开发中学习和应用。 
4.1 为什么用arm 30 
4.2 arm公司简介 30 
4.3 arm微处理器系列 30 
4.3.1 arm7微处理器 30 
4.3.2 arm9微处理器 31 
4.3.3 arm10e微处理器 31 
4.3.4 arm11微处理器 32 
4.4 arm微处理器的结构 32 
4.4.1 体系结构 32 
4.4.2 寄存器结构 33 
4.4.3 指令结构 33 
4.5 arm微处理器的选择 33 
4.5.1 内核的选择 33 
4.5.2 工作频率的选择 33 
4.5.3 芯片内存储器的选择 33 
4.5.4 片内外围电路的选择 34 
4.6 arm的指令集概述 34 
4.6.1 arm微处理器的指令分类和格式 34 
4.6.2 指令的条件域 35 
4.7 arm指令的寻址方式 36 
4.7.1 立即寻址 36 
4.7.2 寄存器寻址 36 
4.7.3 寄存器间接寻址 36 
4.7.4 基址变址寻址 36 
4.7.5 多寄存器寻址 37 
4.7.6 相对寻址 37 
4.7.7 堆栈寻址 37 
4.8 arm指令集详解 38 
4.8.1 跳转指令 38 
4.8.2 数据处理指令 38 
4.8.3 乘法指令与乘加指令 42 
4.8.4 程序状态寄存器访问指令 44 
4.8.5 加载/存储指令 45 
4.8.6 批量数据加载/存储指令 47 
4.8.7 数据交换指令 47 
4.8.8 移位指令 48 
4.8.9 协处理器指令 49 
4.8.10 异常产生指令 51 
4.9 本章小结 51 
第5章 熟悉ads集成开发环境 52 
本章介绍了ads集成开发环境，通过具体的例子，展示了ads的使用过程和主要功能。希望读者通过本章的学习，能够初步学会使用ads，帮助自己学习和开发arm系统。 
5.1 命令行开发工具 52 
5.1.1 armcc介绍 52 
5.1.2 armcc用法详解 53 
5.1.3 armlink介绍 54 
5.1.4 armlink用法详解 54 
5.1.5 arm运行时库 54 
5.1.6 ads调试器 55 
5.1.7 实用程序 56 
5.1.8 支持的软件 56 
5.2 使用ads创建工程 56 
5.2.1 建立一个工程 57 
5.2.2 编译和链接工程 60 
5.2.3 target设置选项 60 
5.2.4 language settings 61 
5.2.5 linker设置 61 
5.2.6 arm fromelf工具 63 
5.2.7 命令行下编译工程 64 
5.3 使用axd调试代码 65 
5.3.1 打开调试文件 65 
5.3.2 查看存储器内容 66 
5.3.3 设置断点 66 
5.3.4 查看变量值 67 
5.4 本章小结 67 
第6章 arm的外部电路 68 
本章详细介绍了基于s3c2440处理器的基本应用电路图。这些电路在s3c2440微处理器的系统设计中会经常使用到，读者也可以根据自身的实际需求，进行必要的修改。 
6.1 核心板电路 68 
6.1.1 晶振电路 68 
6.1.2 复位电路 69 
6.1.3 启动配置电路 69 
6.1.4 flash接口 69 
6.1.5 sdram接口 72 
6.2 底板电路 73 
6.2.1 电源电路 73 
6.2.2 串口电路 74 
6.2.3 usb接口 75 
6.2.4 以太网接口 75 
6.2.5 jtag调试接口 76 
6.2.6 音频接口 77 
6.2.7 lcd接口 77 
6.2.8 sd卡接口 78 
6.3 本章小结 79 
第7章 嵌入式操作系统概述 80 
本章从操作系统的一般特性讲起，介绍了操作系统的进程管理、存储管理、文件管理和设备管理等基本功能。然后对嵌入式操作系统与一般操作系统的特性进行了区别，介绍了嵌入式操作系统的特点、发展和分类。最后介绍了目前常见的一些嵌入式操作系统及它们的特点和主要的应用领域。 
7.1 操作系统的结构和功能 80 
7.2 进程管理 81 
7.2.1 进程的描述 82 
7.2.2 进程的调度 82 
7.3 存储管理 83 
7.3.1 存储器的体系结构 83 
7.3.2 内存管理的基本概念 84 
7.3.3 连续分配存储管理方式 84 
7.3.4 页式存储管理方式 86 
7.4 文件管理 87 
7.4.1 文件 88 
7.4.2 目录 89 
7.4.3 ext2文件系统 89 
7.5 设备管理 92 
7.5.1 设备的分类 92 
7.5.2 数据传输控制方式 93 
7.5.3 中断处理 93 
7.5.4 设备驱动程序 94 
7.6 嵌入式操作系统的特点 95 
7.6.1 嵌入式操作系统的发展 95 
7.6.2 嵌入式操作系统的优势 96 
7.6.3 嵌入式操作系统的分类 96 
7.7 常见的嵌入式操作系统 97 
7.7.1 vxworks 97 
7.7.2 psos 97 
7.7.3 palm os 98 
7.7.4 qnx 98 
7.7.5 windows ce 99 
7.7.6 μc/os-ii 100 
7.7.7 嵌入式linux 100 
7.8 本章小结 101 
第8章 快速体验——构建开发环境 102 
本章主要介绍了嵌入式开发环境的构建过程，首先对交叉开发的概念进行了介绍，说明了在嵌入式系统的开发中采用交叉开发的原因。然后分别介绍了主机环境和目标板系统环境的构建过程，同时对这两个环境的连接方式也做了简要的介绍。最后介绍了目标板系统的3个主要方面：bootloader、kernel和根文件系统，说明了它们的作用和构建方法，同时举例说明了一些常用配置的配置方法。 
8.1 交叉开发环境介绍 102 
8.2 主机与目标板的连接方式 103 
8.2.1 串口通信接口 103 
8.2.2 以太网接口 104 
8.2.3 usb接口 104 
8.2.4 jtag接口 105 
8.3 建立主机开发环境 105 
8.3.1 ubuntu 6.06的安装 105 
8.3.2 minicom的安装配置 107 
8.3.3 tftp服务的安装配置 109 
8.3.4 nfs的安装配置 110 
8.3.5 建立交叉工具链 112 
8.4 启动目标板系统 116 
8.4.1 bootloader和kernel 117 
8.4.2 根文件系统 118 
8.5 本章小结 119 
第9章 linux使用基础 120 
linux的命令行博大精深，有数不清的内容等待读者去探索。本章仅就一些最基本的知识做了最简要的介绍。另外，由于linux中的命令非常多，要全部介绍也是几乎不可能的。因此，本章按照命令的用途进行了分类讲解，力求举一反三。通过本章的介绍，相信读者可以很快地掌握linux命令行的基本操作，并熟练掌握常用的命令。 
9.1 linux的基本概念 120 
9.1.1 文件 120 
9.1.2 目录 120 
9.1.3 分区 121 
9.1.4 挂载 122 
9.1.5 用户系统 122 
9.1.6 用户权限 122 
9.1.7 shell 123 
9.1.8 环境变量 124 
9.2 linux的命令行 124 
9.2.1 执行命令 124 
9.2.2 参数 125 
9.2.3 重定向符号 125 
9.2.4 获取帮助 125 
9.3 linux的常用命令 127 
9.3.1 文件管理 127 
9.3.2 内容管理 130 
9.3.3 权限管理 131 
9.3.4 备份压缩 132 
9.3.5 系统设置 133 
9.3.6 进程控制 136 
9.3.7 网络设置 138 
9.4 本章小结 139 
第10章 bootloader 140 
本章介绍了bootloader的概念、基本结构，并对bootloader的一般工作原理进行了介绍，重点介绍了vivi和u-boot的开发调试及使用。通过学习这两种常见的bootloader，可以使读者实际接触到bootloader的工作原理和代码实现。 
10.1 bootloader的概念 140 
10.1.1 bootloader所支持的嵌入式体系 141 
10.1.2 bootloader的安装位置 141 
10.1.3 bootloader的启动过程 142 
10.1.4 bootloader与主机的通信 142 
10.1.5 bootloader的操作模式 142 
10.2 bootloader的基本结构 143 
10.2.1 bootloader的stage1 143 
10.2.2 bootloader的stage2 144 
10.3 vivi简介 149 
10.3.1 vivi的体系架构 149 
10.3.2 vivi启动的第一阶段 150 
10.3.3 vivi启动的第二阶段 154 
10.4 vivi的基本命令 158 
10.4.1 mem命令 158 
10.4.2 load命令 159 
10.4.3 part命令 159 
10.4.4 param命令 160 
10.4.5 boot命令 160 
10.4.6 go命令 161 
10.4.7 bon命令 161 
10.4.8 reset命令 161 
10.4.9 help命令 161 
10.5 u-boot简介 162 
10.5.1 u-boot的特点 162 
10.5.2 u-boot的目录结构 163 
10.5.3 u-boot的启动过程 163 
10.5.4 u-boot的移植 165 
10.6 u-boot的基本命令 167 
10.6.1 设置环境变量 167 
10.6.2 数据通信 167 
10.6.3 存储器操作 168 
10.6.4 系统引导 168 
10.6.5 其他 169 
10.7 本章小结 169 
第11章 linux内核移植 170 
本章讲解了linux内核移植中需要的基本知识，包括：linux内核的5个子系统及其相互关系；linux内核源码各目录包含的模块及其功能；linux内核编译的方法和步骤；linux内核编译时的详细配置指南；linux内核下载和调试的相关知识。其中需要初学者熟练掌握linux编译的方法和步骤，并对其他相关知识有所了解。 
11.1 linux内核结构 170 
11.2 linux源码结构 171 
11.2.1 arch目录 172 
11.2.2 drivers目录 172 
11.2.3 fs目录 173 
11.2.4 其他目录 174 
11.3 内核编译 175 
11.3.1 编译准备 175 
11.3.2 设置flash分区 176 
11.3.3 配置内核 178 
11.4 内核配置选项 180 
11.4.1 常规设置 180 
11.4.2 模块和块设备层 182 
11.4.3 cpu类型 183 
11.4.4 电源管理 185 
11.4.5 总线和网络 187 
11.4.6 驱动 188 
11.4.7 文件系统 195 
11.4.8 其他 198 
11.5 下载内核 200 
11.6 内核调试 201 
11.6.1 内核调试步骤 201 
11.6.2 常见内核问题 202 
11.7 本章小结 203 
第12章 嵌入式linux文件系统 204 
本章首先介绍了嵌入式系统中两种主要的存储介质nand flash和nor flash，对它们的特点和区别进行了阐述。然后介绍了常见的适用于嵌入式系统的5种文件系统：cramfs文件系统、yaffs 1/2文件系统、jffs 1/2文件系统、ramdisk文件系统和tmpfs/ramfs文件系统，分析了这些文件系统的基本结构和实现原理，介绍了各种文件系统及相应的映像文件的制作方法。最后针对文件系统的选择和设计提出了参考意见和方法。 
12.1 嵌入式文件系统基础 204 
12.1.1 nor型flash存储器 204 
12.1.2 nand型flash存储器 205 
12.1.3 mtd 简介 206 
12.1.4 日志型文件系统 207 
12.1.5 busybox 208 
12.2 cramfs文件系统 210 
12.2.1 cramfs文件系统的特性 210 
12.2.2 cramfs文件系统映像文件的结构 211 
12.2.3 cramfs文件系统的工作原理 212 
12.2.4 cramfs文件系统的初始化过程 213 
12.2.5 cramfs文件系统的制作 213 
12.2.6 cramfs文件系统的挂载流程 216 
12.3 yaffs文件系统 217 
12.3.1 yaffs文件系统的数据存储方式 217 
12.3.2 yaffs文件系统的工作原理 218 
12.3.3 yaffs文件系统对mtd的依赖性 220 
12.3.4 yaffs文件系统驱动的安装流程 222 
12.3.5 yaffs文件系统的制作 222 
12.4 jffs文件系统 224 
12.4.1 jffs1文件系统简介 224 
12.4.2 jffs2文件系统简介 226 
12.4.3 jffs3文件系统简介 228 
12.4.4 jffs2文件系统的工作原理 228 
12.4.5 jffs2文件系统的制作 231 
12.5 基于ram的文件系统 231 
12.5.1 ramdisk文件系统 231 
12.5.2 ramfs/tmpfs文件系统 232 
12.6 嵌入式文件系统的设计 233 
12.6.1 文件系统格式选择的基本策略 234 
12.6.2 混合型文件系统格式的设计方法 234 
12.7 本章小结 235 
第13章 嵌入式linux c语言开发工具 236 
“工欲善其事，必先利其器”，熟悉手头的开发工具是每一个开发人员都必须完成的功课。本章介绍了在开发嵌入式c语言时需要用到的主要开发工具，包括命令行模式下的开发工具：编辑器vim、编译器gcc、调试器gdb、项目管理make、版本管理cvs和图形化模式下的集成开发环境eclipse等。读者可根据个人的喜好选择一种适合自己的开发环境。 
13.1 编辑器vim 236 
13.1.1 vim的编辑模式 236 
13.1.2 vim的进入与退出 238 
13.1.3 光标的移动 239 
13.1.4 删除和恢复 239 
13.1.5 复制和粘贴 240 
13.1.6 查找和替换 240 
13.1.7 网络资源 241 
13.2 编译器gcc 242 
13.2.1 gcc的编译流程 242 
13.2.2 gcc的常用编译选项 245 
13.2.3 实例分析 248 
13.3 调试器gdb 250 
13.3.1 gdb使用概述 250 
13.3.2 gdb的使用流程 251 
13.3.3 gdbserver远程调试 253 
13.4 工程管理make 255 
13.4.1 makefile文件介绍 255 
13.4.2 makefile的规则 256 
13.4.3 makefile的变量 258 
13.4.4 make命令的使用 260 
13.4.5 使用自动工具生成makefile 261 
13.5 集成开发环境eclipse 263 
13.5.1 eclipse的安装 263 
13.5.2 eclipse的界面简介 264 
13.5.3 创建hello项目 265 
13.5.4 调试hello项目 267 
13.5.5 使用cvs进行版本管理 267 
13.6 本章小结 271 
第14章 快速体验——嵌入式c语言开发流程 272 
本章分别介绍了命令行模式下和集成开发环境下开发嵌入式程序的基本流程。首先介绍了在命令行下如何通过vi编辑一个代码文件，如何在pc和开发板上运行编译好的程序和如何通过编写makefile文件提高编译和文件管理的效率。然后介绍了在eclipse下创建工程、编写代码、编译工程和运行最终程序的过程。 
14.1 命令行下的开发流程 272 
14.1.1 编写代码 272 
14.1.2 编译程序 274 
14.1.3 运行程序 275 
14.1.4 交叉编译 275 
14.1.5 编写makefile 276 
14.2 基于eclipse的开发流程 277 
14.2.1 下载和安装eclipse 277 
14.2.2 新建工程 278 
14.2.3 编写代码 279 
14.2.4 编译工程 280 
14.2.5 运行程序 281 
14.3 本章小结 281 
第15章 嵌入式linux c语言基础 282 
本章一起学习和回顾了c语言的基础知识，主要包括：c语言概述、数据类型、运算符、表达式、流程、函数、数组和指针、复杂数据结构。本章的目的在于将c语言的语法精华浓缩成一章的内容，便于读者随时翻阅和查找。通过本章的学习，读者可以立即进入编程的实战阶段。 
15.1 c语言概述 282 
15.1.1 c语言的特点 282 
15.1.2 c语言程序的总体结构 282 
15.1.3 c语言的语句 283 
15.1.4 c语言的关键字 284 
15.1.5 c语言程序设计步骤 284 
15.2 数据类型 284 
15.2.1 基本数据类型 284 
15.2.2 常量与变量 285 
15.2.3 整型数据、实型数据 285 
15.2.4 字符型数据 286 
15.3 运算符 287 
15.3.1 算术运算符 287 
15.3.2 关系和逻辑运算符 287 
15.3.3 位操作符 288 
15.3.4 ？操作符 288 
15.3.5 表达式的优先级 288 
15.4 表达式 289 
15.4.1 类型转换 289 
15.4.2 构成符cast和可读性 289 
15.5 流程控制 289 
15.5.1 格式输入/输出 289 
15.5.2 顺序程序设计 292 
15.5.3 选择结构设计 293 
15.5.4 循环结构设计 294 
15.6 函数 296 
15.6.1 概述 296 
15.6.2 函数定义的一般形式 297 
15.6.3 函数的参数和函数的值 297 
15.6.4 函数的调用 298 
15.6.5 局部变量和全局变量 299 
15.7 数组与指针 300 
15.7.1 数组 300 
15.7.2 指针的基本概念 302 
15.7.3 指针与数组 304 
15.7.4 指针与字符串 306 
15.7.5 指针与函数 307 
15.7.6 指针其他用法 308 
15.7.7 动态内存管理 308 
15.8 复杂数据结构 309 
15.8.1 结构体定义 309 
15.8.2 结构体使用 310 
15.8.3 链表 312 
15.8.4 枚举类型 313 
15.8.5 共用体类型 313 
15.9 本章小结 313 
第16章 嵌入式linux c语言标准库 314 
本章介绍了在linux下编程时常用的标准库函数，包括字符测试、数据转换、基本i/o、标准i/o、内存配置、字符串处理、日期时间、错误处理、系统日志和环境管理等函数。着重介绍了这些函数的基本格式和用法，并对主要的函数进行了举例说明。灵活使用这些函数，将给程序设计带来很大的便利。 
16.1 glibc简介 314 
16.2 字符测试和数据转换函数 316 
16.2.1 字符测试函数 316 
16.2.2 数据转换函数 317 
16.3 基本i/o函数 318 
16.3.1 open()函数 319 
16.3.2 close()函数 320 
16.3.3 read()函数和write()函数 320 
16.3.4 其他函数 321 
16.4 标准i/o函数 322 
16.4.1 fopen()函数 322 
16.4.2 fclose()函数 323 
16.4.3 fread()函数和fwrite()函数 324 
16.4.4 printf()函数和scanf()函数 325 
16.4.5 其他函数 326 
16.5 内存配置及字符串处理函数 326 
16.5.1 内存分配函数 327 
16.5.2 memxxx函数 327 
16.5.3 strxxx函数 330 
16.5.4 释放内存的函数 331 
16.5.5 动态内存分配的实例 332 
16.6 日期时间函数 334 
16.6.1 时间的定义 334 
16.6.2 日历时间 334 
16.6.3 时钟计时单元 336 
16.6.4 格式化日期和时间 337 
16.6.5 自定义时间格式 337 
16.7 其他函数 339 
16.7.1 错误处理函数 339 
16.7.2 系统日志函数 342 
16.7.3 环境管理函数 344 
16.8 本章小结 345 
第17章 嵌入式linux的多任务编程 346 
本章介绍了多任务处理的基本知识，主要介绍了基于进程和线程实现多任务处理的不同特点及区别。分别介绍了进程和线程的概念、数据结构，介绍了创建和终止一个进程或线程的基本方法，同时对于一些较为深入的内容，如僵尸（zombie）进程、线程属性等，也做了基本的介绍。最后，介绍了一种多任务处理的解决方案：线程池，并给出了全部的实现代码，具有很好的参考价值。 
17.1 什么是多任务 346 
17.1.1 对话级多任务 346 
17.1.2 进程级多任务 347 
17.1.3 线程级多任务 347 
17.1.4 多任务处理的特点 348 
17.2 进程 349 
17.2.1 进程的概念 350 
17.2.2 进程的数据结构 351 
17.2.3 进程的创建 353 
17.2.4 文件描述符共享 355 
17.2.5 vfork()函数 357 
17.2.6 exec()函数族 357 
17.2.7 执行新程序 359 
17.2.8 进程的终止 361 
17.2.9 进程的退出状态 363 
17.2.10 zombie进程 365 
17.3 线程 366 
17.3.1 线程的概念 366 
17.3.2 线程的创建 367 
17.3.3 线程的终止 368 
17.3.4 线程的基本属性 370 
17.3.5 线程属性的修改 371 
17.3.6 线程的扩展属性 374 
17.4 线程池 377 
17.4.1 线程池的工作原理 377 
17.4.2 线程池的实现 378 
17.4.3 工作状态的记录 383 
17.4.4 线程池的测试 386 
17.5 本章小结 387 
第18章 多任务间通信和同步 388 
本章介绍了在嵌入式linux下进行多任务处理时，任务间通信和同步的方法。主要介绍了信号、信号集、管道、fifo、共享内存（mmap()方式和semget()方式）等数据通信方式，以及信号量（systemv方式和posix方式）、互斥锁、条件变量等同步方式。这些内容都是编制多任务处理程序时所必备的，而且不同的方式有其不同的特点和适用的场合，因此在实际应用中应该在对任务有充分理解和测试后进行优化选择。 
18.1 信号 388 
18.1.1 信号的概念 388 
18.1.2 信号的产生 390 
18.1.3 kill()函数和raise()函数 390 
18.1.4 alarm()函数和pause()函数 391 
18.1.5 about()函数 392 
18.1.6 信号的处理 392 
18.1.7 signal()函数 392 
18.1.8 sigaction()函数 393 
18.1.9 信号集 395 
18.1.10 sigprocmask()函数 396 
18.1.11 sigpending()函数 396 
18.1.12 sigsuspend()函数 396 
18.2 管道 397 
18.2.1 管道的相关概念 398 
18.2.2 管道的创建 398 
18.2.3 多进程中的管道通信 399 
18.2.4 管道的应用实例 401 
18.2.5 fifo的相关概念 402 
18.2.6 fifo的创建 403 
18.2.7 fifo的读写规则 404 
18.2.8 fifo的应用实例 405 
18.3 共享内存 407 
18.3.1 系统调用mmap() 408 
18.3.2 系统调用munmap() 408 
18.3.3 系统调用msync() 409 
18.3.4 mmap()的应用实例 409 
18.4 system v共享内存 411 
18.4.1 系统调用shmget() 411 
18.4.2 系统调用shmat() 412 
18.4.3 系统调用shmdt() 412 
18.4.4 system v共享内存的应用实例 412 
18.5 消息队列 413 
18.5.1 系统调用msgget() 413 
18.5.2 系统调用msgsnd() 414 
18.5.3 系统调用msgrcv() 414 
18.5.4 系统调用msgctl() 415 
18.5.5 消息队列的应用实例 415 
18.6 system v信号量 417 
18.6.1 系统调用semget() 417 
18.6.2 系统调用semop() 418 
18.6.3 系统调用semctl() 419 
18.6.4 system v信号量的应用实例 419 
18.7 posix信号量 421 
18.7.1 系统调用sem_init() 422 
18.7.2 系统调用sem_wait() 422 
18.7.3 系统调用sem_post() 422 
18.7.4 系统调用sem_destory() 422 
18.7.5 posix信号量的应用实例 422 
18.8 互斥锁 424 
18.8.1 系统调用pthread_mutex_init() 424 
18.8.2 系统调用pthread_mutex_lock() 424 
18.8.3 系统调用pthread_mutex_trylock() 424 
18.8.4 系统调用pthread_mutex_unlock () 425 
18.8.5 系统调用pthread_mutex_destory () 425 
18.8.6 互斥锁的应用实例 425 
18.9 条件变量 427 
18.9.1 系统调用pthread_cond_init() 428 
18.9.2 系统调用pthread_cond_wait () 428 
18.9.3 系统调用pthread_cond_timedwait () 428 
18.9.4 系统调用pthread_cond_signal() 428 
18.9.5 系统调用pthread_cond_broadsignal() 428 
18.9.6 系统调用pthread_cond_destroy() 428 
18.9.7 条件变量的应用实例 429 
18.10 本章小结 430 
第19章 设备驱动开发基础 431 
本章主要介绍了linux驱动开发的基础知识，包括字符设备和块设备驱动。其中字符设备知识主要包括：内核与模块、并发控制、阻塞、中断、内存操作。 
作为初学者，大多数读者并不需要在实际工作中接触到块设备的驱动编写，因此建议读者将主要精力放在学习字符设备驱动之上，而这也足以满足大多数情况下的实际需要。 
19.1 linux设备管理和驱动概述 431 
19.1.1 linux设备的分类 431 
19.1.2 设备驱动程序的作用 431 
19.1.3 访问设备的实现 432 
19.1.4 linux设备控制方式 432 
19.2 linux设备驱动开发流程 434 
19.2.1 构造和运行模块 434 
19.2.2 字符设备驱动编写 435 
19.2.3 字符设备驱动实例 437 
19.2.4 并发控制 440 
19.2.5 阻塞与非阻塞 445 
19.2.6 select和poll 449 
19.2.7 中断处理 451 
19.2.8 内存与i/o操作 452 
19.3 块设备驱动编写 456 
19.3.1 块设备的i/o操作特点 457 
19.3.2 block_device_operations结构体 457 
19.3.3 gendisk结构体 457 
19.3.4 request结构体 459 
19.3.5 request操作函数 462 
19.3.6 bio结构体 464 
19.3.7 注册与注销 466 
19.3.8 加载与卸载 466 
19.3.9 打开与释放 468 
19.3.10 ioctl()函数 468 
19.3.11 i/o请求处理 469 
19.4 本章小结 472 
第20章 嵌入式linux的网络编程 473 
本章介绍了开发嵌入式linux网络程序的基本流程，先后分析了tcp server程序、tcp client程序、udp通信程序、多线程文件服务器程序和proxy程序。针对网络程序涉及的函数多、内容复杂等特点，本章采取了在实际的网络程序代码中学习编程的方法，在阅读代码的同时进行讲解，将在进行网络编程中常用的函数和知识做了详细的阐述，希望对读者理解网络程序的编写能有所帮助。 
20.1 tcp/ip协议 473 
20.2 tcp协议 474 
20.2.1 tcp连接建立的过程 474 
20.2.2 tcp连接的标识 474 
20.2.3 关闭tcp连接 475 
20.3 udp协议 475 
20.4 socket简介 475 
20.4.1 socket的定义 476 
20.4.2 socket的类型 476 
20.5 tcp server程序设计 476 
20.5.1 tcp的通信过程 476 
20.5.2 tcp server程序 477 
20.5.3 网络地址的表示 478 
20.5.4 建立socket 479 
20.5.5 绑定本地地址 479 
20.5.6 字节顺序转换 480 
20.5.7 ip地址转换 481 
20.5.8 listen()函数 481 
20.5.9 等待连接 482 
20.5.10 数据通信 483 
20.5.11 关闭套接字 484 
20.6 tcp client程序设计 485 
20.6.1 dns操作 486 
20.6.2 连接服务器 487 
20.6.3 测试实例 488 
20.7 udp通信的程序设计 489 
20.7.1 udp的通信过程 489 
20.7.2 udp通信服务器端 490 
20.7.3 udp通信客户端 491 
20.8 多线程文件服务器 493 
20.8.1 文件服务器主程序 493 
20.8.2 动态分配监听端口 495 
20.8.3 多线程服务器的实现 495 
20.8.4 大数据量的读写函数 496 
20.8.5 客户端测试例程 499 
20.8.6 编译和测试 501 
20.9 proxy源代码分析 501 
20.9.1 主函数main() 502 
20.9.2 参数处理函数parse_args() 503 
20.9.3 守护进程函数daemonize() 505 
20.9.4 代理服务函数do_proxy() 507 
20.9.5 错误信息函数errorout() 510 
20.10 本章小结 510 
第21章 minigui图形界面设计 511 
本章主要介绍了嵌入式图形界面库minigui的程序设计。首先介绍了minigui的安装、配置及使用eclipse进行minigui应用开发的配置方式。然后对开发minigui程序的基本函数进行解释，包括消息和消息传递、窗口过程、对话框、控件、图形设备和配置文件等方面。最后列举了一个利用minigui编成的图形界面程序miniqq，对这个例程的3个主要窗口的设计与编写进行了详细的介绍。 
21.1 minigui概述 511 
21.1.1 minigui的特点 511 
21.1.2 minigui v1.3.3软件包 512 
21.1.3 minigui运行模式 512 
21.2 minigui的安装和使用 514 
21.2.1 安装minigui库 514 
21.2.2 安装minigui的资源 515 
21.2.3 配置minigui 515 
21.2.4 编译应用程序例子 516 
21.2.5 交叉编译minigui库 516 
21.2.6 交叉编译例程 517 
21.2.7 qvfb图形引擎 518 
21.2.8 framebuffer图形引擎 519 
21.3 利用eclipse编写minigui程序 520 
21.3.1 建立vacs工程 520 
21.3.2 配置编译选项 521 
21.3.3 配置外部工具qvfb 522 
21.3.4 运行vacs 523 
21.3.5 调试vacs 523 
21.4 minigui的编程基础 524 
21.4.1 头文件 525 
21.4.2 程序入口 525 
21.4.3 创建和显示主窗口 526 
21.4.4 进入消息循环 526 
21.4.5 窗口过程函数 528 
21.4.6 屏幕输出 528 
21.4.7 程序的退出 528 
21.5 消息循环和窗口过程 529 
21.5.1 消息处理函数 529 
21.5.2 重要的消息 530 
21.5.3 窗口及窗口过程 530 
21.6 对话框和控件编程 531 
21.6.1 控件的概念 531 
21.6.2 预定义控件 532 
21.6.3 自定义控件 534 
21.6.4 控件子类化 535 
21.6.5 对话框和对话框模板 536 
21.6.6 模态和非模态对话框 538 
21.7 图形设备接口 539 
21.7.1 图形设备上下文 539 
21.7.2 矩形操作和区域操作 540 
21.7.3 像素值和调色板 542 
21.7.4 位图操作函数 543 
21.7.5 字体和文本输出 544 
21.7.6 绘制图形 546 
21.8 其他功能 547 
21.8.1 读写配置文件 547 
21.8.2 定点数运算 548 
21.9 miniqq界面设计 549 
21.9.1 登录窗口 551 
21.9.2 好友列表窗口 554 
21.9.3 聊天窗口 557 
21.9.4 其他 559 
21.10 本章小结 560 
第22章 can总线驱动设计 561 
随着需求的发展，许多工业控制场合需要嵌入式设备，需要提供can总线接口来连接can设备，以满足应用的需要。本章详细介绍了can总线的基础知识，对linux系统下的can驱动程序进行了详细的分析。最后结合《精通arm嵌入式linux系统开发(含cd光盘1张) 》使用的arm9平台，介绍了移植can驱动程序的要点。 
22.1 can总线介绍 561 
22.2 sja1000介绍 561 
22.2.1 sja1000的特性 561 
22.2.2 sja1000内部原理 562 
22.2.3 sja1000引脚说明 563 
22.3 sja1000寄存器介绍 564 
22.3.1 控制寄存器cr 564 
22.3.2 命令寄存器cmr 565 
22.3.3 状态寄存器sr 566 
22.3.4 中断寄存器ir 567 
22.3.5 发送缓冲器 568 
22.3.6 接收缓冲器 568 
22.3.7 验收滤波器 569 
22.4 sja1000与s3c2440连接 569 
22.5 sja1000的驱动程序 571 
22.5.1 驱动程序源代码 571 
22.5.2 测试的操作方法 579 
22.6 本章小结 580 
第23章 sd卡驱动设计 581 
sd卡在嵌入式设备中的使用越来越多，本章首先介绍了sd卡的基本知识和协议内容，然后结合s3c2440的sd卡控制器，详细分析了linux下sd卡的驱动程序，并给出了实现过程。驱动程序的编写对程序员要求很高，不仅要求代码完全正确，效率低下的驱动程序也是不合格的。因此如果要编写出好的驱动程序，经验非常重要。 
23.1 sd卡概述及协议 581 
23.1.1 sd卡概述 581 
23.1.2 sd卡协议 582 
23.2 sd卡驱动设计 583 
23.2.1 块设备驱动设计 583 
23.2.2 sd卡驱动程序分析 584 
23.2.3 sd卡驱动程序设计 586 
23.3 本章小结 588 
第24章 网络驱动设计 589 
近年来，internet获得了突飞猛进的发展。嵌入式系统接入internet后将使得远程监测、远程维护变得非常容易，因此嵌入式系统的网络功能也是非常重要的。嵌入式系统实现internet接入的前提条件是系统的软件中有tcp/ip协议支持。幸运的是，linux内核提供了包括tcp/ip在内的多种协议的支持。本章以dm9000网络芯片为例，分析了linux内核中网络设备驱动程序的运行机理，并介绍了实现linux网络驱动程序的关键过程。 
24.1 linux网络设备概述 589 
24.2 dm9000芯片介绍 590 
24.3 重要的数据结构 591 
24.3.1 通用部分 591 
24.3.2 硬件相关部分 591 
24.3.3 物理层相关数据 592 
24.3.4 网络层协议相关部分 592 
24.3.5 服务处理部分 593 
24.4 网络设备初始化 593 
24.5 激活和关闭网络设备 595 
24.6 中断控制的实现 596 
24.7 发送过程的实现 598 
24.8 接收过程的实现 599 
24.8.1 sk_buff结构 599 
24.8.2 接收函数的实现 601 
24.9 其他接口函数 602 
24.10 本章小结 602 
第25章 综合案例——嵌入式b超 603 
本章针对某一具体实例，向读者展示了嵌入式开发的基本内容和步骤，相信读者读完本章内容以后对嵌入式系统开发会有一个更全面的认识。读者在开发项目的时候，可以参考本章内容，同时更要关注最新的技术发展，以便更好地完成和实现自己的项目设计。 
25.1 系统终端的结构设计 603 
25.1.1 总体结构 603 
25.1.2 显示控制芯片选型 604 
25.2 系统终端的软件设计 604 
25.2.1 u-boot 605 
25.2.2 嵌入式linux移植 605 
25.2.3 minigui移植 606 
25.3 fpga与arm接口设计 608 
25.3.1 硬件连接 608 
25.3.2 fpga驱动程序设计 608 
25.4 显示芯片的连接与控制 610 
25.4.1 选择sm501的原因 610 
25.4.2 sm501驱动程序设计 610 
25.5 超声动态图像的实时显示 612 
25.5.1 图像动态显示 612 
25.5.2 坐标转换和灰度插值 612 
25.6 图形界面的结构 614 
25.6.1 需求分析 614 
25.6.2 总体结构 614 
25.6.3 网络通信 615 
25.6.4 多线程编程 616 
25.7 操作界面设计 616 
25.7.1 区域分配 617 
25.7.2 键盘响应 617 
25.7.3 控件设计 618 
25.8 测量模块设计 619 
25.8.1 椭圆的画法 619 
25.8.2 椭圆测量周长和面积 620 
25.8.3 轨迹法测量面积 621 
25.9 本章小结 621