第一篇 基础方法篇 3
第1章 程序基础 3
1.1 设计高性能程序的必要性 3
1.1.1 设计高性能程序的必要性 3
1.1.2 嵌入式软件的设计范畴 3
1.1.3 嵌入式软件的分层结构 6
1.2 嵌入式软件的程序设计要求 8
1.2.1 代码结果的要求 9
1.2.2 代码形式的要求 10
1.3 嵌入式软件开发的基本思路和原则 10
1.3.1 系统分析,定义接口 11
1.3.2 函数实现,优化算法 12
1.3.3 清理代码,补充注释 14
1.3.4 测试修订,完善文档 14
1.4 程序实例剖析 14
1.4.1 正确理解栈 14
1.4.2 内存泄漏 18
1.4.3 消除编译依赖 18
1.4.4 消除潜在隐患 20
1.4.5 规范实现范例 21
1.4.6 性能优化 23
1.5 程序设计其他注意点 30
1.5.1 谨慎使用“宏” 30
1.5.2 正确理解预定义宏 34
1.5.3 避免歧义 37
第2章 多任务操作系统 40
2.1 板级支持包 40
2.2 嵌入式操作系统与实时性 40
2.2.1 嵌入式操作系统 41
2.2.2 实时操作系统 42
2.3 多任务概述 42
2.3.1 进程、线程与任务 43
2.3.2 何时需要多任务 44
2.3.3 任务状态的转换 50
2.3.4 进程调度与调试算法 51
2.3.5 任务相关的API 51
2.4 进程间共享代码与可重入性 53
2.4.1 共享代码 53
2.4.2 共享代码可重入性问题 53
2.4.3 使用私有数据 55
2.4.4 使用临界区数据 57
2.5 线程间通信 57
2.5.1 共享数据结构 57
2.5.2 互斥 59
2.5.3 信号量 60
2.5.4 临界区与信号量的实现实例 63
第3章 硬件基础 74
3.1 ARM 74
3.1.1 ARM编程模式 75
3.1.2 ARM指令概述 78
3.1.3 ARM异常及处理 80
3.2 MIPS 86
3.2.1 MIPS编程模式 87
3.2.2 MIPS指令概述 90
3.2.3 MIPS中断与异常 95
3.3 接口基础 98
3.3.1 总线概述 99
3.3.2 I2C总线 105
3.3.3 PCI总线 108
3.3.4 设备模型 115
3.3.5 一个IDE控制器设备实例 117
第二篇 驱动模型篇 121
第4章 驱动的通用模型 121
4.1 设备驱动的作用 121
4.2 驱动类型 123
4.2.1 Lirux中的驱动类型 123
4.2.2 WinCE中的驱动类型 125
4.2.3 VxWorks中的驱动类型 125
4.3 设备驱动的通用模型 126
4.3.1 模块部分的驱动 126
4.3.2 设备的驱动例程 127
第5章 VxWorks的驱动模型 131
5.1 VxWorks的I/O系统 131
5.1.1 I/O系统概述 131
5.1.2 文件名与设备 133
5.1.3 基本I/O 134
5.1.4 缓冲I/O 136
5.1.5 格式化I/O 136
5.2 VxWorks的驱动及其内部结构 137
5.2.1 驱动的安装、驱动表 138
5.2.2 设备的创建、设备链表 140
5.2.3 文件的打开、文件描述符表 142
5.2.4 文件的读、写、控制和关闭操作 143
第6章 Linux的驱动模型 145
6.1 Linux的驱动加载方式 145
6.1.1 内核驱动模块与模块化驱动 145
6.1.2 模块化驱动的加载与卸载 146
6.2 Linux的驱动架构 147
6.2.1 一个最简单的内核驱动 148
6.2.2 一个最简单的模块驱动 151
6.2.3 Linux驱动中注册驱动 153
6.2.4 Linux系统中的设备文件 154
6.3 Linux字符型设备驱动 155
6.3.1 驱动的加载与清理 155
6.3.2 中断的申请与释放 156
第7章 WinCE的驱动模型 158
7.1 WinCE驱动类型 158
7.2 设备管理器及其驱动模型 159
第三篇 BSP/OAL篇 161
第8章 BSP的基本概念 161
8.1 BSP与驱动 161
8.2 BSP开发的目标任务 162
第9章 BSP的设计要素 163
9.1 中断处理 163
9.1.1 物理中断号与逻辑中断号 163
9.1.2 CPU中断与中断控制器扩展 164
9.1.3 中断源的查找 165
9.1.4 中断处理线程 166
9.2 CPU异常 166
9.2.1 异常向量表 167
9.2.2 向量表的安装 173
9.2.3 异常处理代码实例 177
9.3 硬件I/O的访问 188
9.3.1 避免使用绝对物理地址 188
9.3.2 内存一致性问题 192
9.3.3 I/O访问的刷新 198
第10章 Linux的启动过程 199
10.1 Linux的启动流程 199
10.2 Linux的启动过程简介 201
10.2.1 _stext函数 201
10.2.2 start_kernel函数 203
10.2.3 setup_arch函数 204
10.2.4 trap_init函数 204
10.2.5 init_IRQ函数 205
10.2.6 sched_init函数 205
10.2.7 do_initcalls函数 205
10.2.8 init函数 206
10.2.9 init程序 207
第11章 WinCE的设计 209
11.1 WinCE OS平台开发简介 209
11.1.1 WinCE平台的开发流程 209
11.1.2 WinCE内核结构 211
11.1.3 WinCE设计中的一些名词术语 212
11.2 WinCE BSP开发 213
11.2.1 启动装载器 213
11.2.2 OAL开发 215
11.2.3 WinCE配置文件 219
11.3 WinCE设备驱动的开发流程 221
11.3.1 设备驱动源代码 221
11.3.2 修改配置文件 222
11.3.3 向OS平台注入驱动 223
第四篇 扩展篇 226
第12章 理解程序的内部结构 226
12.1 x86汇编及其程序结构 226
12.1.1 x86程序段定义 227
12.1.2 关联段寄存器、确定段的种类 230
12.1.3 段组伪指令 230
12.2 嵌入式系统中的程序结构 231
12.2.1 嵌入式系统中执行程序的映像 231
12.2.2 链接器与命令脚本 236
12.3 ELF文件格式 241
12.3.1 ELF文件格式概述 241
12.3.2 ELF文件格式分析器 248
第13章 嵌入式系统的设计思想 262
13.1 直截了当的思想 262
13.2 层次化的思想 267
13.3 循序渐进的思想 269
13.4 实践是最好的老师 269
13.5 团队协作意识 270
13.6 大胆尝试与积极创新 270
结束语 272
参考文献 273
图1-1 嵌入式软件的分层结构 7
图2-1 VxWorks中的任务状态转换图 50
图2-2 驱动中的可重入性问题1 54
图2-3 驱动中的可重入性问题2 56
图2-4 使用共享数据区访问临界区的例子 58
图3-1 ARM程序状态寄存器格式 77
图3-2 MIPS CPU寄存器 88
图3-3 MIPS FPU寄存器 90
图3-4 I2C数据位的传输 106
图3-5 I2C起始条件和停止条件 106
图3-6 I2C总线数据传输时序图 107
图3-7 PCI CONFIG-ADDRESS寄存器格式 113
图3-8 PCI类型0配置空间头部 114
图3-9 ITE8172 IDE控制器框图 118
图5-1 驱动在系统中的层次结构 132
图5-2 VxWorks I/O系统的调用关系 133
图5-3 VxWorks驱动安装 140
图5-4 VxWorks设备添加 141
图5-5 VxWorks文件打开 142
图5-6 文件读操作的I/O控制流程 143
图6-1 Linux驱动与操作系统核心之间的关系 147
图7-1 WinCE驱动内部框图 158
图7-2 WinCE系统中应用程序与设备驱动的交互 160
图9-1 驱动程序中完整的中断处理架构 164
图9-2 IT8172G中断控制器内部框图 177
图10-1 Linux启动流程框图 200
图10-2 Linux启动执行过程细节 201
图11-1 WinCE OS开发的工作流程 210
图11-2 WinCE的内部层次结构 211
图11-3 WinCE BSP框图 214
图12-1 x86汇编段结构 228
图12-2 宏汇编中的段链接映像 230
图12-3 x86段组定义 231
图12-4 节的简单格式 237
图12-5 节的完整定义 239
图12-6 口(ENTRY)的定义 240
图12-7 ELF目标文件格式 242
表3-1 ARM寄存器组织结构 75
表3-2 ARM状态寄存器的模式位 78
表3-3 ARM异常处理的入口地址 81
表3-4 ARM异常的优先级 86
表3-5 MIPS系统控制寄存器CPO 88
表3-6 MIPS32/MIPS64装入/存储指令所支持的数据类型 91
表3-7 MIPS对齐的装入存储指令 91
表3-8 MIPS非对齐的装入存储指令 91
表3-9 MIPS原子更新的装入存储指令 92
表3-10 协处理器装入存储指令 92
表3-11 MIPS立即数操作的算术指令 92
表3-12 MIPS三操作数算术指令 92
表3-13 MIPS二操作数算术指令 93
表3-14 MIPS移位指令 93
表3-15 MIPS乘除法指令 94
表3-16 MIPS 256M区域内无条件跳转指令 95
表3-17 MIPS PC相对的条件转移指令 95
表3-18 MIPS的中断、状态及缘由寄存器的映射关系 96
表3-19 MIPS异常向量的基地址 97
表3-20 MIPS异常向量的偏移地址 97
表3-21 I2C总线术语定义 105
表3-22 PCI总线命令 110
表3-23 ITE8172 IDE控制器的PCI配置寄存器 119
表3-24 ITE8172 IDE总线主设备IDE输入/输出寄存器 119
表3-25 IDE命令寄存器 120
表11-1 WinCE常见的映像配置文件 219
表12-1 字符串表简单例子 246
表12-2 对字符串表索引所得到的字符串 246