第一篇 开发基础 1
第1章 嵌入式系统基础知识 1
1.1 嵌入式系统概述 1
1.1.1 嵌入式系统的定义 1
1.1.2 嵌入式系统的特点 1
1.1.3 嵌入式系统的发展历史 3
1.1.4 嵌入式系统的应用领域 5
1.1.5 嵌入式系统与PC之间的区别 6
1.2 嵌入式系统的组成 7
1.3 典型的嵌入式操作系统 10
1.4 ARM处理器平台介绍 11
1.5 嵌入式系统开发 14
1.6 嵌入式Linux软件设计 16
1.6.1 嵌入式Linux软件需求分析 16
1.6.2 嵌入式Linux软件架构设计 17
1.7 实践拓展 18
1.8 思考与练习 18
第2章 Linux环境下C语言的开发 19
2.1 C语言简单回顾 19
2.2 Linux下的C语言开发环境 20
2.3 嵌入式Linux C语言的开发 21
2.4 Linux系统 22
2.4.1 Linux的安装、启动与关闭 25
2.4.2 Linux的基本使用 25
2.4.3 Linux的常用命令 27
2.5 嵌入式Linux中程序的运行原理 34
2.6 实践拓展 35
2.7 思考与练习 36
第3章 构建嵌入式Linux开发环境 37
3.1 嵌入式系统开发环境的构建 37
3.2 移植U-Boot 40
3.2.1 BootLoader概述 40
3.2.2 U-Boot分析与移植 48
3.3 嵌入式Linux操作系统内核编译 51
3.3.1 内核的配置 51
3.3.2 内核编译的过程 52
3.4 内核的移植 52
3.5 实践拓展 53
3.6 思考与练习 54
第二篇 基础编程 55
第4章 Linux下C编程基础 55
4.1 嵌入式Linux C语言编程概述 55
4.2 嵌入式Linux编辑器Vi 56
4.2.1 Vi的基本模式 56
4.2.2 Vi的基本操作 57
4.2.3 Vi的使用实例分析 59
4.3 嵌入式Linux编译器GCC 60
4.3.1 GCC编译流程分析 60
4.3.2 GCC编译选项分析 63
4.3.3 GCC使用的库函数 67
4.4 嵌入式Linux调试器GDB的使用 70
4.4.1 GDB使用实例 70
4.4.2 GDB的帮助命令 74
4.4.3 设置/删除断点 75
4.4.4 数据相关命令 76
4.4.5 调试运行环境相关命令 76
4.4.6 堆栈相关命令 77
4.5 make工程管理器 77
4.5.1 Makefile文件的构成 78
4.5.2 Makefile变量 79
4.5.3 make的使用 81
4.6 Emacs综合编辑器 81
4.6.1 Emacs的启动与退出 81
4.6.2 Emacs的基本编辑 82
4.6.3 Emacs的C模式 83
4.6.4 Emacs的Shell模式 84
4.7 实践拓展 84
4.8 思考与练习 85
第5章 数据、运算符和表达式 86
5.1 C程序的结构和语法规则 86
5.2 C程序语句概述 88
5.3 基本概念 89
5.3.1 标识符 89
5.3.2 关键字 89
5.3.3 常量 90
5.3.4 变量 90
5.4 基本数据类型 90
5.4.1 整型变量及其常量 90
5.4.2 浮点型变量及其常量 91
5.4.3 字符型变量及其常量 92
5.4.4 长整型、短整型和无符号整型 94
5.4.5 类型定义typedef 95
5.5 算术运算符、赋值运算符及其表达式 95
5.5.1 算术运算符和算术表达式 96
5.5.2 赋值运算符和赋值表达式 99
5.6 关系运算符、逻辑运算符及其表达式 100
5.6.1 关系运算符和关系表达式 100
5.6.2 逻辑运算符和逻辑表达式 101
5.7 逗号运算符和逗号表达式 102
5.8 变量的初始化 103
5.9 不同类型数据之间的转换 103
5.9.1 自动类型转换 103
5.9.2 强制类型转换 104
5.10 实践拓展 104
5.11 思考与练习 105
第6章 数据的输入和输出 106
6.1 数据的输出 106
6.1.1 字符输出函数putchar() 106
6.1.2 格式输出函数printf() 107
6.2 数据的输入 112
6.2.1 字符输入函数getchar() 112
6.2.2 格式输入函数scanf() 113
6.3 实践拓展 116
6.4 思考与练习 117
第7章 基本语句 118
7.1 结构化程序设计概述 118
7.2 语句和复合语句 119
7.3 条件语句 119
7.3.1 if语句 119
7.3.2 条件运算符 124
7.3.3 switch语句 125
7.4 循环控制 126
7.4.1 while循环语句 126
7.4.2 do-while循环语句 127
7.4.3 for循环语句 128
7.4.4 goto语句 130
7.4.5 break语句和continue语句 131
7.5 实践拓展 134
7.6 思考与练习 134
第8章 数组 136
8.1 一维数组 136
8.1.1 一维数组的定义和引用 136
8.1.2 一维数组元素的初始化 138
8.2 二维数组 140
8.2.1 二维数组的定义和引用 140
8.2.2 二维数组元素的初始化 142
8.3 字符数组和字符串 144
8.3.1 字符数组 144
8.3.2 字符串和字符串结束标志 146
8.3.3 字符串处理函数 147
8.4 实践拓展 150
8.5 思考与练习 151
第9章 函数、编译预处理 152
9.1 函数的概念 152
9.2 函数的定义和调用 153
9.2.1 函数的定义 154
9.2.2 函数的调用 155
9.3 函数的返回值 155
9.4 函数的参数及其传递方式 159
9.4.1 非数组作为函数参数 159
9.4.2 数组作为函数参数 160
9.5 函数的嵌套调用和递归调用 162
9.5.1 函数的嵌套调用 162
9.5.2 函数的递归调用 163
9.6 变量的作用域及其存储类型 164
9.6.1 局部变量及其存储类型 164
9.6.2 全局变量及其存储类型 166
9.7 内部函数和外部函数 166
9.8 编译预处理 167
9.8.1 宏定义 167
9.8.2 文件包含处理 169
9.8.3 条件编译 171
9.9 实践拓展 172
9.10 思考与练习 173
第10章 动态内存的堆与栈 174
10.1 程序内存区域的使用 174
10.1.1 C语言程序的存储区域 174
10.1.2 C语言中的动态内存 176
10.2 C程序中栈的应用 177
10.3 C程序中堆空间的使用 180
10.4 堆内存和栈内存使用的比较 183
10.5 实践拓展 184
10.6 思考与练习 184
第11章 指针、回调函数、结构体与共同体 185
11.1 指针 185
11.1.1 指针的概念 185
11.1.2 变量的指针和指向变量的指针变量 185
11.1.3 数组的指针和指向数组的指针变量 188
11.1.4 字符串的指针和指向字符串的指针变量 189
11.1.5 函数的指针和指向函数的指针变量 190
11.1.6 指针数组和指向指针的指针 192
11.2 回调函数 193
11.2.1 回调函数的概念与作用 193
11.2.2 回调函数的语法 194
11.3 结构体 195
11.3.1 结构体类型变量 195
11.3.2 结构体数组 197
11.3.3 指向结构体类型数据的指针 199
11.3.4 用指针处理链表 200
11.4 共同体 202
11.5 实践拓展 205
11.6 思考与练习 205
第12章 Linux C语言嵌入汇编语言与移植性问题 207
12.1 嵌入汇编语言 207
12.1.1 C和汇编的接口 207
12.1.2 内嵌汇编的语法 207
12.1.3 memory描述符 210
12.1.4 GCC对内嵌汇编语言的处理方式 211
12.2 嵌入式Linux可移植性问题 211
12.2.1 字长和数据类型 211
12.2.2 数据对齐 212
12.2.3 字节顺序 213
12.3 实践拓展 214
12.4 思考与练习 214
第三篇 高级编程 215
第13章 嵌入式Linux环境下GUI开发技术 215
13.1 嵌入式图形用户界面概述 215
13.2 Linux下几种主流的GUI 216
13.2.1 MiniGUI 216
13.2.2 Qt/Embedded 218
13.2.3 MicroWindows 219
13.2.4 OpenGUI 219
13.2.5 GTK+ 219
13.3 基于GTK+的图形界面编程 220
13.3.1 GTK+程序的初始化与退出 221
13.3.2 GTK+预定义的函数和数据类型 222
13.3.3 回调函数 223
13.3.4 GTK+的事件处理 224
13.3.5 使用GTK+实现“Hello World”程序 224
13.3.6 编译GTK+程序 226
13.3.7 在GTK+中排列控件 226
13.3.8 常用控件 228
13.4 实践拓展 233
13.5 思考与练习 234
第14章 嵌入式Linux设备驱动开发 235
14.1 Linux设备驱动程序概述 235
14.2 Linux设备驱动程序与内核的关系 236
14.3 Linux设备驱动程序开发基础 237
14.3.1 内存管理问题 237
14.3.2 中断处理 239
14.3.3 I/O端口 242
14.3.4 DMA处理 242
14.3.5 时间流 244
14.4 字符设备驱动 245
14.4.1 字符设备驱动相关函数和结构体 245
14.4.2 字符设备驱动程序实例 248
14.5 块设备驱动 249
14.5.1 块设备驱动概述 249
14.5.2 与块设备相关的结构体 250
14.6 网络设备驱动 254
14.6.1 网络设备概述 254
14.6.2 网络设备的运行机制 255
14.6.3 数据包的发送与接收 255
14.6.4 网络设备驱动程序的加载 256
14.6.5 DM9000网卡驱动程序分析 257
14.7 实践拓展 260
14.8 思考与练习 261
第15章 Linux文件操作 262
15.1 Linux文件结构 262
15.1.1 Linux文件系统 264
15.1.2 Linux文件类型 265
15.1.3 Linux文件的访问权限控制 266
15.2 文件操作相关函数 268
15.2.1 文件的打开与关闭 269
15.2.2 文件的读写 271
15.2.3 文件的定位 273
15.2.4 出错检测 275
15.2.5 文件的属性操作 276
15.2.6 文件的移动和删除 281
15.3 目录操作 281
15.3.1 目录的创建和删除 281
15.3.2 获取当前目录 282
15.3.3 设置工作目录 283
15.3.4 获取目录信息 283
15.4 制作根文件系统 285
15.4.1 Linux根文件系统的制作 285
15.4.2 制作根文件系统的镜像 287
15.5 实践拓展 288
15.6 思考与练习 288
第16章 进程 289
16.1 Linux进程 289
16.1.1 Linux进程概述 289
16.1.2 Linux进程调度 291
16.1.3 进程的内存映像 295
16.2 进程控制 296
16.2.1 创建进程 296
16.2.2 创建守护进程 298
16.2.3 退出进程 300
16.2.4 改变进程的优先级 302
16.2.5 执行新程序 303
16.2.6 等待进程结束 303
16.3 进程间通信 305
16.3.1 管道 306
16.3.2 有名管道 307
16.3.3 消息队列 308
16.3.4 信号量 310
16.3.5 共享内存 312
16.4 编程实例——哲学家用餐问题 315
16.5 实践拓展 318
16.6 思考与练习 318
第17章 线程控制 319
17.1 Linux线程 319
17.1.1 线程和进程的关系 319
17.1.2 线程分类 320
17.2 创建线程 321
17.3 线程属性 323
17.4 线程等待和终止 327
17.5 私有数据 328
17.6 线程同步 328
17.6.1 互斥锁 329
17.6.2 条件变量 332
17.6.3 异步信号 333
17.7 出错处理 334
17.7.1 错误码 334
17.7.2 出错处理相关函数 335
17.8 实践拓展 337
17.9 思考与练习 338
第四篇 综合实例 339
第18章 嵌入式网络防御体系设计 339
18.1 嵌入式网络防御设计概述 339
18.2 需求分析 340
18.2.1 软件需求分析 340
18.2.2 硬件需求分析 341
18.3 Linux操作系统移植 341
18.3.1 构建嵌入式Linux开发环境 341
18.3.2 BootLoader移植 343
18.3.3 将Linux内核移植到S3C2410 345
18.3.4 移植YAFFS文件系统 348
18.3.5 构建Linux根文件系统 350
18.4 系统软件设计 353
18.4.1 网络基础知识 353
18.4.2 sniff原理 355
18.5 做自己的YASON 356
18.5.1 事前准备 356
18.5.2 YASON之旅 366
18.6 实践拓展 377
第19章 ARM Linux视频采集与传输 379
19.1 硬件平台概述 379
19.2 S3C2410处理器 379
19.3 系统的软件结构 381
19.4 视频采集的系统程序 381
19.4.1 JFFS2文件系统的建立 381
19.4.2 摄像头驱动的加载 382
19.4.3 BootLoader移植 383
19.4.4 将Linux内核移植到S3C2410 384
19.5 视频采集的应用程序 384
19.5.1 视频采集程序 384
19.5.2 视频采集关键步骤 386
19.5.3 视频编码程序 390
19.5.4 数据传输程序 391
19.6 实践拓展 395
第20章 ARM Linux指纹识别 396
20.1 自动指纹识别系统概述 396
20.2 指纹识别原理 397
20.3 系统硬件结构 400
20.4 指纹采集芯片fps200 400
20.5 Linux操作系统移植 402
20.5.1 BootLoader移植 402
20.5.2 将Linux内核移植到S3C2410 402
20.5.3 加载指纹芯片驱动程序 404
20.5.4 加载文件系统 405
20.6 系统软件设计 406
20.6.1 系统的初始化 406
20.6.2 指纹采集与处理 407
20.6.3 指纹识别算法的实现 409
20.7 实践拓展 414
附录A 嵌入式Linux函数索引 415
附录B Linux Shell常用命令索引 422
参考文献 424