第1篇 Linux嵌入式开发基础篇 2
第1章 嵌入式系统入门 2
1.1 什么是嵌入式系统 2
1.2 嵌入式系统应用领域 2
1.2.1 家用电器和电子类产品 2
1.2.2 交通工具 3
1.2.3 公共电子设施 3
1.3 嵌入式系统发展 4
1.3.1 嵌入式微控制器 4
1.3.2 嵌入式微处理器 5
1.3.3 未来嵌入式系统发展的方向 5
1.4 典型的嵌入式系统组成 6
1.5 小结 6
第2章 嵌入式软硬件系统 7
2.1 电路基本知识 7
2.1.1 什么是模拟电路 7
2.1.2 什么是数字电路 7
2.1.3 数制转换 8
2.2 计算机组成原理 9
2.2.1 计算机体系的发展 9
2.2.2 中央处理器 9
2.2.3 存储系统 10
2.2.4 总线系统 10
2.2.5 输入输出系统 11
2.3 软件基础知识 11
2.3.1 什么是软件 11
2.3.2 软件开发流程 12
2.3.3 常见的软件开发模型 12
2.3.4 计算机编程语言 13
2.3.5 数据结构 13
2.4 操作系统知识 14
2.4.1 什么是操作系统 14
2.4.2 操作系统的发展历史 14
2.4.3 操作系统由什么组成 15
2.4.4 几种操作系统的设计思路 15
2.4.5 操作系统分类 16
2.5 小结 16
第3章 ARM处理器 17
3.1 微处理器和微控制器 17
3.2 ARM处理器介绍 17
3.2.1 ARM微处理器的应用领域 18
3.2.2 ARM的功能特点 18
3.3 ARM指令集 19
3.3.1 算术运算指令 19
3.3.2 逻辑运算指令 20
3.3.3 分支指令 21
3.3.4 数据传送指令 21
3.4 ARM的结构 22
3.4.1 ARM体系结构的命名方法 22
3.4.2 处理器系列划分 23
3.4.3 处理器工作模式 23
3.4.4 存储系统 24
3.4.5 寻址方式 25
3.5 ARM的功能选型 27
3.5.1 ARM的选型原则 27
3.5.2 几种常见的ARM核处理器选型参考 29
3.6 小结 30
第4章 嵌入式Linux 31
4.1 常见的嵌入式操作系统 31
4.1.1 VxWorks 31
4.1.2 Windows CE 32
4.1.3 PalmOS 32
4.1.4 Symbian 32
4.2 嵌入式Linux操作系统 32
4.2.1 什么是Linux 33
4.2.2 Linux与UNIX的不同——GPL版权协议介绍 33
4.2.3 Linux发行版 34
4.2.4 常见的嵌入式Linux系统 35
4.3 小结 35
第5章 建立软件开发环境 36
5.1 独立的Linux系统 36
5.1.1 安装Ubuntu Linux 36
5.1.2 怎样安装、卸载软件 45
5.1.3 怎样配置系统服务 45
5.1.4 安装主要的开发工具 45
5.1.5 安装其他的开发工具和文档 46
5.2 运行在Windows上的Linux系统 46
5.2.1 什么是Cygwin 47
5.2.2 如何安装Cygwin 47
5.2.3 安装开发环境 50
5.3 Linux常用工具 51
5.3.1 Linux shell和常用命令 51
5.3.2 文本编辑工具vi 52
5.3.3 搜索工具find和grep 53
5.3.4 FTP工具 57
5.3.5 串口工具minicom 59
5.4 Windows常用工具 61
5.4.1 代码编辑管理工具Source Insight 61
5.4.2 串口工具XShell 67
5.5 ARM集成开发环境ADS 68
5.5.1 ADS集成开发环境介绍 69
5.5.2 配置ADS调试环境 69
5.5.3 建立自己的工程 71
5.6 小结 73
第6章 第一个Linux应用程序 74
6.1 向世界问好——Hello,World! 74
6.1.1 用vi编辑源代码文件 74
6.1.2 用gcc编译程序 75
6.1.3 执行程序 75
6.2 程序背后做了什么 76
6.2.1 程序执行的过程 76
6.2.2 窥视程序执行中的秘密 77
6.2.3 动态库的作用 78
6.3 程序如何来的——编译的全部过程 78
6.3.1 编译源代码 79
6.3.2 连接目标文件到指定的库 80
6.4 更简单的办法——用Makefile管理工程 81
6.4.1 什么是Makefile 81
6.4.2 它是如何工作的 82
6.4.3 如何使用Makefile 82
6.4.4 好的源代码管理习惯 82
6.5 小结 83
第2篇 Linux嵌入式开发应用篇 86
第7章 Linux应用程序编程基础 86
7.1 内存管理和使用 86
7.1.1 堆和栈的区别 86
7.1.2 内存管理函数malloc()和free() 89
7.1.3 实用的内存分配函数calloc()和realloc() 89
7.1.4 内存管理编程实例 90
7.2 ANSI C文件管理 93
7.2.1 文件指针和流 93
7.2.2 存储方式 94
7.2.3 标准输入、标准输出和标准错误 94
7.2.4 缓冲 94
7.2.5 打开、关闭文件 95
7.2.6 读写文件 96
7.2.7 文件流定位 98
7.2.8 ANSI C文件编程实例 99
7.3 POSIX文件I/O编程 100
7.3.1 底层的文件I/O操作 100
7.3.2 文件描述符 100
7.3.3 创建/打开/关闭文件 101
7.3.4 读写文件内容 103
7.3.5 文件内容定位 105
7.3.6 修改已打开文件的属性 105
7.3.7 POSIX文件编程实例 106
7.4 小结 107
第8章 开发多进程/线程程序 108
8.1 多进程开发 108
8.1.1 什么是进程 108
8.1.2 进程环境和属性 109
8.1.3 创建进程 110
8.1.4 等待进程结束 112
8.1.5 退出进程 113
8.1.6 常用进程间通信的方法 115
8.1.7 进程编程实例 119
8.2 多线程开发 120
8.2.1 线程的概念 120
8.2.2 进程和线程对比 121
8.2.3 创建线程 121
8.2.4 取消线程 123
8.2.5 等待线程 124
8.2.6 使用pthread库线程操作实例 124
8.3 小结 125
第9章 网络通信应用 126
9.1 网络通信基础 126
9.1.1 TCP/IP协议族 126
9.1.2 IP协议 127
9.1.3 TCP协议 128
9.1.4 UDP协议 129
9.1.5 学习分析协议的方法 129
9.2 Socket通信基本概念 131
9.2.1 创建socket对象 131
9.2.2 面向连接的Socket通信实现 132
9.2.3 面向连接的echo服务编程实例 134
9.2.4 无连接的Socket通信实现 138
9.2.5 无连接的时间服务编程实例 139
9.3 Socket高级应用 142
9.3.1 Socket超时处理 142
9.3.2 使用Select机制处理多连接 143
9.3.3 使用poll机制处理多连接 144
9.3.4 多线程环境Socket编程 146
9.4 小结 146
第10章 串口通信编程 147
10.1 串口介绍 147
10.1.1 什么是串口 147
10.1.2 串口工作原理 147
10.1.3 串口流量控制 148
10.2 开发串口应用程序 149
10.2.1 操作串口需要用到的头文件 149
10.2.2 串口操作方法 149
10.2.3 串口属性设置 150
10.2.4 与Windows串口终端通信 154
10.3 串口应用实例——手机短信发送 156
10.3.1 PC与手机连接发送短信的物理结构 156
10.3.2 AT指令介绍 157
10.3.3 GSM AT指令集 157
10.3.4 PDU编码方式 158
10.3.5 建立与手机的连接 159
10.3.6 使用AT指令发送短信 160
10.4 小结 163
第11章 嵌入式GUI程序开发 164
11.1 Linux GUI介绍 164
11.1.1 Linux GUI的发展 164
11.1.2 常见的嵌入式GUI 165
11.2 开发图形界面程序 166
11.2.1 安装Qt开发环境 166
11.2.2 建立简单的Qt程序 167
11.2.3 Qt库编程结构 170
11.3 深入Qt编程 171
11.3.1 使用Widget 171
11.3.2 对话框程序设计 172
11.3.3 信号与槽系统 176
11.4 移植Qtopia到ARM开发板 177
11.4.1 需要的资源 177
11.4.2 准备工作 177
11.4.3 编译主机Qt工具 178
11.4.4 交叉编译qtopia 179
11.5 小结 180
第12章 软件项目管理 181
12.1 源代码管理 181
12.1.1 什么是软件的版本 181
12.1.2 版本控制的概念 182
12.2 版本控制系统Subversion 183
12.2.1 在Linux系统下使用Subversion服务端 183
12.2.2 在Windows系统下使用TortoiseSVN客户端 185
12.3 开发文档管理——常见的开发文档 190
12.3.1 可行性研究报告 191
12.3.2 项目开发计划 191
12.3.3 软件需求说明书 191
12.3.4 概要设计 191
12.3.5 详细设计 191
12.3.6 用户手册 191
12.3.7 其他文档 192
12.4 使用trac管理软件开发文档 192
12.4.1 安装trac 192
12.4.2 配置trac基本设置 192
12.4.3 配置trac全局脚本 195
12.4.4 设置trac的Web界面 196
12.5 Bug跟踪系统 199
12.5.1 Bug管理的概念和作用 199
12.5.2 使用Bugzilla跟踪Bug 199
12.6 小结 202
第3篇 Linux系统篇 204
第13章 ARM体系结构及开发实例 204
13.1 ARM体系结构介绍 204
13.1.1 ARM体系结构 204
13.1.2 ARM指令集介绍 205
13.2 编程模型 206
13.2.1 数据类型 206
13.2.2 处理器模式 206
13.2.3 寄存器 207
13.2.4 通用寄存器 207
13.2.5 程序状态寄存器 208
13.2.6 异常处理 209
13.2.7 内存和内存I/O映射 210
13.3 内存管理单元 211
13.3.1 内存管理介绍 211
13.3.2 内存访问顺序 211
13.3.3 地址翻译过程 212
13.3.4 访问权限 212
13.4 常见接口和控制器 213
13.4.1 GPIO接口 213
13.4.2 中断控制器 213
13.4.3 RTC控制器 214
13.4.4 看门狗定时器 214
13.4.5 试验:使用GPIO点亮LED 215
13.5 小结 216
第14章 深入Bootloader 217
14.1 初识Bootloader 217
14.1.1 PC(个人电脑)上的Bootloader 217
14.1.2 什么是嵌入式系统的Bootloader 217
14.1.3 嵌入式系统常见的Bootloader 218
14.2 U-Boot分析 219
14.2.1 获取U-Boot 219
14.2.2 U-Boot工程结构分析 219
14.2.3 U-Boot总体工作流程 220
14.3 U-Boot启动流程分析 221
14.3.1 start标号 222
14.3.2 reset标号 224
14.3.3 cpu_init_crit标号 225
14.3.4 lowlevel_init标号 227
14.3.5 relocate标号 227
14.3.6 start_armboot()函数 229
14.3.7 main_loop()函数 232
14.4 移植U-Boot到开发板 237
14.4.1 U-Boot移植的一般步骤 237
14.4.2 移植U-Boot到目标开发板 238
14.4.3 移植U-Boot的常见问题 239
14.5 小结 239
第15章 解析Linux内核 240
15.1 基本知识 240
15.1.1 什么是Linux内核 240
15.1.2 Linux内核版本 241
15.1.3 如何获取Linux内核代码 241
15.1.4 编译内核 241
15.2 Linux内核的子系统 248
15.2.1 系统调用接口 248
15.2.2 进程管理子系统 250
15.2.3 内存管理子系统 250
15.2.4 虚拟文件系统 251
15.2.5 网络堆栈 251
15.2.6 设备驱动 253
15.2.7 依赖体系结构的代码 254
15.3 Linux内核代码的工程结构 254
15.3.1 源代码目录布局 254
15.3.2 几个重要的Linux内核文件 255
15.4 内核编译系统 256
15.4.1 内核编译系统基本架构 257
15.4.2 内核项层Makefile分析 257
15.4.3 内核编译文件分析 262
15.4.4 目标文件清除机制 266
15.4.5 编译辅助程序 267
15.4.6 KBuild变量 269
15.5 小结 270
第16章 嵌入式Linux启动流程 271
16.1 Linux内核初始化流程 271
16.2 PC的初始化流程 272
16.2.1 PC BIOS功能和作用 272
16.2.2 硬盘的数据结构 273
16.2.3 完整的初始化流程 274
16.3 嵌入式系统的初始化 274
16.4 Linux内核初始化 275
16.4.1 解压缩内核映像 275
16.4.2 进入内核代码 277
16.5 启动init内核进程 279
16.6 根文件系统初始化 280
16.6.1 根文件系统介绍 280
16.6.2 挂载虚拟文件系统 282
16.7 内核交出权限 288
16.8 init进程 288
16.9 初始化RAM Disk 289
16.9.1 RAM Disk介绍 289
16.9.2 如何使用RAM Disk 289
16.9.3 实例:使用RAM Disk作为根文件系统 290
16.10 小结 291
第17章 Linux文件系统 292
17.1 Linux文件管理 292
17.1.1 文件和目录的概念 292
17.1.2 文件的结构 292
17.1.3 文件的类型 293
17.1.4 文件系统的目录结构 294
17.1.5 文件和目录的存取权限 296
17.1.6 文件系统管理 298
17.2 Linux文件系统原理 298
17.2.1 非日志文件系统 299
17.2.2 日志文件系统 299
17.3 常见的Linux文件系统 300
17.3.1 ext2文件系统 300
17.3.2 ext3文件系统 302
17.3.3 ReiserFS文件系统 303
17.3.4 JFFS文件系统 304
17.3.5 cramfs文件系统 306
17.4 其他文件系统 306
17.4.1 网络文件系统 307
17.4.2 /proc影子文件系统 308
17.5 小结 311
第18章 建立交叉编译工具链 312
18.1 什么是交叉编译 312
18.2 需要哪些东西 313
18.3 手工创建工具链 313
18.3.1 准备工作——获取源代码 314
18.3.2 开始了——建立工作环境 314
18.3.3 建立Linux内核头文件 315
18.3.4 编译安装binutils 318
18.3.5 编译安装gcc的C编译器 319
18.3.6 编译安装glibc库 320
18.3.7 编译安装gcc的C、C++编译器 321
18.3.8 最后的工作 321
18.4 使用脚本创建工具链 322
18.5 更简便的方法——获取已编译好的交叉编译环境 324
18.6 小结 324
第19章 强大的命令系统BusyBox 325
19.1 BusyBox简介 325
19.1.1 简单易懂的BusyBox 325
19.1.2 BusyBox工作原理 326
19.1.3 安装BusyBox 327
19.2 交叉编译BusyBox 329
19.3 使用BusyBox 331
19.3.1 BusyBox初始化 332
19.3.2 目标板BusyBox安装 334
19.4 小结 336
第20章 Linux内核移植 337
20.1 Linux内核移植要点 337
20.2 平台相关代码结构 338
20.3 建立目标平台工程框架 339
20.3.1 加入编译菜单项 340
20.3.2 设置宏与代码文件的对应关系 340
20.3.3 测试工程框架 341
20.4 建立目标平台代码框架 342
20.4.1 ARM处理器相关结构 342
20.4.2 建立machine desc结构 344
20.4.3 加入处理函数 344
20.4.4 加入定时器结构 345
20.4.5 测试代码结构 345
20.5 构建目标板代码 345
20.5.1 处理器初始化 345
20.5.2 端口映射 347
20.5.3 中断处理 349
20.5.4 定时器处理 349
20.5.5 编译最终代码 349
20.6 小结 349
第21章 内核和应用程序调试技术 350
21.1 使用gdb调试应用程序概述 350
21.2 基本的调试技术 350
21.2.1 列出源代码 353
21.2.2 断点管理 355
21.2.3 执行程序 357
21.2.4 显示程序变量 357
21.2.5 信号管理 358
21.2.6 调试实例 358
21.3 多进程调试 359
21.4 调试意外终止的程序 361
21.5 内核调试技术 363
21.5.1 printk打印调试信息 364
21.5.2 使用/proc虚拟文件系统 364
21.5.3 使用KDB调试工具 367
21.5.4 KDB调试指令 369
21.6 小结 371
第4篇 Linux嵌入式驱动开发篇 374
第22章 Linux设备驱动 374
22.1 设备驱动介绍 374
22.2 Linux内核模块 375
22.2.1 内核模块简介 375
22.2.2 内核模块的结构 375
22.2.3 内核模块的加载和卸载 376
22.2.4 编写一个基本的内核模块 377
22.2.5 编译内核模块 378
22.2.6 为内核模块添加参数 379
22.3 Linux设备驱动 380
22.3.1 PCI局部总线介绍 380
22.3.2 Linux设备驱动基本概念 381
22.3.3 字符设备 381
22.3.4 块设备 384
22.3.5 网络设备 385
22.4 字符设备驱动开发实例 385
22.4.1 开发一个基本的字符设备驱动 385
24.4.2 测试字符设备驱动 387
22.5 小结 388
第23章 网络设备驱动程序 389
23.1 网络基础知识 389
23.1.1 ISO/OSI网络参考模型 389
23.1.2 TCP/IP协议 390
23.2 以太网基础 392
23.2.1 工作原理 393
23.2.2 常见以太网标准 393
23.2.3 拓扑结构 394
23.2.4 工作模式 394
23.3 网卡工作原理 394
23.4 内核网络分层结构 396
23.4.1 内核网络结构 396
23.4.2 与网络有关的数据结构 396
23.4.3 内核网络部分的全局变量 398
23.5 内核网络设备驱动框架 399
23.5.1 net_device结构 399
23.5.2 数据包接收流程 401
23.5.3 数据包发送流程 402
23.6 实例:DM9000网卡驱动分析 403
23.6.1 DM9000芯片介绍 403
23.6.2 网卡驱动程序框架 404
23.6.3 DM9000网卡驱动主要数据结构 404
23.6.4 加载驱动程序 405
23.6.5 停止和启动网卡 411
23.6.6 发送数据包 412
23.6.7 接收数据包 415
23.6.8 中断和定时器处理 417
23.7 小结 419
第24章 Flash设备驱动 420
24.1 Linux Flash驱动结构 420
24.1.1 什么是MTD 420
24.1.2 MTD系统结构 421
24.2 Flash设备基础 422
24.2.1 存储原理 422
24.2.2 性能比较 423
24.3 内核MTD层 424
24.3.1 mtd_info结构 424
24.3.2 mtd_part结构 427
24.3.3 mtd_partition结构 428
24.3.4 map_info结构 428
24.3.5 nand_chip结构 430
24.4 Flash设备框架 431
24.4.1 NOR Flash设备驱动框架 431
24.4.2 NAND Flash设备驱动框架 432
24.5 Flash设备驱动实例——NOR Flash设备驱动剖析 433
24.5.1 数据结构 433
24.5.2 驱动初始化 434
24.5.3 驱动卸载 435
24.6 Flash设备驱动实例——NAND Flash设备驱动分析 436
24.6.1 S3C2440 NAND控制器介绍 436
24.6.2 数据结构 437
24.6.3 驱动初始化 438
24.6.4 驱动卸载 442
24.6.5 初始化NAND控制器 443
24.6.6 设置芯片操作 444
24.6.7 电源管理 446
24.7 小结 447
第25章 USB驱动开发 448
25.1 USB体系介绍 448
25.1.1 USB设计目标 448
25.1.2 USB体系概述 449
25.1.3 USB体系工作流程 450
25.2 USB驱动程序框架 450
25.2.1 Linux内核USB驱动框架 450
25.2.2 主机驱动结构 453
25.2.3 设备驱动结构 456
25.2.4 USB驱动程序框架 458
25.3 USB驱动实例剖析 461
25.3.1 USB串口驱动 461
25.3.2 USB键盘驱动 463
25.4 小结 466