第1章 导论 1
1.1 什么是嵌入式系统 1
1.2 嵌入式软件设计目标有何独特之处 2
1.3 “实时”意味着什么 4
1.4 “多任务”意味着什么 5
1.5 嵌入式处理器的功能有多强 6
1.6 使用哪些编程语言 6
1.7 什么是“实时内核” 7
1.8 如何构建独特的嵌入式应用程序 8
1.9 典型的嵌入式程序有多大 10
1.10 本书中使用的软件 11
习题 12
2.1 固定精度的二进制数字 13
第2章 数据表示 13
2.1.1 按位记数制 14
2.1.2 二进制-十进制转换 15
2.1.3 十进制-二进制转换 15
2.1.4 计数 16
2.1.5 固定精度和翻转 17
2.1.6 十六进制表示 17
2.2 整数的二进制表示 18
2.2.1 带符号整数 18
2.2.2 同一个值的正的表示和负的表示 19
2.2.3 解释2的补码数的值 20
2.2.4 关于范围和溢出的进一步说明 20
2.2.5 2的补码和硬件复杂性 21
2.3.1 定点表示 24
2.3 实数的二进制表示 24
2.3.2 使用通用的16.16格式的定点表示 26
2.3.3 使用通用的32.32格式的定点表示 27
2.3.4 浮点表示 30
2.4 文本的ASCⅡ表示 32
2.5 二进制编码的十进制表示 34
习题 35
第3章 充分利用C语言 37
3.1 整型数据类型 37
3.2 混合数据类型 40
3.3 有用的trpedef和define 40
3.4 操纵内存中的位 41
3.4.1 测试位 43
3.4.2 设置、清除和反转位 44
3.4.3 提取位 45
3.4.4 插入位 45
3.5 操纵I/O端口中的位 46
3.5.1 只写I/O端口 46
3.5.2 通过读/写区分的端口 47
3.5.3 通过顺序访问区分的端口 47
3.5.4 通过写入数据中的位区分的端口 48
3.6 访问内存映射的I/O设备 48
3.6.1 通过指针访问数据 48
3.6.2 数组、指针和“取地址”运算符 49
3.7 结构 50
3.7.1 打包的结构 51
3.7.2 位域 53
3.8.1 强制转换对象的地址 54
3.8 变型访问 54
3.8.2 使用共用体 55
习题 56
第4章 程序员眼中的计算机结构 58
4.1 内存 58
4.2 中央处理器 59
4.2.1 运算器 60
4.2.2 其他寄存器 61
4.2.3 控制器 61
4.3 输入/输出 62
4.4 Intel架构介绍 63
4.4.2 指令操作数 64
4.4.1 指令格式 64
4.4.3 操作数限制 65
4.4.4 寄存器 66
4.4.5 栈 68
4.5 Intel实模式架构 69
4.5.1 分段寻址 70
4.5.2 寻址模式 72
4.6 Intel保护模式架构 74
4.6.1 段寄存器和全局描述符表 74
4.6.2 平坦内存模型 75
4.6.3 寻址模式 75
4.7 操作数与地址长度覆盖前缀 76
4.8 Intel数据操纵指令 76
4.8.1 数据移动、栈和I/O指令 77
4.8.2 算术指令 78
4.8.3 按位指令 80
4.8.4 移位指令 81
习题 83
第5章 C语言与汇编语言的融合 85
5.1 用汇编语言编程 85
5.2 寄存器使用约定 86
5.3 寻址选项的典型应用 87
5.3.1 访问地址为常量的数据 87
5.3.2 访问地址为变量的数据 88
5.4 指令序列 89
5.4.1 复合条件 91
5.4.3 建立循环 93
5.4.2 If-Then-Else语句 93
5.4.4 带字符串指令的更快的循环 94
5.5 过程调用和返回 96
5.6 参数传递 97
5.7 获取参数 99
5.8 一切都是按值传递 100
5.9 临时变量 101
习题 104
第6章 输入/输出编程 106
6.1 Intel I/O指令 106
6.2 同步、传送速率和等待时间 107
6.3 轮询的等待循环 108
6.4.1 硬件响应 110
6.4 中断驱动的I/O 110
6.4.2 中断服务例程 112
6.4.3 可编程中断控制器 114
6.4.4 缓冲区与队列 115
6.4.5 用汇编语言编写中断服务例程 117
6.4.6 用C语言编写中断服务例程 117
6.4.7 不可屏蔽的中断 119
6.4.8 软件中断 120
6.4.9 异常 120
6.5 直接存储器存取 121
6.5.1 双缓冲 122
6.6 几种方法的比较 123
习题 123
7.1.1 线程状态和串行化 126
第7章 并发软件 126
7.1 前台/后台系统 126
7.1.2 管理等待时间 127
7.1.3 防止中断越界 129
7.1.4 将工作转移到后台 131
7.2 多线程编程 131
7.2.1 独立线程的并发执行 132
7.2.2 环境切换 133
7.2.3 非抢先式(协作式)多任务处理 133
7.2.4 抢先式多任务 134
7.3 共享资源和临界区 135
7.3.3 自旋锁 136
7.3.2 禁用任务切换 136
7.3.1 禁用中断 136
7.3.4 互斥对象 137
7.3.5 信号量 137
习题 138
第8章 调度 140
8.1 线程状态 140
8.2 挂起线程 140
8.3 环境切换 141
8.4 循环调度 143
8.5 基于优先级的调度 143
8.5.1 优先级倒置 143
8.5.3 优先级最高限度协议 144
8.5.2 优先级继承协议 144
8.6 分配优先级 145
8.6.1 截止期限驱动的调度 145
8.6.2 速率单调调度 146
8.7 死锁 146
8.8 监视计时器 147
习题 149
第9章 内存管理 151
9.1 C语言中的对象 151
9.2 作用域 152
9.2.1 进一步认识局部作用域 152
9.2.2 进一步认识全局作用域 153
9.3 生存期 154
9.4 自动分配 154
9.4.1 存储类“寄存器” 155
9.5 静态分配 156
9.6 用于区分静态与自动的3个程序 157
9.6.1 对象创建 157
9.6.2 对象初始化 158
9.6.3 对象析构 159
9.7 动态分配 160
9.7.1 内存碎片 161
9.7.2 内存分配池 161
9.8 可变大小的自动分配 161
9.8.1 可变大小的数组 162
9.9 递归函数与内存分配 163
习题 164
第10章 共享内存 170
10.1 识别共享对象 170
10.1.1 共享全局数据 170
10.1.2 共享私有数据 170
10.1.3 共享函数 171
10.2 可重入函数 171
10.3 只读数据 171
10.3.1 类型限定符const 172
10.4 应避免的编码习惯 172
10.4.1 在局部静态对象中保持内部状态的函数 173
10.4.2 返回局部静态对象地址的函数 174
10.5 访问共享内存 176
10.5.2 只读和只写访问 177
10.5.1 处理器字长的影响 177
10.5.3 类型限定符volatile 178
习题 180
第11章 系统初始化 182
11.1 内存布局 182
11.2 CPU 183
11.2.1 建立平坦内存模型 183
11.2.2 切换到保护模式 185
11.3 C运行时环境 186
11.3.1 从ROM复制到RAM中 186
11.3.2 将未初始化数据置0 187
11.3.3 建立堆 188
11.4.1 计时器0:计时器滴答信号 189
11.4 系统计时器 189
11.4.2 计时器1:内存刷新 190
11.4.3 计时器2:扬声器频率 190
11.5 中断系统 191
11.5.1 初始化IDT 191
11.5.2 初始化8259 PIC 193
11.5.3 安装新的中断服务例程 194
附录A 配书光盘上的内容 196
附录B DJGPP C/C++编译器 197
附录C NASM汇编器 199
附录D 编程项目 201
附录E libepc库 216
附录F 引导加载程序 225
附录G 词汇表 228