上篇 原理部分 3
第1章 嵌入式系统概述 3
1.1 嵌入式系统简介 3
1.1.1 嵌入式系统历史与现状 3
1.1.2 嵌入式系统体系结构 4
1.1.3 应用领域和发展方向 5
1.2 嵌入式微处理器 6
1.2.1 嵌入式处理器简介 6
1.2.2 ARM微处理器的应用领域及一般特点 7
1.2.3 ARM微处理器系列 8
1.3 嵌入式操作系统 8
1.3.1 嵌入式操作系统简介 8
1.3.2 嵌入式Linux 9
1.3.3 Windows CE 10
1.3.4 Symbian 11
1.3.5 Android 11
1.3.6 uC/OS-II 12
1.3.7 VxWorks 12
1.3.8 其他嵌入式操作系统 12
1.4 嵌入式系统设计 13
1.4.1 嵌入式系统设计过程 13
1.4.2 硬件设计平台的选择 14
1.4.3 软件设计平台的选择 14
1.4.4 嵌入式应用软件开发 16
1.4.5 测试和优化 17
1.5 小结 18
第2章 ARM处理器和架构 19
2.1 ARM处理器概述 19
2.1.1 ARM公司和ARM产品简介 19
2.1.2 ARM指令集体系结构版本 20
2.1.3 ARM微处理器系列 21
2.2 ARM9处理器架构 23
2.2.1 ARM9寄存器 23
2.2.2 流水线技术和哈佛体系结构 26
2.2.3 CP15协处理器 28
2.3 ARM9处理器的内存管理 30
2.3.1 内存管理单元的作用 30
2.3.2 ARM9内存管理 30
2.4 ARM9异常处理 36
2.4.1 ARM9异常 36
2.4.2 ARM9异常处理向量表 37
2.4.3 ARM9异常处理过程 37
2.5 小结 38
第3章 ARM9指令集和汇编 40
3.1 ARM指令集概述 40
3.1.1 RISC简介 40
3.1.2 ARM状态和Thumb状态 41
3.1.3 ARM9指令类型和指令的条件域 42
3.2 ARM指令的寻址方式 45
3.2.1 立即寻址 45
3.2.2 寄存器寻址 46
3.2.3 寄存器偏移寻址 46
3.2.4 寄存器间接寻址 46
3.2.5 基址变址寻址 46
3.2.6 多寄存器寻址 47
3.2.7 堆栈寻址 47
3.2.8 相对寻址 48
3.3 ARM指令简介 48
3.3.1 跳转指令 48
3.3.2 通用数据处理指令 50
3.3.3 乘法指令 53
3.3.4 Load/Store内存访问指令 55
3.3.5 ARM协处理器指令 58
3.3.6 杂项指令 60
3.3.7 饱和算术指令 61
3.3.8 ARM伪指令 62
3.4 Thumb指令简介 63
3.4.1 Thumb跳转指令 63
3.4.2 Thumb通用数据处理指令 64
3.4.3 Thumb算术指令 66
3.4.4 Thumb内存访问指令 68
3.4.5 Thumb软中断和断电指令 70
3.4.6 Thumb伪指令 71
3.5 小结 71
第4章 嵌入式Linux操作系统 72
4.1 嵌入式Linux简介 72
4.1.1 uCLinux 72
4.1.2 RT-Linux 73
4.1.3 红旗嵌入式Linux 73
4.2 内存管理 73
4.2.1 内存管理和MMU 73
4.2.2 标准Linux的内存管理 74
4.2.3 uCLinux的内存管理 75
4.3 进程管理 76
4.3.1 进程和进程管理 76
4.3.2 RT-Linux的进程管理 77
4.3.3 标准Linux的进程管理 78
4.3.4 uCLinux的进程管理 80
4.4 文件系统 80
4.4.1 文件系统定义 80
4.4.2 Linux文件系统 80
4.4.3 嵌入式Linux文件系统 82
4.5 小结 86
第5章 Boot Loader技术 87
5.1 Boot Loader基本概念 87
5.1.1 Boot Loader所支持的硬件环境 87
5.1.2 Boot Loader的安装地址 88
5.1.3 Boot Loader相关的设备和基址 88
5.1.4 Boot Loader的启动过程 88
5.1.5 Boot Loader的操作模式 88
5.1.6 Boot Loader与主机之间的通信设备及协议 89
5.2 Boot Loader的典型结构 89
5.2.1 Boot Loader阶段1介绍 90
5.2.2 Boot Loader阶段2介绍 92
5.2.3 关于串口终端 97
5.3 U-Boot简介 98
5.3.1 认识U-Boot 98
5.3.2 U-Boot特点 98
5.3.3 U-Boot代码结构分析 99
5.4 vivi简介 110
5.4.1 认识vivi 110
5.4.2 vivi代码导读 110
5.5 小结 118
第6章 ARM-Linux内核 119
6.1 ARM-Linux内核简介 119
6.1.1 ARM-Linux内核和普通Linux内核的区别 120
6.1.2 ARM-Linux的版本控制 120
6.1.3 ARM-Linux的代码结构 120
6.2 ARM-Linux内存管理 121
6.2.1 影响内存管理的两个方面 121
6.2.2 ARM-Linux的存储机制 122
6.2.3 虚拟内存 125
6.3 ARM-Linux进程管理和调度 129
6.3.1 进程的表示和生命周期 129
6.3.2 Linux进程的创建、执行和销毁 131
6.3.3 Linux进程的调度 134
6.4 ARM-Linux的模块机制 135
6.4.1 Linux模块概述 135
6.4.2 模块代码结构 136
6.4.3 模块的加载 137
6.4.4 模块的卸载 138
6.4.5 版本依赖 139
6.5 ARM-Linux的中断管理 139
6.6 ARM-Linux的系统调用 143
6.7 ARM-Linux系统的启动和初始化 145
6.7.1 使用Boot Loader将内核映像载入 145
6.7.2 内核数据结构初始化——内核引导第一部分 145
6.7.3 外设初始化——内核引导第二部分 146
6.7.4 init进程和inittab脚本 147
6.7.5 rc启动脚本 148
6.7.6 Shell的启动 148
6.8 小结 149
第7章 文件系统 150
7.1 嵌入式文件系统 150
7.1.1 嵌入式文件系统简介 150
7.1.2 Linux文件系统简介 152
7.2 嵌入式Linux文件系统框架 153
7.3 JFFS2嵌入式文件系统 154
7.3.1 目录节点的定义 156
7.3.2 数据节点 156
7.3.3 可靠性支持 157
7.3.4 内存使用 157
7.3.5 垃圾收集 159
7.3.6 写平衡 159
7.3.7 JFFS2的不足之处 160
7.3.8 JFFS3简介 160
7.4 根文件系统 160
7.4.1 什么是根文件系统 160
7.4.2 建立JFFS2根文件系统 161
7.5 小结 165
第8章 设备驱动 166
8.1 Linux驱动程序简介 166
8.1.1 设备的分类 167
8.1.2 设备文件 167
8.1.3 主设备号和次设备号 168
8.1.4 Linux设备驱动代码的分布 168
8.1.5 Linux设备驱动程序的特点 169
8.2 设备驱动程序结构 169
8.2.1 驱动程序的注册与注销 169
8.2.2 设备的打开与释放 170
8.2.3 设备的读写操作 171
8.2.4 设备的控制操作 171
8.2.5 设备的轮询和中断处理 171
8.3 Linux内核设备模型 172
8.3.1 设备模型建立的目的 173
8.3.2 sysfs——设备拓扑结构的文件系统表现 173
8.3.3 驱动模型和sysfs 174
8.3.4 kobject 175
8.3.5 platform总线 177
8.4 同步机制 179
8.4.1 同步锁 179
8.4.2 信号量 183
8.4.3 读写信号量 184
8.4.4 原子操作 185
8.4.5 完成事件(completion) 187
8.4.6 时间 187
8.5 内存映射和管理 189
8.5.1 物理地址映射到虚拟地址 190
8.5.2 内核空间映射到用户空间 190
8.6 工作队列 193
8.7 异步I/O 195
8.8 DMA 197
8.8.1 DMA数据传输 198
8.8.2 DMA定义 198
8.8.3 DMA映射 199
8.9 小结 199
第9章 开发环境和调试技术 200
9.1 交叉开发环境模式概述 200
9.2 宿主机环境 201
9.2.1 串口终端 202
9.2.2 BOOTP协议 202
9.2.3 TFTP协议 202
9.2.4 交叉编译 203
9.2.5 make工具 203
9.3 目标板环境 208
9.3.1 JTAG接口简介 208
9.3.2 Boot Loader简介 208
9.4 交叉编译工具链 208
9.4.1 交叉编译的构建 209
9.4.2 相关工具 209
9.5 gdb调试器 212
9.6 远程调试 216
9.6.1 远程调试原理 216
9.6.2 gdb远程调试功能 217
9.6.3 使用gdbserver 218
9.7 内核调试 221
9.7.1 内核调试技术 221
9.7.2 kgdb内核调试 223
9.8 网络调试 224
9.9 小结 226
第10章 字符设备和驱动程序设计 228
10.1 字符设备驱动框架 228
10.2 字符设备驱动开发 229
10.2.1 设备号 229
10.2.2 关键数据结构 232
10.2.3 字符设备注册和注销 235
10.3 GPIO驱动概述 236
10.4 串行总线概述 237
10.4.1 SPI总线 237
10.4.2 I2C总线 238
10.4.3 SMBus总线 239
10.5 I2C总线驱动开发 239
10.5.1 I2C驱动架构 239
10.5.2 关键数据结构 240
10.5.3 I2C核心 243
10.5.4 I2C总线驱动 244
10.5.5 I2C设备驱动 245
10.6 小结 246
第11章 块设备和驱动程序设计 247
11.1 块设备驱动程序设计概要 247
11.1.1 块设备的数据交换方式 248
11.1.2 块设备读写请求 248
11.2 Linux块设备驱动相关数据结构与函数 249
11.2.1 gendisk结构 249
11.2.2 request结构 250
11.2.3 request_queue队列 252
11.2.4 bio结构 254
11.3 块设备的注册与注销 256
11.4 块设备初始化与卸载 256
11.5 块设备操作 256
11.6 请求处理 258
11.7 MMC/SD卡驱动 259
11.7.1 MMC/SD芯片介绍 260
11.7.2 MMC/SD卡驱动结构 264
11.7.3 MMC/SD卡块设备驱动分析 265
11.7.4 HSMCI接口驱动设计分析 272
11.8 小结 282
第12章 网络设备驱动程序开发 283
12.1 以太网基础知识 283
12.1.1 CSMA/CD协议 285
12.1.2 以太网帧结构 286
12.1.3 嵌入式系统中常用网络协议 287
12.2 嵌入式网络设备驱动开发概述 288
12.3 网络设备驱动基本数据结构 290
12.3.1 net_device数据结构 290
12.3.2 sk_buffer数据结构 292
12.4 网络设备初始化 293
12.5 打开和关闭接口 294
12.6 数据接收与发送 294
12.7 查看状态与参数设置 295
12.8 AT91SAM9G45网卡驱动 296
12.8.1 EMAC模块简介 296
12.8.2 模块图 297
12.8.3 功能描述 297
12.8.4 寄存器描述 298
12.8.5 AT91SAM9G45芯片EMAC控制器驱动分析 301
12.9 小结 308
第13章 MiniGUI 309
13.1 MiniGUI概述 310
13.1.1 MiniGUI简介 310
13.1.2 MiniGUI特点 310
13.1.3 MiniGUI应用 311
13.2 MiniGUI安装与配置 312
13.2.1 安装GUI相关程序 312
13.2.2 配置MiniGUI环境 313
13.3 MiniGUI的使用 315
13.3.1 编译应用程序 315
13.3.2 交叉编译 315
13.4 MiniGUI的编程 316
13.4.1 编程环境介绍 317
13.4.2 MiniGUI框架介绍 317
13.4.3 基础编程 320
13.4.4 对话框和控件编程 327
13.4.5 图形编程 336
13.5 小结 341
第14章 Android嵌入式系统及应用开发 342
14.1 Android概述 342
14.1.1 简介 343
14.1.2 Android系统架构 344
14.1.3 Android应用扩展 345
14.2 Android开发环境搭建 346
14.2.1 Android开发环境介绍 346
14.2.2 环境搭建步骤 346
14.2.3 Android SDK介绍 347
14.3 Android应用开发 349
14.3.1 创建Android工程 349
14.3.2 Hello World!例程 352
14.4 Android应用开发扩展 353
14.4.1 基础UI设计 353
14.4.2 扩展性设计 357
14.5 小结 358
下篇 实验部分 361
第1章 实验基础 361
第2章 开发环境建立 376
第3章 内核和模块构建 390
第4章 文件系统构建 402
第5章 调试技术演练 408
第6章 字符设备驱动程序设计 419
第7章 块设备驱动程序设计 438
第8章 网络设备驱动程序设计 449
第9章 MiniGUI实验设计 462
第10章 Android实验设计 474