第1章 嵌入式系统概述 1
1.1嵌入式系统的定义 1
1.2嵌入式系统的发展 2
1.3嵌入式系统的组成 3
1.4嵌入式系统的分类 4
1.5嵌入式系统的开发流程 8
1.6如何学习嵌入式系统 10
第2章将ARM微处理器S3C2440作为高档单片机的开发与应用 12
2.1了解ARM微处理器S3C2440 12
2.1.1 S3C2440的硬件资源配置 12
2.1.2 S3C2410与S3C2440的主要区别 14
2.1.3认识一个由S3C2440微处理器组成的嵌入式系统 14
2.2 S3C2440对存储器和寄存器的组织 15
2.2.1 S3C2440对存储器的组织 16
2.2.2 S3C2440对寄存器的组织 17
2.2.3 S3C2440对特殊功能寄存器SFR的组织 18
2.3 S3C2440的启动方式 19
2.3.1 Nand Flash与Nor Flash 19
2.3.2 S3C2440的Nor Flash启动 20
2.3.3 S3C2440的Nand Flash启动 20
2.4 ARM指令系统 20
2.4.1 ARM指令系统 21
2.4.2 ARM指令系统的寻址方式 23
2.4.3 ARM指令系统的分类 27
2.4.4 ARM指令集和Thumb指令集的关系 29
2.5 ARM伪指令系统 30
2.5.1符号定义伪指令 31
2.5.2数据定义伪指令 31
2.5.3汇编控制伪指令 32
2.5.4宏定义伪指令 33
2.5.5段定义伪指令 33
2.5.6杂项伪指令 34
2.5.7 ARM伪指令 35
2.5.8 ARM连接器的保留字 35
2.5.9 ARM汇编器的内置变量 36
2.6在ADS开发环境下开发S3C2440 37
2.6.1建立ADS开发环境 37
2.6.2编写一个汇编语言框架程序 37
2.6.3编写一个在Boot RAM中运行的LED驱动程序 43
2.6.4制作一个可以自动运行的LED闪烁装置 45
2.7 S3C2440对电源和时钟系统的管理 45
2.7.1认识S3C2440时钟系统 45
2.7.2系统时钟设置步骤 47
2.7.3电源和时钟系统管理方案 48
2.8 S3C2440对SDRAM的初始化 51
2.8.1初始化SDRAM存储器所需的控制寄存器 52
2.8.2代码搬移 55
2.9用C语言对S3C2440编程 56
2.9.1在ADS环境下直接使用C语言编程 57
2.9.2由汇编语言转入C语言 58
2.9.3汇编语言与C语言无参函数的相互调用 59
2.9.4汇编语言与C语言带参函数的相互调用 61
2.9.5在C语言中嵌入汇编语言 63
2.10 S3C2440的Nand Flash控制器 64
2.10.1 Nand Flash控制器的初始化 65
2.10.2 Nand Flash读操作流程 70
2.10.3 Nand Flash读操作编程示例 71
2.11 S3C2440对中断的组织 74
2.11.1 S3C2440的工作模式 74
2.11.2 S3C2440对中断(异常)的响应 76
2.11.3 S3C2440对中断源的组织 78
2.11.4 S3C2440中断控制器的初始化 80
2.11.5汇编语言的中断编程框架示例 83
2.11.6 C语言的中断编程框架示例 87
2.12 S3C2440 TFT型液晶显示器的使用 92
2.12.1 S3C2440内置LCD控制器介绍 92
2.12.2 LCD初始化编程示例 98
2.13 S3C2440的ADC和电阻式触摸屏的使用 100
2.13.1四线电阻式触摸屏的工作原理 101
2.13.2 ADC和触摸屏接口使用方法 102
2.13.3 ADC和触摸屏编程示例 104
2.14 S3C2440中的各类定时器的使用 106
2.14.1看门狗Watch dog的使用 106
2.14.2实时时钟——RTC的使用 108
2.14.3 S3C2440定时器与PWM接口的使用 112
2.15 S3C2440串行接口(UART)的使用 118
2.15.1 UART控制器的结构 118
2.15.2串行口的初始化 119
2.15.3串行口应用举例 122
2.16 S3C2440 Ⅰ2C接口的使用 124
2.16.1 AT24C08 EEPROM操作 124
2.16.2 12C接口的初始化 128
2.16.3 Ⅰ2C接口的编程示例 128
2.17 S3C2440 DMA控制器的使用 132
2.17.1 DMA控制器的设置 132
2.17.2 DMA控制器编程示例 135
2.18 S3C2440的内存管理单元MMU 137
2.18.1 MMU的基本概念 137
2.18.2 MMU的映射原理 140
2.18.3 S3C2440的MMU设置 141
2.18.4 MMU段映射编程示例 146
2.19用Scatter文件组织程序 149
2.19.1什么时候使用Scatter文件 150
2.19.2 Scatter文件的编写和应用 150
2.20在S3C2440上运行Ⅰ2C/OS-Ⅱ嵌入式实时操作系统 155
2.20.1 RTOS的基本概念 155
2.20.2 RTOS中的任务管理 156
2.20.3 RTOS的任务状态与任务调度 159
2.20.4 RTOS中的基本任务操作 160
2.20.5 RTOS下的任务设计 161
2.20.6嵌入式实时操作系统Ⅱ 164
2.20.7将μC/OS-Ⅱ移植到S3C2440开发板 165
2.20.8基于μC/OS-Ⅱ的多任务程序设计示例 169
第3章Linux操作系统下嵌入式系统开发环境的建立 174
3.1嵌入式系统为什么要配用操作系统 174
3.2认识一个配有Linux操作系统的S3C2440嵌入式系统开发板 175
3.3建立嵌入式系统开发环境 177
3.3.1建立嵌入式系统开发环境的步骤 177
3.3.2嵌入式系统开发过程中经常使用的Linux操作系统命令 181
3.4嵌入式系统的开发过程 182
3.4.1 vi编辑器的使用 182
3.4.2对源程序的编译、交叉编译及执行 185
3.4.3环境变量的设置 191
3.4.4 gdb调试工具的使用 193
3.5 shell程序的编写 198
3.5.1 shell是什么 198
3.5.2一个简单的shell程序 199
3.5.3 shell程序的用户变量定义与引用 200
3.5.4 shell程序的常用系统变量 201
3.5.5 shell程序的算术和逻辑运算 202
3.5.6 shell程序的流程控制 204
3.5.7 shell编程要点 208
3.5.8 shell程序的调试 209
3.6 Makefile文件的编写 211
3.6.1什么是Makefile文件 211
3.6.2 Makefile文件的结构 214
3.6.3 Makefile文件变量的定义、赋值与引用 216
3.6.4 Makefile文件中内嵌命令(函数)的使用 219
3.6.5 Makefile文件中两种常用规则的使用 220
3.6.6 Makefile文件的几种特殊的编程方法 222
3.6.7 make命令的执行 223
3.6.8 Makefile文件框架的自动生成 224
3.7 SourceInsight程序编辑/浏览器使用方法 226
第4章Linux操作系统下设备驱动程序的编写与应用 228
4.1什么是设备驱动程序 229
4.2设备驱动程序初探 230
4.2.1一个简单的设备驱动程序 231
4.2.2设备驱动程序与应用程序的区别 233
4.2.3带参数设备驱动程序的编写与加载 234
4.3简单字符设备驱动程序框架 236
4.3.1静态分配设备号的简单字符设备驱动程序框架 237
4.3.2动态分配设备号的简单字符设备驱动程序框架 242
4.3.3应用程序与简单字符设备驱动程序的数据交换 245
4.3.4简单字符设备驱动程序编写和测试步骤 249
4.4嵌入式系统简单字符设备驱动程序的编写 250
4.4.1设备驱动程序交叉编译环境的建立 250
4.4.2一个简单字符设备驱动程序 252
4.4.3将设备驱动程序编写得更“专业”一些 255
4.4.4带有中断功能的简单字符设备驱动程序 259
4.4.5利用内存映射在应用层直接对外设编程 266
4.5多个次设备号驱动程序的编写 269
4.6对简单字符设备驱动程序的基本印象 273
4.7 Linux操作系统下字符设备驱动程序的应用 273
4.7.1 LCD设备应用编程 274
4.7.2音频设备应用编程 278
4.7.3串口设备应用编程 285
4.7.4 USB字符设备应用编程 287
4.7.5触摸屏设备应用编程 292
4.7.6触摸屏接口程序tslib的移植与应用 293
4.7.7 USB摄像头设备应用编程 295
4.7.8使用camera接口应用编程 297
4.7.9实时时钟(RTC)应用编程 301
4.7.10开发板上简单硬件装置的测试程序 304
4.8块设备驱动程序的应用 306
4.8.1 SD卡的使用 306
4.8.2 U盘的使用 307
4.9将设备驱动程序静态加载 307
第5章Linux操作系统下关于信号、进程、线程的编程 311
5.1几个基本概念的解释 311
5.1.1任务、进程、线程 311
5.1.2进程间的通信 313
5.1.3 Linux下关于进程与线程的基本操作命令 314
5.1.4关于本章示例程序的说明 315
5.2进程的创建及多进程编程 317
5.2.1相关函数 317
5.2.2创建进程编程示例 320
5.2.3 exec函数族的使用 321
5.2.4 exec函数族编程示例 322
5.3信号的使用 324
5.3.1什么是信号 324
5.3.2进程对信号的响应 326
5.3.3相关函数 327
5.4进程间的通信 330
5.4.1信号通信 330
5.4.2管道通信 333
5.4.3消息队列(报文)通信 339
5.4.4内存(文件)映射与共享内存通信 343
5.4.5信号量(信号灯)通信 351
5.4.6套接字通信 356
5.5线程的创建及多线程编程 368
5.5.1相关函数 368
5.5.2创建线程编程示例 370
5.5.3互斥锁的使用 371
第6章 图形界面系统Qt/Embedded的移植与应用 375
6.1 Qt/Embedded的移植 376
6.1.1 Qt/Embedded移植前的准备 376
6.1.2 Qt/Embedded-4.6.3的移植 377
6.2 Qt/Embedded-4.6.3的测试 385
6.2.1对X86版的测试 385
6.2.2对Qte版的测试 386
6.2.3对ARM版的测试 386
6.3 Qt/Embedded-4.6.3应用程序的开发过程 387
6.3.1编写一个X86版的应用程序 387
6.3.2编写一个Qte版的应用程序 389
6.3.3编写一个ARM版的应用程序 390
6.4 Qt/Embedded-4.6.3与开发板外部设备之间的接口 391
第7章 嵌入式Linux操作系统的移植过程 395
7.1嵌入式Linux操作系统的组成 396
7.2 BootLoader——引导加载程序 397
7.2.1 U-Boot的基本概念 399
7.2.2 U-Boot的目录结构 400
7.2.3 U-Boot的启动流程 401
7.2.4 U-Boot与Linux内核的关系 401
7.2.5 U-Boot的常用命令 403
7.2.6 U-Boot的移植过程 404
7.3 Linux内核的配置(裁剪)与移植 407
7.3.1 Linux操作系统内核特点及源码结构 407
7.3.2 Linux内核配置(裁剪)过程 409
7.3.3 Linux内核配置(裁剪)系统的组织 411
7.3.4 Linux内核的Makefile文件 416
7.3.5 Linux内核的编译 420
7.3.6 Linux内核的移植过程 420
7.4根文件系统的建立 421
7.4.1嵌入式系统的文件系统 421
7.4.2嵌入式系统的根文件系统 422
7.4.3 BusyBox工具 422
7.4.4使用BusyBox构建根文件系统过程 423
附录 配书光盘文件目录 428
参考文献 429