第一章 嵌入式系统概述 1
1.1 嵌入式系统的定义 1
1.2 嵌入式处理器简介 2
1.2.1 MIPS 2
1.2.2 Power PC 3
1.2.3 ARM 3
1.2.4 DSP系列 3
1.2.5 SoPC 3
1.3 嵌入式操作系统简介 4
1.3.1 Windows CE 4
1.3.2 VxWorks 4
1.3.3 uC/OS 5
1.3.4 Linux 6
1.4 本书所使用的软硬件环境 7
1.4.1 实验环境 7
1.4.2 下载文件内容 9
1.5 实验:安装Linux操作系统 10
第二章 Linux作为开发平台 18
2.1 Linux操作系统入门 18
2.1.1 文件操作命令 19
2.1.2 man命令 24
2.1.3 vi命令 25
2.1.4 bash相关命令与技巧 26
2.1.5 进程和作业管理 31
2.1.6 系统管理类命令 33
2.1.7 其他命令 34
2.2 GCC及GNU工具简介 40
2.2.1 gcc用法简介 40
2.2.2 binutils简介 42
2.2.3 GNU工具应用示例 44
2.3 Makefile简介 46
2.3.1 Makefile基本语法 46
2.3.2 Makefile中变量的用法 49
2.3.3 Makefile中的函数 50
2.4 交叉编译原理 52
2.4.1 交叉工具链的生成 52
2.4.2 自动生成工具链 57
2.5 boot loader简介 59
2.5.1 RedBoot简介 60
2.5.2 U-Boot简介 63
2.6 实验:开发环境建立 68
第三章 ARM体系结构与指令系统 82
3.1 ARM处理器概述 82
3.2 ARM指令集结构 83
3.2.1 指令集设计 83
3.2.2 RISC体系结构 86
3.2.3 ARM指令集结构 87
3.3 ARM流水线组织 88
3.3.1 流水线技术 88
3.3.2 ARM架构的流水线设计 89
3.4 ARM存储器结构 91
3.4.1 存储器层次 91
3.4.2 Cache 92
3.4.3 存储器管理 96
3.5 ARM寄存器组织 99
3.5.1 ARM处理器模式 99
3.5.2 ARM状态下的寄存器 100
3.5.3 Thumb状态下的寄存器 104
3.5.4 协处理器寄存器 106
3.6 ARM I/O结构 107
3.6.1 AMBA总线 108
3.6.2 存储器和存储器映像I/O 108
3.6.3 中断和直接存储器存取 110
3.7 ARM体系结构版本及命名方法 111
3.7.1 ARM体系结构版本 111
3.7.2 ARM体系的变种 113
3.7.3 ARM/Thumb体系结构版本的命名格式 114
3.8 ARM处理器核 115
3.8.1 ARM7系列 116
3.8.2 ARM9系列 116
3.8.3 ARM10系列 118
3.8.4 Intel XScale 119
3.9 ARM指令系统 120
3.9.1 ARM指令概述 120
3.9.2 ARM数据处理指令 121
3.9.3 ARM Load/Store存储器访问指令 126
3.9.4 ARM转移指令 132
3.9.5 ARM协处理器指令 133
3.9.6 ARM信号处理指令 135
3.9.7 ARM异常及中断指令 136
3.9.8 Thumb指令简介 139
3.10 ARM汇编语言程序设计 139
3.10.1 ARM汇编中的语句格式 140
3.10.2 ARM汇编中的指示符 140
3.10.3 ARM汇编中的伪指令 142
3.10.4 ARM汇编语言程序格式 144
3.11 实验:ARM汇编语言程序设计 144
第四章 处理器与开发板 149
4.1 AT91SAM9261芯片概述 149
4.2 处理器内存布局 151
4.3 AT91SAM9261内部启动逻辑 153
4.4 AT91SAM9261的集成外设 154
4.4.1 时钟发生器 155
4.4.2 高级中断控制器 158
4.4.3 通用IO管脚 160
4.4.4 通用串行口 163
4.4.5 SPI总线 166
4.4.6 I2C总线 169
4.5 嵌入式开发板 172
4.5.1 可编程模块 173
4.5.2 触摸屏控制器 175
4.5.3 TFT LCD接口 177
4.6 实验:控制片上外设 179
第五章 嵌入式Linux基本原理 181
5.1 操作系统概述 181
5.1.1 操作系统的分类 181
5.1.2 嵌入式操作系统的特点 182
5.1.3 操作系统的基本概念 183
5.1.4 嵌入式操作系统的其他关注点 184
5.2 操作系统基本功能模块 185
5.2.1 内存管理 185
5.2.2 进程管理 190
5.2.3 设备管理 198
5.3 编译Linux内核 203
5.3.1 Linux内核代码结构 203
5.3.2 内核编译步骤 205
5.3.3 Linux内核启动流程 209
5.4 Linux文件组织结构简介 211
5.4.1 Linux文件目录 211
5.4.2 Linux文件系统的建立 213
5.5 实验:构造嵌入式Linux环境 218
第六章 Linux环境程序设计 223
6.1 shell脚本编程 223
6.1.1 脚本编程简介 223
6.1.2 shell脚本介绍 224
6.2 Linux环境程序基础 230
6.2.1 文件处理 230
6.2.2 进程相关 235
6.2.3 信号 239
6.3 Linux下的串口编程 241
6.4 Linux下的网络编程 243
6.4.1 网络通信基本原理 244
6.4.2 socket编程与相关数据结构 245
6.4.3 TCP网络通信程序的流程 248
6.4.4 同时操作多个文件描述符 254
6.4.5 UDP编程 258
6.5 程序调试原理 262
6.5.1 程序的加载和运行 262
6.5.2 设置程序的断点和单步调试 264
6.5.3 其他常用的命令 265
6.5.4 远程调试 265
6.6 软件版本控制 266
6.6.1 Git简介 267
6.6.2 Git分支 271
6.7 实验:Linux平台C编程 273
第七章 Linux模块化驱动程序原理 276
7.1 Linux驱动编写基础 276
7.1.1 最简单的Linux驱动示例 277
7.1.2 printk函数简介 281
7.2 内核的编译系统 283
7.2.1 内核的Makefile 283
7.2.2 Kconfig文件 284
7.3 字符设备驱动的编写 285
7.3.1 字符设备的注册与注销 286
7.3.2 重要的数据结构 288
7.3.3 内核数据和用户数据的交换 290
7.3.4 ioctl接口 291
7.3.5 内存资源的访问 293
7.3.6 互斥与信号量 295
7.3.7 阻塞I/O的处理 299
7.3.8 硬件中断的处理 301
7.3.9 计时与延时 304
7.3.10 其他一些常用技术 306
7.3.11 关键的内核头文件 307
7.4 Linux设备驱动模型 308
7.5 实验:Linux驱动程序设计 311
第八章 嵌入式Linux图形编程 316
8.1 常见的图形编程工具 316
8.2 Qt编程入门 318
8.2.1 信号与槽 318
8.2.2 Qt版本的Hello World 321
8.2.3 QWidget简介 323
8.2.4 使用Qt的图形部件 324
8.2.5 自定义Widget 327
8.2.6 qmake的更多用法 329
8.3 Qt编程的可视化辅助设计工具 331
8.3.1 Qt Designer简介 331
8.3.2 ui文件的使用方法 333
8.4 完全面向Qt编程 337
8.4.1 简单数据类型 338
8.4.2 文件输入/输出 340
8.4.3 网络编程 341
8.5 发布Qt程序 343
8.5.1 Qt程序的国际化 343
8.5.2 将数据嵌入程序 346
8.6 Qt的嵌入式应用 347
8.6.1 交叉编译Qt 347
8.6.2 配置嵌入式Qt环境 348
8.7 实验:嵌入式图形程序设计 349
附录A 使用QEMU完成实验 351
A.1 QEMU简介 351
A.2 flash操作的仿真 352
A.3 使用网络文件系统 355
A.4 使用QEMU的虚拟硬件 357
附录B 使用OpenEmbedded构建文件系统 360
B.1 OpenEmbedded简介 360
B.2 配置和使用OpenEmbedded 361
参考文献 363