第1章 基于ARM和嵌入式Linux的开发环境 1
1.1 嵌入式Linux 2
1.1.1 嵌入式系统 2
1.1.2 从Linux到嵌入式Linux 3
1.1.3 基本的编译调试工具 3
1.1.4 交叉编译环境 11
1.2 ARM处理器 12
1.2.1 ARM处理器介绍 13
1.2.2 ARM处理器的选型 14
1.2.3 S3C2410介绍 15
1.3 LJD-2410DVK-I开发板 16
1.3.1 开发板简介 17
1.3.2 硬件资源 17
1.3.3 软件资源 18
1.4 烧写开发板和搭建NFS环境 19
1.4.1 直接烧写开发板FLASH 19
1.4.2 通过NFS方式连接主机 21
1.5 交叉编译和运行HelloWorld 24
1.6 小结 25
第2章 QtopiaCore编程基础 27
2.1 嵌入式Linux下的常见GUI系统 28
2.2 QtopiaCore与Qt*Qt/Embedded 29
2.3 QtopiaCore的安装及简单实例 31
2.3.1 QtopiaCore的安装 31
2.3.2 FrameBuffer和qvfb 33
2.3.3 编写简单的QtopiaCore程序 39
2.4 移植QtopiaCore到开发板 41
2.4.1 准备库和字体 41
2.4.2 交叉编译HelloWorld程序 43
2.4.3 支持触摸屏 44
2.5 QtopiaCore的重要特性 45
2.5.1 信号和槽 46
2.5.2 自定义信号和槽的小例子 49
2.5.3 对象模型 52
2.5.4 窗口系统 58
2.5.5 QtopiaCore特性中的局限性 61
2.6 小结 63
第3章 命令行截屏工具 65
3.1 软件需求 66
3.2 截屏程序的工作原理 66
3.3 copyScreen程序的具体实现 68
3.4 运行和测试 70
3.5 小结 71
第4章 简单的时钟程序 73
4.1 开发背景与需求 74
4.2 技术分析和总体设计 74
4.2.1 与时钟相关的软硬件技术分析 74
4.2.2 初步设计方案 77
4.3 详细设计与代码实现 77
4.3.1 窗体控件的布局 78
4.3.2 选择合适的Qt控件 80
4.3.3 创建控件对象并布局 81
4.3.4 读取和修改系统时间 83
4.3.5 保存和读取时间格式 85
4.3.6 响应用户操作和刷新时间变化 89
4.3.7 绘制图形钟表盘 91
4.3.8 运行和测试我们的演示程序 95
4.4 小结 96
第5章 拼图小游戏 97
5.1 开发背景与需求 98
5.2 技术分析和总体设计 98
5.2.1 设计模式和MVC模式 99
5.2.2 Qt的Model/View模式 100
5.2.3 PuzzleGame的总体设计 101
5.3 详细设计与代码实现 104
5.3.1 CardsModel类的详细设计 104
5.3.2 CardsView类的详细设计 107
5.3.3 CardsDelegate类的详细设计 108
5.3.4 PuzzleWindow类的详细设计 108
5.3.5 CardsModel类的实现 109
5.3.6 View和Delegate的实现 116
5.3.7 主窗口和菜单的实现 120
5.4 运行和测试程序 121
5.5 小结 123
第6章 嵌入式桌面管理器 125
6.1 背景与需求 126
6.2 技术分析与设计 127
6.2.1 QtopiaCore中的Client/Server模型 127
6.2.2 利用fork启动其他应用 129
6.2.3 关于灵活性的设计 130
6.3 AppMgr的详细实现 131
6.3.1 读取INI文件中的数据 131
6.3.2 实现AppMgrModel类 132
6.3.3 实现AppMgrView类 136
6.3.4 实现Controller类 138
6.3.5 实现主窗体和“Back”功能 140
6.4 运行和测试AppMgr 143
6.5 小结 145
第7章 嵌入式数据库 147
7.1 嵌入式数据库概述 148
7.2 BerkeleyDB及简单实例 148
7.2.1 BerkeleyDB简介 148
7.2.2 BerkeleyDB的高效性 149
7.2.3 BerkeleyDB的基本概念 150
7.2.4 BerkeleyDB的系统框架 152
7.2.5 安装和移植BerkeleyDB 153
7.2.6 简单应用示例 155
7.2.7 SQL语言和BerkeleyDB的对应 160
7.3 SQLite及简单实例 161
7.3.1 SQLite简介 161
7.3.2 SQLite的体系结构 161
7.3.3 安装和移植SQLite 162
7.3.4 简单应用示例 164
7.4 小结 169
第8章 嵌入式Web服务器 171
8.1 软件需求与背景 172
8.2 工作原理与软件设计 173
8.2.1 HTTP协议 173
8.2.2 通用网关接口CGI 175
8.2.3 MiniWebServer的设计方案 176
8.3 MiniWebServer的详细实现 177
8.3.1 监听和建立连接 178
8.3.2 解析和处理HTTP请求 183
8.3.3 处理静态页面请求 187
8.3.4 处理GET方法的CGI请求 188
8.3.5 处理POST方法的CGI请求 190
8.4 运行和测试MiniWebServer 194
8.4.1 编译和环境准备 194
8.4.2 测试静态网页 194
8.4.3 测试CGI程序 195
8.5 小结 199
第9章 嵌入式Linux调试技术 201
9.1 嵌入式调试概述 202
9.2 printf和log 203
9.2.1 printf和fprintf 203
9.2.2 将调试信息写到log文件 204
9.2.3 控制log的级别 206
9.3 ELF文件调试基础 209
9.3.1 ELF基础知识 209
9.3.2 ELF可重定位文件和可执行文件 211
9.3.3 静态库和动态共享库 212
9.3.4 常用ELF调试工具 215
9.4 GDB调试器 220
9.4.1 准备好用于GDB调试的程序 220
9.4.2 运行GDB 222
9.4.3 设置和管理断点 225
9.4.4 检查运行状态及源文件 227
9.4.5 多进程和多线程调试 230
9.4.6 远程调试 231
9.4.7 图形化调试器 232
9.5 CoreDump及调试 233
9.5.1 CoreDump相关设置 234
9.5.2 CoreDump的原因 235
9.5.3 用GDB分析CoreDump 236
9.5.4 信息不足时的CoreDump分析 238
9.6 系统调试工具 239
9.6.1 /proc虚拟文件系统 239
9.6.2 进程和文件 242
9.6.3 跟踪(Trace)工具 244
9.7 小结 249
第10章 嵌入式Linux性能优化 251
10.1 嵌入式优化概述 252
10.2 分析性能瓶颈(Profiling) 253
10.2.1 基本系统工具 253
10.2.2 GPROF和GCOV 256
10.2.3 OProfile 263
10.3 提高运行速度 264
10.3.1 编译器优化 265
10.3.2 C/C++代码优化 265
10.3.3 利用XIP技术 268
10.3.4 延迟数据的加载 269
10.4 针对动态共享库的优化 269
10.4.1 Prelink(预连接)技术 270
10.4.2 dlopen方法 272
10.4.3 环境变量LDDEBUG 275
10.4.4 优化搜索共享库的路径 276
10.4.5 使用ExportMap 279
10.4.6 减少不必要的库依赖 281
10.5 减少存储消耗 282
10.5.1 Linux虚拟内存映像 283
10.5.2 内存信息的查看 285
10.5.3 用strip减小文件尺寸 288
10.5.4 内存相关的代码优化 289
10.5.5 减少进程、线程和函数库 292
10.5.6 使用更小的库和工具 292
10.5.7 选择合适的嵌入式文件系统 293
10.6 检查内存泄漏 294
10.6.1 典型的内存泄漏问题 294
10.6.2 MALLOCCHECK 295
10.6.3 MEMWATCH 297
10.6.4 Valgrind 298
10.7 小结 302
参考文献 303