第1篇 ARM微处理器讲解 1
第1章 走进嵌入式系统世界 1
1.1 认识嵌入式系统 1
1.1.1 嵌入式硬件系统的发展进程 2
1.1.2 嵌入式系统的发展趋势 3
1.1.3 嵌入式系统的主要特征 4
1.2 嵌入式处理器的简单概述 6
1.2.1 嵌入式微处理器简介 6
1.2.2 嵌入式微控制器简介 7
1.2.3 数字信号处理器(DSP)简介 7
1.2.4 嵌入式片上系统(SoC)简介 8
1.3 嵌入式软件系统的简单概述 9
1.3.1 嵌入式软件系统简介 9
1.3.2 嵌入式软件开发简介 10
1.4 嵌入式目标平台的介绍 11
1.4.1 嵌入式硬件平台简介 11
1.4.2 如何构建嵌入式系统开发平台 12
1.4.3 如何向嵌入式硬件平台上烧写映像 14
1.5 本章小结 17
第2章 ARM体系微处理器的基本概念 18
2.1 ARM体系微处理器简介 18
2.2 ARM体系微处理器的类型 18
2.3 实际项目中对ARM微处理器的选择 21
2.3.1 ARM微处理器应用方案的成熟度考虑 21
2.3.2 ARM内核的选择 21
2.3.3 ARM微处理器的性能考虑 22
2.3.4 ARM微处理器的片内资源考虑 22
2.4 ARM微处理器的工作体系 22
2.4.1 工作模式介绍 23
2.4.2 寄存器体系 23
2.4.3 指令体系 24
2.5 ARM微处理器的基础架构介绍 24
2.5.1 计算机体系结构的介绍 25
2.5.2 ARM微处理器的技术特征 26
2.6 本章小结 29
第3章 S3C2410的内部结构及外围电路 30
3.1 S3C2410整体资源简介 30
3.1.1 性能介绍 30
3.1.2 资源模块介绍 31
3.1.3 内部结构 31
3.1.4 五大体系结构 34
3.1.5 存储系统 34
3.2 S3C2410内部资源功能介绍 38
3.2.1 时钟与电源管理 38
3.2.2 中断控制器 41
3.2.3 LCD控制器 42
3.2.4 Nand Flash控制器 43
3.2.5 UART控制器 44
3.2.6 DMA控制器 44
3.2.7 TIMER控制器 44
3.2.8 I/O接口 45
3.2.9 RTC控制器 46
3.2.10 触摸控制器 46
3.2.11 IIC控制器 47
3.2.12 IIS控制器 47
3.2.13 看门狗定时器 47
3.2.14 USB控制器 47
3.2.15 SPI接口 48
3.2.16 SD接口 48
3.2.17 ADC控制器 49
3.3 S3C2410微处理器的外围电路设计 49
3.3.1 时钟电路 50
3.3.2 复位电路 50
3.3.3 启动电路 51
3.3.4 电源电路 51
3.3.5 Flash电路 52
3.3.6 SDRAM电路 54
3.3.7 UART电路 57
3.3.8 IrDA电路 58
3.3.9 USB电路 58
3.3.10 以太网电路 59
3.3.11 音频电路 61
3.3.12 SD/MMC电路 62
3.3.13 LCD电路 62
3.4 本章小结 63
第4章 ARM微处理器的寻址方式及指令集 64
4.1 ARM指令集概述及寻址方式 64
4.1.1 指令结构简介 64
4.1.2 指令分类 65
4.1.3 指令格式与条件域 66
4.1.4 寻址方式 67
4.2 ARM微处理器的指令集 73
4.2.1 跳转指令 73
4.2.2 数据处理指令 74
4.2.3 乘法指令与乘加指令 79
4.2.4 程序状态寄存器访问指令 81
4.2.5 加载/存储指令 82
4.2.6 批量数据加载/存储指令 84
4.2.7 数据交换指令 85
4.2.8 移位指令 86
4.2.9 协处理器指令 87
4.2.1 0异常产生指令 89
4.3 本章小结 90
第5章 ADS集成开发环境的应用基础 91
5.1 ADS1.2 集成开发环境简介 91
5.1.1 ADS软件中的ARM运行时库 92
5.1.2 CodeWarrior集成开发环境介绍 93
5.1.3 ADS集成开发软件的调试器介绍 94
5.1.4 ADS集成开发环境中的实用工具 94
5.2 ADS软件的命令行下的开发方式 95
5.2.1 ADS软件中的命令行工具介绍 95
5.2.2 编译器与链接器的使用 97
5.3 ADS软件的图形界面下的开发方式 100
5.3.1 如何创建ADS工程 100
5.3.2 工程源代码的编写实现 104
5.3.3 对工程进行编译和链接操作 106
5.4 使用AXD调试工具进行代码调试 110
5.4.1 AXD软件加载可执行文件 110
5.4.2 AXD软件中运行映像文件 110
5.4.3 代码调试时添加断点 110
5.4.4 代码调试时的存储器操作 111
5.4.5 代码调试时的寄存器操作 111
5.4.6 代码调试时的变量操作 112
5.5 本章小结 112
第6章 基于ADS平台的实验开发 113
6.1 汇编之LED灯实验 113
6.2 Hello World之串口实验 115
6.2.1 S3C2410的UART介绍 115
6.2.2 UART的数据发送操作 115
6.2.3 UART的数据接收操作 115
6.2.4 UART的波特率发生器 116
6.2.5 UART与PC通信编程实现 116
6.3 外部中断编程操作 118
6.3.1 中断响应过程和返回过程 118
6.3.2 外部中断编程实现 118
6.4 看门狗测试代码的编写 120
6.4.1 看门狗的工作原理 120
6.4.2 S3C2410微处理器的看门狗 121
6.4.3 S3C2410微处理器的看门狗编程实现 121
6.5 利用定时器产生PWM编程实验 123
6.6 S3C2410微处理器的启动代码实验 124
6.7 S3C2410微处理器的RTC编程实验 134
6.7.1 RTC的简单介绍 134
6.7.2 RTC的相关功能 134
6.7.3 RTC编程实现 135
6.8 S3C2410微处理器的IIC总线实验 136
6.8.1 IIC总线实现原理 137
6.8.2 IIC总线编程实现 137
6.9 Nor Flash驱动编程实现 140
6.9.1 SST39VF160的操作原理 141
6.9.2 SST39VF160编程实现 143
6.10 Nand Flash驱动编程实现 145
6.10.1 K9F1208UU0M的指令 145
6.10.2 K9F1208UU0M的工作原理 145
6.10.3 Nand Flash编程实现 146
6.11 本章小结 149
第2篇 嵌入式Linux系统讲解 150
第7章 嵌入式操作系统的整体介绍 150
7.1 嵌入式操作系统简介 150
7.1.1 嵌入式操作系统的发展阶段 150
7.1.2 嵌入式操作系统的优势 151
7.1.3 嵌入式操作系统的分类 151
7.2 常见的嵌入式操作系统 152
7.2.1 VxWorks嵌入式操作系统 152
7.2.2 pSOS嵌入式操作系统 153
7.2.3 Palm OS嵌入式操作系统 153
7.2.4 QNX嵌入式操作系统 154
7.2.5 Windows CE嵌入式操作系统 154
7.2.6 uC/OS-Ⅱ嵌入式操作系统 155
7.2.7 Linux嵌入式操作系统 155
7.3 嵌入式操作系统的结构 157
7.4 嵌入式操作系统的功能 158
7.4.1 进程管理功能 158
7.4.2 内存管理功能 160
7.4.3 文件管理功能 162
7.4.4 设备管理功能 163
7.5 本章小结 164
第8章 走进Linux操作系统 165
8.1 Ubuntu操作系统的安装 165
8.1.1 Ubuntu系统的简介 165
8.1.2 虚拟机向导的配置 165
8.1.3 Ubuntu系统的安装 169
8.2 Ubuntu操作系统的相关操作命令 172
8.2.1 Ubuntu系统的root用户 172
8.2.2 Ubuntu系统的常用命令 173
8.3 本章小结 203
第9章 在Linux系统中构建交叉开发环境 204
9.1 交叉开发环境简介 204
9.1.1 交叉开发环境模型 204
9.1.2 上位机与下位机的连接方式 205
9.2 交叉开发环境的搭建 207
9.2.1 Linux系统的网络配置 207
9.2.2 关于apt-get工具软件的介绍 209
9.2.3 Minicom的安装与配置 209
9.2.4 FTP服务的安装、配置与启动 213
9.2.5 SSH服务的安装、配置与启动 213
9.2.6 NFS服务的安装、配置与启动 214
9.2.7 交叉工具链的安装与配置 215
9.3 Windows系统的实用软件介绍 220
9.3.1 远程登录Linux系统工具SecureCRT 220
9.3.2 Windows与Linux之间的文件传输软件CuteFTP 222
9.3.3 Windows系统的代码阅读/编辑工具SI 223
9.3.4 Windows系统的TFTP服务器软件TFTP32 226
9.3.5 Windows系统的DNW软件 226
9.4 Linux系统的实用软件介绍 228
9.4.1 VI编辑器 228
9.4.2 gedit编辑器 230
9.4.3 Eclipse软件的安装 230
9.4.4 Eclipse CDT开发C程序 232
9.5 本章小结 234
第10章 Linux系统的裸机程序开发 235
10.1 Linux系统的裸机程序开发简介 235
10.1.1 代码的编译方式 235
10.1.2 make工程管理器简介 235
10.2 Linux系统的编译器 236
10.2.1 gcc与arm-linux-gcc简介 236
10.2.2 gcc工具的实例操作 237
10.2.3 gcc工具的编译细节分析 240
10.2.4 arm-linux-gcc及相关工具的应用 241
10.3 Makefile工程文件的应用 246
10.3.1 Makefile文件的简单介绍 246
10.3.2 如何编写Makefile文件 247
10.3.3 如何执行Makefile文件 250
10.4 Linux系统的裸机程序开发示例 251
10.5 本章小结 257
第11章 Bootloader的移植 258
11.1 Bootloader的简单介绍 258
11.1.1 Bootloader的认识 258
11.1.2 Bootloader的通信方式 259
11.1.3 Bootloader的结构介绍 259
11.1.4 常见的Bootloader 267
11.2 利用Vivi进行Linux引导 267
11.2.1 Vivi的结构介绍 268
11.2.2 Vivi的工作流程 269
11.2.3 Vivi的移植操作 280
11.2.4 Vivi的常用操作命令 284
11.3 U-Boot源代码分析与移植操作 286
11.3.1 U-Boot的特性介绍 286
11.3.2 U-Boot的源代码结构分析 287
11.3.3 U-Boot的启动过程 288
11.3.4 U-Boot的移植 295
11.3.5 U-Boot的编译操作 308
11.3.6 U-Boot的命令操作 312
11.4 本章小结 315
第12章 Linux内核的裁剪与移植 316
12.1 Linux内核的版本号与内核结构 316
12.1.1 Linux内核的版本号 316
12.1.2 Linux内核结构 317
12.2 Linux2.6 内核的特点 318
12.3 Linux2.6 内核的源代码结构 318
12.3.1 Linux源代码的准备工作 319
12.3.2 Linux源代码结构的分析 319
12.3.3 Linux源代码中的Makefile文件 320
12.4 Linux2.6 内核的移植 328
12.4.1 Linux内核的启动过程 329
12.4.2 Linux内核启动代码的分析 330
12.4.3 Linux内核源代码的修改 342
12.4.4 Linux内核的配置 346
12.4.5 Linux内核的编译、烧写与启动 357
12.5 YAFFS文件系统的移植 358
12.6 本章小结 361
第13章 Linux内核调试技术的实现 362
13.1 内核态下的打印函数printk() 362
13.1.1 printk()函数的简介及使用方法 362
13.1.2 printk()函数的源代码分析 364
13.1.3 控制台的相关源代码分析 367
13.1.4 命令行参数 368
13.2 利用printk()打印信息调试内核 369
13.3 利用Linux的/proc文件系统调试内核 371
13.4 利用Oops消息调试内核 375
13.4.1 Oops消息的内容 375
13.4.2 栈回溯信息的直观显示 376
13.4.3 对Linux内核进行调试 377
13.4.4 Oops消息中的栈信息分析 380
13.5 利用KGDB远程调试内核 382
13.5.1 KGDB的介绍 382
13.5.2 向内核中增加KGDB调试器 384
13.5.3 在开发机上利用DDD与GDB调试内核 388
13.6 本章小结 391
第14章 Linux系统的文件系统 392
14.1 Nand/NorFlash存储设备 392
14.1.1 Nand Flash存储设备 392
14.1.2 Nor Flash存储设备 394
14.1.3 Nand Flash和NorFlash的区别 394
14.1.4 MTD技术简介 395
14.2 Linux系统的文件系统概述及分类 395
14.2.1 文件系统概述 396
14.2.2 文件系统分类 396
14.3 Linux系统的根文件系统 406
14.3.1 根文件系统的目录结构概述 406
14.3.2 文件属性分析 411
14.4 Busybox的移植操作 413
14.4.1 Busybox的简单概述 413
14.4.2 内核和Busybox的init进程 413
14.4.3 Busybox的配置 417
14.4.4 Busybox的编译与安装 422
14.5 构建Linux系统的根文件系统 422
14.5.1 glibc库文件的安装 423
14.5.2 完善根文件系统的构建 423
14.5.3 根文件系统其他目录的构建 426
14.5.4 YAFFS文件系统的制作 426
14.5.5 JFFS2文件系统的制作 430
14.6 本章小结 431
第15章 Linux系统的系统管理 432
15.1 存储系统管理 432
15.1.1 进程的虚拟内存空间 432
15.1.2 虚拟内存空间的映射与地址转换实现 434
15.1.3 虚拟内存空间的管理方式与Zone区域 435
15.1.4 分配/回收内存页面与slab分配器 438
15.1.5 申请/释放虚拟内存 438
15.2 中断与系统调用 439
15.2.1 中断与系统调用概述 440
15.2.2 tasklet机制的介绍 441
15.2.3 系统调用机制的实现 447
15.2.4 fork()系统调用介绍 449
15.3 文件系统管理 451
15.3.1 文件与目录简单概述 452
15.3.2 虚拟文件系统 453
15.3.3 VFS的4个主要数据结构 454
15.4 设备管理 463
15.4.1 设备与设备的管理功能 463
15.4.2 I/O设备管理 464
15.5 本章小结 470
第16章 Linux系统的Shell编程实现 471
16.1 Linux系统的Shell编程规则简介 471
16.2 Linux系统的Shell编程 472
16.2.1 Shell程序中的变量赋值和引用 472
16.2.2 Shell程序中的键盘输入实现 474
16.2.3 使用VI编辑器编写Shell脚本 476
16.2.4 如何修改脚本文件的访问权限 477
16.2.5 Shell脚本程序的执行方式 477
16.3 Shell脚本程序中的参数及函数 478
16.3.1 位置参数 478
16.3.2 内部参数 479
16.3.3 特殊符号 480
16.3.4 帮助命令 481
16.4 Shell脚本程序中的表达式 482
16.4.1 字符串操作符 483
16.4.2 数字的比较 484
16.4.3 逻辑操作符 484
16.4.4 文件操作符 485
16.5 Shell脚本程序中的循环结构 486
16.5.1 for循环语句的使用 486
16.5.2 while循环语句的使用 487
16.5.3 until循环语句的使用 488
16.6 Shell脚本程序中的条件结构 488
16.6.1 if条件语句的使用 488
16.6.2 case条件语句的使用 489
16.7 Shell程序中函数与脚本的调用 490
16.7.1 函数的编写与调用 490
16.7.2 脚本的调用 491
16.8 本章小结 491
第3篇 Linux系统实验 492
第17章 Linux系统的设备驱动开发基础 492
17.1 Linux系统的驱动程序概述 492
17.1.1 驱动程序的调用关系 492
17.1.2 驱动程序的分类及作用 493
17.1.3 硬件设备的识别与驱动代码的开发流程 494
17.1.4 硬件设备的控制方式 495
17.2 Linux系统的硬件设备驱动开发流程及示例 495
17.2.1 构建一个简单的驱动代码模块 495
17.2.2 虚拟字符设备驱动的测试 498
17.2.3 LED驱动开发 504
17.3 Linux系统的硬件设备驱动开发相关技术 510
17.3.1 并发控制原理 510
17.3.2 并发控制的相关函数 510
17.3.3 并发控制示例 513
17.3.4 设备驱动程序中的阻塞与非阻塞 516
17.3.5 设备驱动程序中的poll函数应用 520
17.3.6 设备驱动程序中的中断处理应用 522
17.3.7 设备驱动程序中关于内存与I/O操作的应用 524
17.4 Linux系统的块设备的驱动程序编写 529
17.4.1 块设备的I/O操作 529
17.4.2 与块设备相关的结构体及函数 530
17.4.3 块设备驱动代码编写的相关技术 535
17.5 本章小结 541
第18章 Linux系统的硬件设备驱动编写实验 542
18.1 按键设备的驱动开发 542
18.2 虚拟块设备的驱动开发 550
18.3 网口设备的驱动开发 560
18.4 LCD设备的驱动开发 565
18.5 SD卡设备的驱动开发 568
18.6 USB设备的驱动开发 570
18.7 本章小结 572