第1章 嵌入式系统的基础知识 1
1.1 考查嵌入式系统 1
1.1.1 与台式机或Web应用程序的不同之处 1
1.1.2 嵌入式系统的类型 2
1.1.3 微控制器 2
1.1.4 片上系统 3
1.1.5 专用集成电路 4
1.1.6 现场可编程门阵列 4
1.2 与有限的资源协同工作 4
1.3 考查性能影响 4
1.4 与不同的架构协同工作 5
1.4.1 字节顺序 5
1.4.2 对齐问题 7
1.4.3 定宽整数类型 8
1.5 处理硬件错误 8
1.5.1 硬件的早期版本 8
1.5.2 硬件的不可靠性 9
1.5.3 环境条件的影响 9
1.6 C 嵌入式开发 9
1.6.1 不必为无用的事务付诸实践 10
1.6.2 基于面向对象编程的代码复杂度计算 12
1.6.3 资源获取时即初始化 12
1.6.4 异常机制 14
1.6.5 强大的标准库 16
1.6.6 线程和内存模型 16
1.7 远程部署软件 17
1.8 远程运行软件 18
1.9 日志和诊断 18
1.10 本章小结 19
第2章 配置开发环境 21
2.1 在Docker容器中配置构建系统 22
2.1.1 实现方式 22
2.1.2 工作方式 23
2.1.3 更多内容 24
2.2 与模拟器协同工作 24
2.2.1 实现方式 25
2.2.2 工作方式 25
2.2.3 更多内容 27
2.3 交叉编译 27
2.3.1 准备工作 27
2.3.2 实现方式 27
2.3.3 工作方式 28
2.3.4 更多内容 31
2.4 连接至嵌入式系统 31
2.4.1 准备工作 31
2.4.2 实现方式 31
2.4.3 工作方式 32
2.4.4 更多内容 33
2.5 调试嵌入式应用程序 34
2.5.1 准备工作 34
2.5.2 实现方式 34
2.5.3 工作方式 35
2.5.4 更多内容 36
2.6 针对远程调试使用gdbserver 37
2.6.1 准备工作 37
2.6.2 实现方式 37
2.6.3 工作方式 38
2.6.4 更多内容 39
2.7 使用CMake作为构建系统 40
2.7.1 准备工作 40
2.7.2 实现方式 40
2.7.3 工作方式 41
2.7.4 更多内容 44
第3章 与不同的体系结构协同工作 45
3.1 定宽整数类型 45
3.1.1 实现方式 46
3.1.2 工作方式 47
3.1.3 更多内容 48
3.2 处理size_t类型 48
3.2.1 实现方式 48
3.2.2 工作方式 49
3.2.3 更多内容 50
3.3 检测平台的字节顺序 50
3.3.1 实现方式 51
3.3.2 工作方式 52
3.3.3 更多内容 53
3.4 转换字节顺序 53
3.4.1 实现方式 54
3.4.2 工作方式 57
3.5 处理数据对齐问题 58
3.5.1 实现方式 59
3.5.2 工作方式 60
3.5.3 更多内容 61
3.6 处理打包结构 61
3.6.1 实现方式 62
3.6.2 工作方式 62
3.6.3 更多内容 63
3.7 缓存行对齐数据 63
3.7.1 实现方式 63
3.7.2 工作方式 65
3.7.3 更多内容 66
第4章 处理中断 67
4.1 数据轮询 67
4.2 中断服务程序 68
4.3 对ISR的一般考虑 68
4.4 8051微控制器中断 69
4.5 实现中断服务程序 70
4.5.1 实现方式 70
4.5.2 工作方式 72
4.6 通过8位自动重载模式生成一个5 kHz的方波信号 73
4.6.1 实现方式 74
4.6.2 工作方式 75
4.7 使用Timer 1作为事件计数器计数一个1 Hz脉冲 76
4.7.1 实现方式 76
4.7.2 工作方式 78
4.7.3 更多内容 79
4.8 串行接收和传输数据 79
4.8.1 实现方式 80
4.8.2 工作方式 80
4.8.3 更多内容 81
第5章 调试、日志和分析 83
5.1 技术需求 83
5.2 在GDB中运行源程序 84
5.2.1 实现方式 84
5.2.2 工作方式 86
5.2.3 更多内容 90
5.3 处理断点 91
5.3.1 实现方式 91
5.3.2 工作方式 92
5.3.3 更多内容 96
5.4 处理核心转储 96
5.4.1 实现方式 96
5.4.2 工作方式 97
5.4.3 更多内容 99
5.5 使用gdbserver进行调试 99
5.5.1 准备工作 100
5.5.2 实现方式 100
5.5.3 工作方式 100
5.6 添加调试日志机制 101
5.6.1 实现方式 101
5.6.2 工作方式 102
5.6.3 更多内容 104
5.7 与调试和发布版本协同工作 104
5.7.1 实现方式 105
5.7.2 工作方式 106
5.7.3 更多内容 108
第6章 内存管理 109
6.1 使用动态内存分配 109
6.1.1 实现方式 110
6.1.2 工作方式 112
6.2 对象池 112
6.2.1 实现方式 113
6.2.2 工作方式 115
6.2.3 更多内容 118
6.3 环状缓冲区 118
6.3.1 实现方式 119
6.3.2 工作方式 121
6.4 使用共享内存 124
6.4.1 实现方式 125
6.4.2 工作方式 128
6.4.3 更多内容 131
6.5 使用专用内存 131
6.5.1 实现方式 131
6.5.2 工作方式 133
6.5.3 更多内容 135
第7章 多线程和同步机制 137
7.1 C 语言中的线程支持 137
7.1.1 实现方式 138
7.1.2 工作方式 139
7.2 数据同步机制 140
7.2.1 实现方式 140
7.2.2 工作方式 141
7.2.3 更多内容 143
7.3 使用条件变量 143
7.3.1 实现方式 143
7.3.2 工作方式 145
7.3.3 更多内容 147
7.4 使用原子变量 147
7.4.1 实现方式 148
7.4.2 工作方式 150
7.4.3 更多内容 151
7.5 使用C 内存模型 152
7.5.1 实现方式 152
7.5.2 工作方式 154
7.5.3 更多内容 155
7.6 无锁同步机制 155
7.6.1 实现方式 155
7.6.2 工作方式 157
7.6.3 更多内容 158
7.7 在共享内存中使用原子变量 159
7.7.1 实现方式 159
7.7.2 工作方式 162
7.8 异步函数和特性 164
7.8.1 实现方式 165
7.8.2 工作方式 166
7.8.3 更多内容 168
第8章 通信和序列化 169
8.1 在应用程序中使用进程间的通信 169
8.1.1 实现方式 170
8.1.2 工作方式 172
8.1.3 更多内容 175
8.2 进程间的通信机制 175
8.2.1 准备工作 175
8.2.2 实现方式 176
8.2.3 工作方式 177
8.2.4 更多内容 178
8.3 消息队列和发布者-订阅者模式 178
8.3.1 实现方式 179
8.3.2 工作方式 182
8.3.3 更多内容 184
8.4 针对回调使用C lambda函数 185
8.4.1 实现方式 185
8.4.2 工作方式 186
8.4.3 更多内容 187
8.5 数据序列化 187
8.5.1 实现过程 188
8.5.2 工作方式 190
8.5.3 更多内容 191
8.6 使用FlatBuffers库 192
8.6.1 实现方式 192
8.6.2 工作方式 194
8.6.3 更多内容 195
第9章 外围设备 197
9.1 控制通过GPIO连接的设备 197
9.1.1 实现方式 197
9.1.2 工作方式 199
9.2 脉冲宽度调制 201
9.2.1 实现方式 201
9.2.2 工作方式 203
9.2.3 更多内容 204
9.3 在Linux中使用ioctl访问实时时钟 204
9.3.1 实现方式 205
9.3.2 工作方式 207
9.3.3 更多内容 208
9.4 使用libgpiod控制GPIO引脚 208
9.4.1 实现方式 209
9.4.2 工作方式 210
9.4.3 更多内容 211
9.5 控制I2C外围设备 211
9.5.1 实现方式 212
9.5.2 工作方式 216
9.5.3 更多内容 219
第10章 降低功耗 221
10.1 技术需求 221
10.2 考查Linux中的节能模式 221
10.2.1 实现方式 222
10.2.2 工作方式 223
10.2.3 更多内容 224
10.3 利用RTC进行唤醒 224
10.3.1 实现方式 224
10.3.2 工作方式 225
10.3.3 更多内容 226
10.4 控制USB设备的自动挂起 226
10.4.1 实现方式 226
10.4.2 工作方式 227
10.4.3 更多内容 229
10.5 配置CPU频率 230
10.5.1 实现方式 230
10.5.2 工作方式 231
10.5.3 更多内容 235
10.6 等待事件 235
10.6.1 实现方式 235
10.6.2 工作方式 238
10.6.3 更多内容 241
10.7 利用PowerTOP分析功耗 241
10.7.1 实现方式 241
10.7.2 工作方式 242
10.7.3 更多内容 244
第11章 时间点和时间间隔 245
11.1 C Chrono库 245
11.1.1 实现方式 245
11.1.2 工作方式 246
11.1.3 更多内容 247
11.2 测量时间间隔 247
11.2.1 实现方式 248
11.2.2 工作方式 249
11.2.3 更多内容 250
11.3 处理延迟问题 250
11.3.1 实现方式 250
11.3.2 工作方式 252
11.3.3 更多内容 253
11.4 使用单调递增时钟 254
11.4.1 实现方式 254
11.4.2 工作方式 256
11.4.3 更多内容 257
11.5 使用POSIX时间戳 258
11.5.1 实现方式 258
11.5.2 工作方式 259
11.5.3 更多内容 260
第12章 错误处理和容错机制 261
12.1 处理错误代码 261
12.1.1 实现方式 261
12.1.2 工作方式 264
12.1.3 更多内容 265
12.2 针对错误处理使用异常 265
12.2.1 实现方式 266
12.2.2 工作方式 267
12.2.3 更多内容 269
12.3 捕捉异常时使用常量引用 269
12.3.1 实现方式 269
12.3.2 工作方式 271
12.3.3 更多内容 272
12.4 处理静态对象 273
12.4.1 实现方式 273
12.4.2 工作方式 275
12.5 与定时器协同工作 276
12.5.1 实现方式 277
12.5.2 工作方式 278
12.6 高可用系统的心跳信号 280
12.6.1 实现方式 280
12.6.2 工作方式 283
12.6.3 更多内容 287
12.7 实现软件反抖动逻辑 287
12.7.1 实现方式 287
12.7.2 工作方式 289
第13章 实时系统 291
13.1 使用Linux中的实时调度器 291
13.1.1 实现方式 292
13.1.2 工作方式 293
13.2 使用静态分配的内存 295
13.2.1 实现方式 295
13.2.2 工作方式 297
13.2.3 更多内容 298
13.3 避免错误处理异常 298
13.3.1 实现方式 299
13.3.2 工作方式 301
13.3.3 更多内容 302
13.4 实时系统 302
13.4.1 实现方式 302
13.4.2 工作方式 303
13.4.3 更多内容 304
第14章 安全性系统的指导原则 305
14.1 使用全部函数的返回值 305
14.1.1 实现方式 306
14.1.2 工作方式 308
14.1.3 更多内容 310
14.2 使用静态代码分析器 310
14.2.1 实现方式 311
14.2.2 工作方式 311
14.2.3 更多内容 312
14.3 使用前置条件和后置条件 312
14.3.1 实现方式 313
14.3.2 工作方式 314
14.3.3 更多内容 316
14.4 代码正确性的正规验证方案 316
14.4.1 实现方式 316
14.4.2 工作方式 317
14.4.3 更多内容 319
第15章 微控制器编程 321
15.1 设置开发环境 321
15.1.1 实现方式 321
15.1.2 工作方式 322
15.1.3 更多内容 323
15.2 编译并上传程序 323
15.2.1 实现方式 323
15.2.2 工作方式 323
15.2.3 更多内容 325
15.3 调试微控制器代码 326
15.3.1 实现方式 326
15.3.2 工作方式 327