图书目录

第1篇  基础知识

第1章  嵌入式系统入门 2

1.1  什么是嵌入式系统 2

1.2  嵌入式系统的应用领域 2

1.2.1  家用电器和电子类产品 2

1.2.2  交通工具 3

1.2.3  公共电子设施 3

1.3  嵌入式系统的发展 4

1.3.1  嵌入式微控制器 4

1.3.2  嵌入式微处理器 5

1.3.3  嵌入式系统的发展方向 5

1.4  典型嵌入式系统的组成 6

1.5  小结 6

1.6  习题 7

第2章  嵌入式软硬件系统 8

2.1  电路基础知识 8

2.1.1  什么是模拟电路 8

2.1.2  什么是数字电路 8

2.1.3  数制转换 9

2.2  计算机基础知识 10

2.2.1  计算机体系结构的发展 10

2.2.2  中央处理器 10

2.2.3  存储系统 11

2.2.4  总线系统 11

2.2.5  输入与输出系统 12

2.3  软件基础知识 12

2.3.1  什么是软件 12

2.3.2  软件的开发流程 13

2.3.3  常见的软件开发模型 13

2.3.4  计算机编程语言 14

2.3.5  数据结构 15

2.4  操作系统基础知识 15

2.4.1  什么是操作系统 15

2.4.2  操作系统的发展历史 15

2.4.3  操作系统的组成 16

2.4.4  几种操作系统的设计思路 16

2.4.5  操作系统的分类 17

2.5  小结 17

2.6  习题 17

第3章  ARM处理器 19

3.1  微处理器和微控制器 19

3.2  ARM处理器简介 19

3.2.1  ARM微处理器的应用领域 20

3.2.2  ARM处理器的优点 20

3.3  ARM指令集 21

3.3.1  算术运算指令 21

3.3.2  逻辑运算指令 22

3.3.3  分支指令 23

3.3.4  数据传送指令 23

3.4  ARM体系结构 24

3.4.1  ARM体系结构的命名方法 24

3.4.2  处理器的划分 25

3.4.3  处理器的工作模式 25

3.4.4  存储系统 26

3.4.5  寻址方式 27

3.5  ARM的功能选型 29

3.5.1  ARM的选型原则 29

3.5.2  几种常见的ARM核处理器选型参考 31

3.6  小结 32

3.7  习题 33

第4章  嵌入式Linux 34

4.1  常见的嵌入式操作系统 34

4.1.1  VxWorks简介 34

4.1.2  Windows CE简介 35

4.1.3  PalmOS简介 35

4.1.4  Android简介 35

4.2  嵌入式Linux操作系统 36

4.2.1  什么是Linux 36

4.2.2  Linux与UNIX的不同——GPL版权协议简介 36

4.2.3  Linux发行版 37

4.2.4  常见的嵌入式Linux系统 38

4.3  小结 38

4.4  习题 39

第5章  软件开发环境搭建 40

5.1  安装Linux系统 40

5.1.1  安装Ubuntu Linux 40

5.1.2  安装和卸载软件 43

5.1.3  配置系统服务 43

5.1.4  安装主要的开发工具 44

5.1.5  安装其他开发工具 45

5.2  运行在Windows上的Linux系统 45

5.2.1  什么是Cygwin 45

5.2.2  安装Cygwin 46

5.2.3  安装开发环境 49

5.3  Linux的常用工具 49

5.3.1  Linux Shell及其常用命令 50

5.3.2  文本编辑工具vi 51

5.3.3  搜索工具find和grep 52

5.3.4  FTP工具 56

5.3.5  串口工具minicom 57

5.4  Windows的常用工具 58

5.4.1  代码编辑管理工具Source Insight 59

5.4.2  串口工具Xshell 64

5.5  ARM的集成开发环境ADS 66

5.5.1  ADS集成开发环境简介 66

5.5.2  配置ADS调试环境 67

5.5.3  建立自己的工程 68

5.6  小结 70

5.7  习题 70

第6章  第一个Linux应用程序 71

6.1  向世界问好——Hello,World!  71

6.1.1  用vi编辑源代码文件 71

6.1.2  用gcc命令编译程序 72

6.1.3  执行程序 72

6.2  程序背后做了什么 73

6.2.1  程序执行的过程 73

6.2.2  窥视程序执行中的秘密 73

6.2.3  动态库的作用 75

6.3  程序如何来的——编译的全过程 75

6.3.1  编译源代码 76

6.3.2  链接目标文件到指定的库 77

6.4  更简单的办法——用Makefile管理工程 77

6.4.1  什么是Makefile 77

6.4.2  Makefile是如何工作的 78

6.4.3  如何使用Makefile 78

6.4.4  好的源代码管理习惯 79

6.5  小结 79

6.6  习题 79

第2篇  应用开发

第7章  Linux应用程序开发基础 82

7.1  内存管理和使用 82

7.1.1  堆和栈的区别 82

7.1.2  内存管理函数malloc()和free() 84

7.1.3  实用的内存分配函数calloc()和realloc() 85

7.1.4  内存管理编程实例 86

7.2  ANSI C文件管理 89

7.2.1  文件指针和流 89

7.2.2  存储方式 90

7.2.3  标准输入、标准输出和标准错误 90

7.2.4  缓冲 90

7.2.5  打开和关闭文件 91

7.2.6  读写文件 92

7.2.7  文件流定位 94

7.2.8  ANSI C文件编程实例 95

7.3  POSIX文件I/O编程 96

7.3.1  底层的文件I/O操作 96

7.3.2  文件描述符 96

7.3.3  创建、打开和关闭文件 97

7.3.4  读写文件内容 100

7.3.5  文件内容定位 101

7.3.6  修改已打开文件的属性 102

7.3.7  POSIX文件编程实例 102

7.4  小结 103

7.5  习题 104

第8章  多进程和多线程开发 105

8.1  多进程开发 105

8.1.1  什么是进程 105

8.1.2  进程环境和属性 106

8.1.3  创建进程 107

8.1.4  等待进程结束 109

8.1.5  退出进程 110

8.1.6  常用进程间的通信方法 112

8.1.7  进程编程实例 116

8.2  多线程开发 117

8.2.1  线程的概念 117

8.2.2  进程和线程对比 117

8.2.3  创建线程 118

8.2.4  取消线程 119

8.2.5  等待线程 120

8.2.6  使用pthread库实现多线程操作实例 121

8.3  小结 122

8.4  习题 122

第9章  网络通信应用 124

9.1  网络通信基础 124

9.1.1  TCP/IP簇 124

9.1.2  IP简介 125

9.1.3  TCP简介 126

9.1.4  UDP简介 127

9.1.5  网络协议分析工具Wireshark 127

9.2  Socket通信的基本概念 128

9.2.1  创建Socket对象 128

9.2.2  面向连接的Socket通信 129

9.2.3  面向连接的echo服务编程实例 131

9.2.4  无连接的Socket通信 135

9.2.5  无连接的时间服务编程实例 136

9.3  Socket高级应用 139

9.3.1  Socket超时处理 139

9.3.2  使用Select机制处理多连接 140

9.3.3  使用poll机制处理多连接 141

9.3.4  多线程环境Socket编程 143

9.4  小结 143

9.5  习题 144

第10章  串口通信编程 145

10.1  串口简介 145

10.1.1  什么是串口 145

10.1.2  串口的工作原理 145

10.1.3  串口的流量控制 146

10.2  开发串口应用程序 147

10.2.1  操作串口需要用到的头文件 147

10.2.2  串口操作方法 148

10.2.3  串口属性设置 148

10.2.4  与Windows串口终端通信 152

10.3  串口应用案例——发送手机短信 154

10.3.1  PC与手机连接发送短信的物理结构 154

10.3.2  AT指令简介 155

10.3.3  GSM AT指令集 155

10.3.4  PDU编码方式 156

10.3.5  建立与手机的连接 157

10.3.6  使用AT指令发送短信 158

10.4  小结 161

10.5  习题 161

第11章  嵌入式GUI程序开发 163

11.1  Linux GUI简介 163

11.1.1  Linux GUI的发展 163

11.1.2  常见的嵌入式GUI 164

11.2  开发图形界面程序 165

11.2.1  安装Qt开发环境 165

11.2.2  建立简单的Qt程序 167

11.2.3  Qt库编程结构 170

11.3  深入Qt编程 170

11.3.1  使用Widget 170

11.3.2  对话框程序设计 172

11.3.3  信号与槽系统 176

11.4  将Qt移植到ARM开发板上 177

11.4.1  tslib的移植 177

11.4.2  Qt的移植 178

11.4.3  安装Qt Creator编译环境 179

11.4.4  设置Qt Creator编译环境 184

11.4.5  配置开发板的环境变量 187

11.5  模拟器QEMU 188

11.5.1  使用QEMU搭建ARM嵌入式Linux开发环境 188

11.5.2  使用Qt程序进行测试 191

11.6  小结 191

11.7  习题 191

第12章  软件项目管理 193

12.1  源代码管理 193

12.1.1  软件的版本 193

12.1.2  版本控制的概念 194

12.2  版本控制系统Git 195

12.2.1  在Linux系统中使用Git 195

12.2.2  在Windows系统中使用Git 198

12.3  常见的开发文档 202

12.3.1  可行性研究报告 202

12.3.2  项目开发计划 202

12.3.3  软件需求说明书 202

12.3.4  概要设计 203

12.3.5  详细设计 203

12.3.6  用户手册 203

12.3.7  其他文档 203

12.4  文档维护工具 203

12.4.1  Sphinx工具 203

12.4.2  GitHub工具 206

12.5  Bug跟踪系统 210

12.5.1  Bug管理的概念和作用 210

12.5.2  使用Bugzilla跟踪Bug 211

12.6  小结 214

12.7  习题 214

第3篇  系统分析

第13章  ARM体系结构及开发实例 216

13.1  ARM体系结构 216

13.1.1  ARM体系结构简介 216

13.1.2  ARM指令集简介 217

13.2  编程模型 218

13.2.1  数据类型 218

13.2.2  处理器模式 218

13.2.3  寄存器 219

13.2.4  通用寄存器 219

13.2.5  程序状态寄存器 221

13.2.6  异常处理 221

13.2.7  内存及其I/O映射 222

13.3  内存管理单元 223

13.3.1  内存管理简介 223

13.3.2  内存访问顺序 224

13.3.3  地址翻译过程 224

13.3.4  内存访问权限 225

13.4  常见的接口和控制器 225

13.4.1  GPIO简介 225

13.4.2  中断控制器 226

13.4.3  RTC控制器 226

13.4.4  看门狗定时器 227

13.4.5  使用GPIO点亮LED实例 227

13.5  小结 228

13.6  习题 228

第14章  深入Bootloader 230

14.1  初识Bootloader 230

14.1.1  PC的Bootloader 230

14.1.2  什么是嵌入式系统的Bootloader 231

14.1.3  嵌入式系统常见的Bootloader 231

14.2  U-Boot分析 232

14.2.1  获取U-Boot 232

14.2.2  U-Boot工程结构分析 232

14.2.3  U-Boot的工作流程 233

14.3  U-Boot的启动流程分析 234

14.3.1  _start标号 234

14.3.2  reset标号 237

14.3.3  cpu_init_crit标号 238

14.3.4  lowlevel_init标号 239

14.3.5  main标号 240

14.3.6  board_init_f()函数 243

14.3.7  relocate_code()函数 243

14.3.8  board_init_r()函数 245

14.3.9  main_loop()函数 245

14.4  U-Boot移植 246

14.4.1  U-Boot移植的一般步骤 246

14.4.2  将U-Boot移植到目标开发板上 247

14.4.3  U-Boot移植的常见问题 249

14.5  小结 249

14.6  习题 249

第15章  解析Linux内核 251

15.1  基础知识 251

15.1.1  什么是Linux内核 251

15.1.2  Linux内核的版本 252

15.1.3  如何获取Linux内核代码 252

15.1.4  编译内核 252

15.2  Linux内核的子系统 258

15.2.1  系统调用接口 259

15.2.2  进程管理子系统 260

15.2.3  内存管理子系统 261

15.2.4  虚拟文件系统 261

15.2.5  网络堆栈 262

15.2.6  设备驱动 263

15.2.7  内核体系结构代码分离设计解析 264

15.3  Linux内核代码的工程结构 264

15.3.1  源代码目录布局 264

15.3.2  几个重要的Linux内核文件 266

15.4  内核编译系统 267

15.4.1  内核编译系统的基本架构 267

15.4.2  内核的顶层Makefile文件分析 268

15.4.3  内核编译文件分析 270

15.4.4  目标文件清除机制 273

15.4.5  编译辅助程序 273

15.4.6  Kbuild变量 274

15.5  小结 275

15.6  习题 275

第16章  嵌入式Linux的启动流程 277

16.1  Linux内核的初始化流程 277

16.2  PC的初始化流程 278

16.2.1  PC BIOS的功能和作用 279

16.2.2  磁盘的数据结构 279

16.2.3  PC的完整初始化流程 280

16.3  嵌入式系统的初始化 280

16.4  Linux内核的初始化 282

16.4.1  解压缩内核映像 282

16.4.2  进入内核代码 284

16.5  启动init内核进程 287

16.6  根文件系统的初始化 288

16.6.1  根文件系统简介 288

16.6.2  挂载虚拟文件系统 290

16.7  内核交出权限 295

16.8  systemd进程 295

16.8.1  systemd的Unit 295

16.8.2  配置文件 295

16.8.3  常用命令 297

16.9  初始化RAM Disk 298

16.9.1  RAM Disk简介 298

16.9.2  如何使用RAM Disk 299

16.9.3  使用RAM Disk作为根文件系统实例 299

16.10  小结 300

16.11  习题 301

第17章  Linux文件系统 302

17.1  Linux文件管理 302

17.1.1  文件和目录的概念 302

17.1.2  文件的结构 303

17.1.3  文件的类型 303

17.1.4  文件系统的目录结构 305

17.1.5  文件和目录的存取权限 307

17.1.6  文件系统管理 308

17.2  Linux文件系统的原理 309

17.2.1  非日志文件系统 309

17.2.2  日志文件系统 310

17.3  常见的Linux文件系统 311

17.3.1  Ext2文件系统 311

17.3.2  Ext3文件系统 313

17.3.3  ReiserFS文件系统 314

17.3.4  JFFS文件系统 315

17.3.5  CRAMFS文件系统 317

17.4  其他文件系统 317

17.4.1  网络文件系统 317

17.4.2  /proc影子文件系统 319

17.5  小结 321

17.6  习题 322

第18章  交叉编译工具 323

18.1  什么是交叉编译 323

18.2  交叉编译产生的原因 324

18.3  安装交叉编译工具的条件 324

18.4  如何安装交叉编译工具 324

18.4.1  手动安装 324

18.4.2  使用apt工具安装 326

18.4.3  测试 326

18.5  小结 326

18.6  习题 327

第19章  强大的命令系统BusyBox 328

19.1  BusyBox简介 328

19.1.1  简单易懂的BusyBox 328

19.1.2  BusyBox的工作原理 329

19.1.3  安装BusyBox 330

19.2  交叉编译BusyBox 333

19.3  在目标板上安装BusyBox 335

19.4  小结 337

19.5  习题 337

第20章  Linux内核移植 338

20.1  Linux内核移植的要点 338

20.2  Linux内核的平台代码结构 339

20.3  实现交叉编译 340

20.3.1  加入编译菜单项 342

20.3.2  实现编译 343

20.4  小结 344

20.5  习题 344

第21章  内核和应用程序调试技术 345

21.1  使用gdb调试应用程序 345

21.2  基本的调试技术 345

21.2.1  列出源代码 348

21.2.2  断点管理 350

21.2.3  执行程序 352

21.2.4  显示程序变量 352

21.2.5  信号管理 353

21.2.6  调试实例 354

21.3  多进程调试 354

21.4  调试意外终止的程序 357

21.5  内核调试方法 359

21.5.1  printk打印调试信息 359

21.5.2  动态输出 360

21.5.3  BUG_ON()和WARN_ON()宏 360

21.5.4  使用/proc虚拟文件系统 363

21.6  小结 364

21.7  习题 364

第4篇  项目实战

第22章  Linux设备驱动开发基础知识 366

22.1  设备驱动简介 366

22.2  Linux内核模块简介 367

22.2.1  内核模块速览 367

22.2.2  内核模块的结构 367

22.2.3  内核模块的加载和卸载 368

22.2.4  编写一个基本的内核模块 369

22.2.5  编译内核模块 370

22.2.6  为内核模块添加参数 371

22.3  Linux设备驱动工作方式简介 372

22.3.1  PCI局部总线简介 372

22.3.2  Linux设备驱动的基本概念 373

22.3.3  字符设备 374

22.3.4  块设备 376

22.3.5  网络设备 377

22.4  字符设备驱动开发案例 377

22.4.1  开发一个基本的字符设备驱动 377

24.4.2  测试字符设备 380

22.5  小结 381

22.6  习题 381

第23章  网络设备驱动程序开发 382

23.1  网络基础知识 382

23.1.1  OSI网络参考模型 382

23.1.2  Linux系统内核与TCP/IP 383

23.2  以太网基础 385

23.2.1  工作原理 386

23.2.2  常见的以太网标准 386

23.2.3  拓扑结构 387

23.2.4  工作模式 387

23.3  网卡的工作原理 388

23.4  内核网络分层结构 389

23.4.1  内核网络结构 389

23.4.2  与网络有关的数据结构 390

23.4.3  内核网络部分的全局变量 391

23.5  内核网络设备驱动框架 392

23.5.1  net_device结构 392

23.5.2  数据包的接收流程 394

23.5.3  数据包的发送流程 395

23.6  DM9000网卡驱动分析案例 396

23.6.1  DM9000芯片简介 396

23.6.2  网卡驱动程序框架 396

23.6.3  DM9000网卡驱动的数据结构 397

23.6.4  加载驱动程序 398

23.6.5  停止和启动网卡 402

23.6.6  发送数据包 403

23.6.7  接收数据包 404

23.6.8  中断的处理 405

23.7  小结 406

23.8  习题 406

第24章  Flash设备驱动开发 407

24.1  Linux Flash驱动结构 407

24.1.1  什么是MTD 407

24.1.2  MTD系统结构 408

24.2  Flash设备基础 409

24.2.1  存储原理 409

24.2.2  性能比较 410

24.3  内核MTD层 411

24.3.1  mtd_info结构 411

24.3.2  mtd_part结构 415

24.3.3  mtd_partition结构 415

24.3.4  map_info结构 416

24.3.5  nand_chip结构 418

24.4  Flash设备框架 419

24.4.1  NOR Flash设备驱动框架 419

24.4.2  NAND Flash设备驱动框架 420

24.5  NAND Flash设备驱动分析案例 421

24.5.1  S3C2440 NAND控制器简介 421

24.5.2  数据结构 423

24.5.3  注册驱动 424

24.5.4  驱动卸载 427

24.5.5  初始化NAND控制器 427

24.5.6  设置芯片操作 429

24.5.7  电源管理 431

24.6  小结 432

24.7  习题 432

第25章  USB驱动开发 433

25.1  USB体系概述 433

25.1.1  USB的设计目标 433

25.1.2  USB体系简介 434

25.1.3  USB体系的工作流程 435

25.2  USB驱动程序框架 435

25.2.1  Linux内核USB驱动框架简介 435

25.2.2  主机驱动结构 438

25.2.3  设备驱动结构 442

25.2.4  USB驱动程序框架 445

25.3  USB驱动案例剖析 447

25.3.1  USB串口驱动 447

25.3.2  USB键盘驱动 449

25.4  小结 452

25.5  习题 452