第一篇 嵌入式系统开发基础 1
第1章 嵌入式系统介绍 1
1.1嵌入式系统的概念 1
1.1.1嵌入式系统的定义 1
1.1.2嵌入式系统的特点 2
1.2嵌入式系统的组成 2
1.2.1嵌入式处理器 3
1.2.2外围设备 3
1.2.3嵌入式操作系统 3
1.2.4应用软件 3
1.3嵌入式处理器 4
1.3.1嵌入式处理器的分类 4
1.3.2嵌入式微处理器 5
1.3.3嵌入式微控制器 5
1.3.4嵌入式DSP处理器 6
1.3.5嵌入式片上系统 6
1.3.6选择嵌入式处理器 7
1.4嵌入式操作系统 7
1.4.1操作系统的概念和分类 8
1.4.2实时操作系统 8
1.4.3常用的嵌入式操作系统 10
1.5新型的嵌入式操作系统 13
1.5.1 Android 13
1.5.2 MontaVista 15
1.6嵌入式系统的应用 15
1.7嵌入式系统的发展趋势 18
1.7.1嵌入式系统面临的挑战 18
1.7.2嵌入式系统的发展前景 19
1.8本章小结 20
第2章 嵌入式软件开发过程与工具 21
2.1嵌入式软件开发介绍 21
2.1.1嵌入式软件开发的特殊性 21
2.1.2嵌入式软件的分类 22
2.1.3嵌入式软件的开发流程 22
2.1.4嵌入式软件开发工具的发展趋势 24
2.2嵌入式软件的调试技术 25
2.2.1调试技术介绍 25
2.2.2基于JTAG的ARM系统调试 26
2.3嵌入式软件测试技术 27
2.3.1宿主机—目标机开发模式 27
2.3.2目标监控器 28
2.4嵌入式系统集成开发环境 30
2.4.1 ADS的介绍 30
2.4.2 ADS建立工程的使用介绍 32
2.4.3 AXD调试器的使用介绍 37
实例2-1 ARM开发环境ADS的使用实例 39
2.5本章小结 43
第3章 嵌入式处理器体系结构 44
3.1 ARM体系结构概述 44
3.1.1 ARM体系结构简介 45
3.1.2 ARM体系结构的技术特征 47
3.1.3 CISC的体系结构 48
3.1.4 RISC的体系结构 48
3.1.5 RISC系统和CISC系统的比较 50
3.2 ARM微处理器的分类 51
3.2.1 ARM7微处理器 51
3.2.2 ARM9微处理器 52
3.2.3 ARM9E微处理器 52
3.2.4 ARM 10E微处理器 53
3.2.5 ARM 11微处理器 54
3.2.6 SecurCore微处理器 54
3.2.7 StrongARM微处理器 54
3.2.8 XScale微处理器 55
3.3 ARM微处理器的应用 55
3.3.1 ARM微处理器的应用选型 55
3.3.2 S3C2410处理器 56
3.4存储器 57
3.4.1存储器简介 57
3.4.2 SDRAM操作 59
3.4.3 Flash 60
3.5 ARM编程模型 61
3.5.1数据类型 61
3.5.2存储器格式 62
3.5.3处理器工作状态 62
3.5.4处理器运行模式 63
3.5.5寄存器组织 63
3.5.6内部寄存器 66
3.6 ARM指令的寻址方式 67
3.6.1立即寻址 67
3.6.2寄存器寻址 68
3.6.3寄存器间接寻址 68
3.6.4相对寻址 69
3.6.5堆栈寻址 69
3.6.6块复制寻址 70
3.6.7变址寻址 70
3.6.8多寄存器寻址 71
3.7 ARM指令集 71
3.7.1 ARM指令的格式 71
3.7.2 ARM指令分类 72
3.7.3 Thumb指令介绍 78
3.7.4 Thumb指令分类 79
3.7.5 ARM指令集和Thumb指令集的区别 82
3.8 ARM微处理器的异常 83
3.8.1 ARM体系结构所支持的异常类型 84
3.8.2异常矢量表 85
3.8.3异常优先级 85
3.8.4应用程序中的异常处理 86
3.8.5各类异常的具体描述 87
3.9本章小结 91
第二篇Linux开发入门 92
第4章Linux开发常用操作 92
4.1 Linux系统介绍 92
4.1.1 Linux的概况 93
4.1.2 Linux操作系统的构成 94
4.1.3 Linux常见的发行版本 95
4.1.4 Linux内核的特点 97
4.2 Linux命令的使用 98
4.3 vi编辑器的使用 108
4.3.1 vi编辑器的进入 108
4.3.2命令模式的命令 109
4.3.3末行模式的命令 110
实例4-1 vi编辑器使用实例 110
4.4 Shell编程 112
4.4.1 Shell基础介绍 112
4.4.2 Shell程序的变量和参数 114
4.4.3运行Shell程序 116
4.4.4 Shell程序设计的流程控制 117
4.4.5 Shell输入与输出 121
4.4.6 bash介绍 123
4.5综合实例 124
实例4-2编写清除/var/log下的log文件综合实例 124
实例4-3编写寻找死链接文件综合实例 127
4.6本章小结 131
第5章Linux内核介绍 132
5.1进程概述 132
5.1.1进程结构 133
5.1.2进程的控制操作 134
5.1.3进程的属性 136
5.1.4进程的创建和调度 137
5.1.5 Linux进程命令 139
5.2系统调用 143
5.2.1系统调用概述 143
5.2.2系统调用的进入 144
5.2.3与进程管理相关的系统调用 145
5.3管道 145
5.3.1管道系统调用 145
5.3.2管道的分类 147
实例5-1管道通信实例 148
5.4信号 150
5.4.1常见的信号种类 150
5.4.2系统调用函数 151
5.4.3信号的处理 152
5.4.4信号与系统调用的关系 152
实例5-2信号实例 153
5.5信号量 154
5.5.1信号量概述 154
5.5.2相关的数据结构 155
5.5.3相关的函数 157
实例5-3信号量实例 158
5.6共享内存 163
5.6.1共享内存原理 163
5.6.2共享内存对象的结构 164
5.6.3相关的函数 165
实例5-4共享内存实例 166
5.7消息队列 171
5.7.1有关的数据结构 171
5.7.2相关的函数 174
实例5-5消息队列实例 176
5.8综合实例 179
实例5-6多线程编程实例 179
5.9本章小结 180
第6章Linux开发环境的构建 181
6.1建立Linux开发环境概述 181
6.1.1 Cygwin开发环境 181
6.1.2 VMware Workstation开发环境 183
6.2交叉编译的使用 185
6.2.1 GNU交叉工具链的设置 185
6.2.2 ARM GNU常用汇编语言 188
6.2.3 GNU交叉工具链的常用工具 190
6.2.4交叉编译环境 193
6.3 Linux下的C编程 196
6.3.1 Linux程序设计特点 196
6.3.2 Linux下C语言编码的风格 197
6.3.3 Linux程序基础 197
6.3.4 Linux下C编程的库依赖 199
6.4 gcc的使用与开发 199
6.4.1 gcc简介和使用 199
6.4.2 gcc选项 200
6.4.3 gcc的错误类型 203
实例6-1 gcc编译器环境的应用实例 204
6.5 gdb调试器的介绍和使用 205
6.5.1 gdb调试器的使用 205
6.5.2在gdb中运行程序 206
6.5.3暂停和恢复程序运行 208
6.5.4远程调试 211
实例6-2 gdb调试器环境的应用实例 211
6.6 GNU make和Makefile的使用 213
6.6.1 Makefile的基本结构 214
6.6.2 Makefile的变量 215
6.6.3 Makefile的隐含规则 217
6.6.4 Makefile的命令使用 220
6.6.5 Makefile的函数使用 221
6.6.6 Makefile文件的运行 223
6.6.7 Makefile规则书写命令 225
实例6-3 Makefile的命令使用实例 231
6.7 autoconf和automake的使用 233
6.7.1 autoconf的使用 233
6.7.2 Makefile.am的编写 236
6.7.3 automake的使用 236
6.7.4使用automake和autoconf产生Makefile 237
6.7.5自动生成Makefile的方法 237
6.8综合实例 238
实例6-4 gcc编译器的综合实例 238
实例6-5 gdb调试器的综合实例 241
实例6-6 Makefile的综合实例 244
6.9本章小结 246
第三篇 嵌入式系统移植与构建 247
第7章Bootloader的使用 247
7.1 Bootloader概述 248
7.1.1 Bootloader的作用 248
7.1.2 Bootloader的功能 249
7.1.3 Bootloader的种类 250
7.1.4 Bootloader的工作模式 251
7.1.5 Bootloader的启动方式 251
7.1.6 Bootloader的启动流程 253
7.1.7 Bootloader与主机的通信 253
7.2 vivi的移植 253
7.2.1 vivi的常用命令和文件结构 254
7.2.2 vivi第一阶段的分析 255
7.2.3 vivi第二阶段的分析 261
7.2.4 vivi的配置与编译 263
7.3 U-boot的移植 264
7.3.1 U-boot常用命令和源代码目录结构 264
7.3.2 U-boot支持的主要功能 268
7.3.3 U-boot的编译和添加命令 268
7.3.4 U-boot的启动介绍 272
7.3.5 U-boot的移植和使用 273
7.3.6 U-boot的启动过程 275
7.3.7 U-boot的调试 276
7.4其他常见的Bootloader 278
7.5综合实例 280
实例7-1 vivi编译实例 280
实例7-2 U-boot在S3C2410上的移植实例 281
实例7-3 Bootloader设计实例 283
7.6本章小结 285
第8章Linux内核裁剪与移植 286
8.1 Linux移植简介 286
8.1.1 Linux可移植性发展 287
8.1.2 Linux的移植性 287
8.2 Linux内核结构 288
8.2.1 Linux内核组成 288
8.2.2子系统相互间的关系 292
8.2.3系统数据结构 293
8.2.4 Linux内核源代码 293
8.3 Linux内核配置 297
实例8-1 Linux内核配置实例 297
8.4 Linux操作系统移植介绍 300
8.4.1 Linux系统移植的两大部分 300
8.4.2内核文件的修改 302
8.4.3系统移植所必需的环境 306
8.5综合实例 309
实例8-2编译Linux内核应用实例 309
实例8-3 Linux内核的烧写实例 311
实例8-4使用KGDB构建Linux内核调试环境 312
8.6本章小结 321
第9章Linux根文件系统的构建 322
9.1 Linux文件系统概述 322
9.1.1 Linux文件系统的特点 322
9.1.2其他常见的嵌入式文件系统 324
9.1.3 Linux根文件目录结构 326
9.1.4 Linux文件属性介绍 326
9.2使用BusyBox生成工具集 327
9.2.1 BusyBox概述 327
9.2.2 BusyBox进程和用户程序启动过程 328
9.2.3编译/安装BusyBox 329
实例9-1用BusyBox建立简单的根文件系统 333
9.3构建根文件系统 335
9.3.1根文件系统制作流程 335
实例9-2构建根文件系统 339
9.4配置yaffs文件 341
9.4.1 yaffs文件系统设置 342
9.4.2 yaffs文件系统测试 344
9.5综合实例 345
实例9-3制作/使用yaffs文件系统映像文件 345
实例9-4制作/使用jffs2文件系统映像文件 347
9.6本章小结 349
第四篇 嵌入式系统开发 350
第10章 设备驱动程序开发 350
10.1设备驱动程序概述 351
10.1.1驱动程序的简介 351
10.1.2设备分类 351
10.1.3设备号 352
10.1.4设备节点 353
10.1.5驱动层次结构 353
10.1.6设备驱动程序的特点 354
10.2设备驱动程序与文件系统 355
10.2.1设备驱动程序与文件系统的关系 355
10.2.2设备驱动程序与操作系统的关系 355
10.2.3 Linux设备驱动程序的接口 356
10.2.4设备驱动程序开发的基本函数 361
10.2.5 Linux驱动程序的加载 362
10.3设备驱动程序的使用 366
10.3.1驱动程序模块的加载 366
10.3.2创建设备文件 367
10.3.3使用设备 367
10.4网络设备基础知识 367
10.4.1网络协议 367
10.4.2网络设备接口基础 369
10.5网络设备驱动程序的架构 371
10.5.1网络设备驱动程序体系结构 371
10.5.2网络设备驱动程序模块分析 372
10.5.3网络设备驱动程序的实现模式 378
10.5.4网络设备驱动程序的数据结构 379
10.6综合实例 383
实例10-1键盘驱动开发实例 383
实例10-2 12C总线驱动的编写实例 386
实例10-3 TFT-LCD显示驱动实例 390
10.7本章小结 395
第11章 嵌入式常用GUI开发 396
11.1嵌入式系统中的GUI简介 397
11.1.1嵌入式 GUI系统的介绍 397
11.1.2基于嵌入式Linux的GUI系统底层实现基础 399
11.1.3嵌入式GUI系统的分析与比较 399
11.2嵌入式系统下MiniGUI的实现 401
11.2.1图形用户界面MiniGUI简介 401
11.2.2 MiniGUI的发布版本 403
11.2.3 MiniGUI在S3C2410处理器上的移植过程 406
11.3 Qt/Embedded嵌入式图形开发基础 409
11.3.1 Qt/Embedded开发环境的安装 409
11.3.2 Qt/Embedded底层支持及实现代码分析 413
11.3.3 Qt/Embedded信号和插槽机制 414
11.3.4 Qt/Embedded窗口部件 417
11.3.5 Qt/Embedded图形界面编程 420
11.3.6 Qt/Embedded对话框设计 421
11.3.7数据库 422
实例11-1 Qt/Embedded图形开发应用实例 425
11.4 Qtopia移植 426
11.4.1 Qtopia简介 426
11.4.2交叉编译、安装Qtopia 426
实例11-2 Qtopia移植应用实例 428
11.5 Qt/Embedded应用开发 429
11.5.1嵌入式硬件开发平台的选择 429
11.5.2 Qt/Embedded常用工具的介绍 431
11.5.3交叉编译Qt/Embedded的库 432
11.5.4 Qt/E程序的编译与执行 433
实例11-3 Qt/Embedded实战演练 434
11.6综合实例 438
实例11-4 Hello, Qt/Embedded应用程序 438
实例11-5基本绘图应用程序的编写 441
11.7本章小结 445
第12章 嵌入式系统工程实例 446
12.1文件系统的生成与烧写 446
12.1.1 yaffs文件系统的制作与生成 447
12.1.2 jffs2文件系统的制作与生成 451
12.2基于Linux的数码相框 454
12.2.1系统需求分析 454
12.2.2系统总体设计 455
12.2.3软件设计实现 456
12.2.4软硬件集成 463
12.3基于Linux的MPlayer解码播放器 464
12.3.1可行性分析报告 464
12.3.2系统总体设计 465
12.3.3软件总体设计 466
12.3.4软件详细设计 470
12.3.5软硬件集成 480
12.4基于Linux的GPS导航系统的开发 481
12.4.1嵌入式开发流程 482
12.4.2 GPS导航定位系统的系统定义 484
12.4.3 GPS导航系统的可行性分析报告 489
12.4.4 GPS导航系统需求分析 490
12.4.5 GPS导航系统总体设计实现 493
12.4.6 GPS导航系统硬件设计实现 494
12.4.7 GPS导航系统软件概括设计 498
12.4.8 GPS导航系统软件详细设计 498
12.4.9 GPS导航系统数据库的配置设计 525
12.4.10 GPS导航系统软件实现 537
12.4.11 GPS导航系统软硬件集成 538
12.4.12 GPS导航系统功能性能测试 540
12.5本章小结 541