第1篇 基础应用篇
第1章 实时操作系统的基本概念与线程基础知识\t3
1.1 实时操作系统的基本含义\t3
1.1.1 嵌入式系统的基本分类\t3
1.1.2 无操作系统与实时操作系统\t4
1.1.3 实时操作系统与非实时操作系统\t5
1.2 实时操作系统中的基本概念\t6
1.2.1 线程与调度的基本含义\t6
1.2.2 内核的基本概念\t7
1.2.3 线程的基本概念\t9
1.3 线程的三要素、四种状态及三种基本形式\t10
1.3.1 线程的三要素\t10
1.3.2 线程的四种状态\t11
1.3.3 线程的三种基本形式\t13
1.4 本章小结\t14
第2章 相关基础知识\t17
2.1 CPU内部寄存器的分类及ARM Cortex-M处理器的主要寄存器\t17
2.1.1 CPU内部寄存器的分类\t17
2.1.2 ARM Cortex-M处理器的主要寄存器\t18
2.2 C语言中的构造类型及编译相关问题\t21
2.2.1 C语言中的构造类型\t21
2.2.2 编译相关问题\t25
2.3 实时操作系统内核使用的数据结构\t26
2.3.1 栈与堆\t26
2.3.2 队列\t28
2.3.3 链表\t29
2.4 汇编语言概述\t36
2.4.1 汇编语言格式\t36
2.4.2 常用伪指令简介\t38
2.5 本章小结\t40
第3章 Mbed OS第一个样例工程\t41
3.1 Mbed OS简介\t41
3.2 软件和硬件开发平台\t42
3.2.1 GEC架构简介\t42
3.2.2 硬件平台\t43
3.2.3 软件平台\t44
3.2.4 网上电子资源\t45
3.3 第一个样例工程\t46
3.3.1 样例程序功能\t46
3.3.2 工程框架设计原则\t46
3.3.3 无操作系统的工程框架\t47
3.3.4 Mbed OS的工程框架\t51
3.4 本章小结\t56
第4章 实时操作系统下应用程序的基本要素\t57
4.1 中断的基本概念及处理过程\t57
4.1.1 中断的基本概念\t57
4.1.2 中断处理的基本过程\t58
4.2 时间嘀嗒与延时函数\t60
4.2.1 时间嘀嗒\t60
4.2.2 延时函数\t60
4.3 调度策略\t61
4.3.1 调度基础知识\t61
4.3.2 Mbed OS中使用的调度策略\t62
4.3.3 Mbed OS中的固有线程\t63
4.4 实时操作系统中的功能列表\t64
4.4.1 就绪列表\t64
4.4.2 延时列表\t64
4.4.3 等待列表\t64
4.4.4 条件阻塞列表\t64
4.5 本章小结\t65
第5章 同步与通信的应用方法\t67
5.1 实时操作系统中同步与通信的基本概念\t67
5.1.1 同步的含义与通信手段\t67
5.1.2 同步类型\t68
5.2 事件\t69
5.2.1 事件的含义及应用场合\t69
5.2.2 事件的常用函数\t69
5.2.3 事件的编程举例:通过事件实现中断与线程的通信\t71
5.2.4 事件的编程举例:通过事件实现线程之间的通信\t74
5.3 消息队列\t76
5.3.1 消息队列的含义及应用场合\t76
5.3.2 消息队列的常用函数\t76
5.3.3 消息队列的编程举例\t78
5.4 线程信号\t82
5.4.1 线程信号的含义及应用场合\t82
5.4.2 线程信号的常用函数\t83
5.4.3 线程信号的编程举例\t84
5.5 信号量\t87
5.5.1 信号量的含义及应用场合\t87
5.5.2 信号量的常用函数\t88
5.5.3 信号量的编程举例\t89
5.6 互斥量\t92
5.6.1 互斥量的含义及应用场合\t92
5.6.2 互斥量的常用函数\t94
5.6.3 互斥量的编程举例\t95
5.7 本章小结\t98
第6章 底层硬件驱动构件\t99
6.1 嵌入式构件概述\t99
6.1.1 制作构件的必要性\t99
6.1.2 构件的基本概念\t99
6.1.3 嵌入式开发中构件的分类\t100
6.1.4 构件的基本特征与表达形式\t101
6.2 底层硬件驱动构件设计原则与方法\t102
6.2.1 底层硬件驱动构件设计的基本原则\t102
6.2.2 底层硬件驱动构件设计要点分析\t103
6.2.3 底层硬件驱动构件封装规范概要\t104
6.2.4 封装的前期准备\t105
6.3 底层硬件驱动构件设计举例\t106
6.3.1 GPIO构件\t106
6.3.2 UART构件\t114
6.3.3 Flash构件\t119
6.3.4 ADC构件\t123
6.3.5 PWM构件\t127
6.4 应用构件及软件构件设计实例\t131
6.4.1 应用构件设计实例\t131
6.4.2 软件构件设计实例\t133
6.5 本章小结\t142
第7章 实时操作系统下的程序设计方法\t143
7.1 程序稳定性问题\t143
7.1.1 稳定性的基本要求\t143
7.1.2 看门狗复位与定期复位的应用\t144
7.1.3 临界区的处理\t147
7.2 中断服务程序设计、线程划分及优先级安排问题\t148
7.2.1 中断服务程序设计的基本问题\t148
7.2.2 线程划分的简明方法\t149
7.2.3 线程优先级安排问题\t149
7.3 利用信号量解决并发与资源共享的问题\t150
7.3.1 并发与资源共享的问题\t150
7.3.2 应用实例\t151
7.4 优先级反转问题\t155
7.4.1 优先级反转问题的出现\t155
7.4.2 Mbed OS中避免优先级反转问题的方法\t157
7.5 本章小结\t162
第2篇 原理剖析篇
第8章 理解Mbed OS的启动过程\t165
8.1 芯片启动到main函数之前的运行过程\t165
8.1.1 寻找第一条被执行指令的存放处\t165
8.1.2 通过启动文件理解芯片启动过程\t167
8.2 Mbed OS启动流程概要\t169
8.2.1 相关宏定义及结构体\t169
8.2.2 栈和堆的配置\t176
8.2.3 启动过程概述\t179
8.2.4 如何运行到主线程\t181
8.2.5 启动过程总流程源代码\t182
8.3 深入理解启动过程(一):内核初始化解析\t183
8.3.1 内核初始化准备工作\t183
8.3.2 进入SVC中断服务程序SVC_Handler\t186
8.3.3 实际内核初始化函数\t187
8.3.4 返回流程\t199
8.4 深入理解启动过程(二):创建主线程、启动内核\t200
8.4.1 创建主线程\t201
8.4.2 启动内核\t215
8.4.3 定时器线程函数\t226
8.4.4 消息获取与处理函数\t228
8.4.5 线程延时等待函数\t238
8.5 中断服务程序SVC_Handler详解\t240
8.5.1 SVC_Handler功能概要\t241
8.5.2 SVC_Handler完整流程\t241
8.5.3 SVC_Handler功能分段解析\t243
8.5.4 SVC_Handler完整代码注释\t246
8.6 函数调用关系总结及存储空间分析\t249
8.6.1 启动过程中函数的调用关系总结\t250
8.6.2 启动过程存储空间分析\t253
8.7 本章小结\t257
第9章 理解时间嘀嗒\t259
9.1 时间嘀嗒的建立与使用\t259
9.1.1 SysTick定时器的寄存器\t259
9.1.2 SysTick定时器的初始化\t260
9.1.3 SysTick中断服务程序\t263
9.2 延时函数\t266
9.2.1 线程延时等待函数\t266
9.2.2 线程延时嘀嗒函数\t267
9.2.3 其他时间嘀嗒函数\t269
9.3 延时等待列表工作机制\t271
9.3.1 线程插入延时等待列表函数\t271
9.3.2 从延时等待列表中移除线程的函数\t274
9.3.3 延时函数调度过程实例剖析\t275
9.4 与时间相关的函数\t279
9.4.1 获取系统运行时间函数\t280
9.4.2 日期转时间戳函数\t281
9.4.3 时间戳转日期函数\t283
9.5 本章小结\t286
第10章 理解调度机制\t287
10.1 ARM Cortex-M4的SVC和PendSV中断的调度作用\t287
10.1.1 SVC中断的调度作用\t287
10.1.2 PendSV中断的调度作用\t288
10.1.3 列表分析\t288
10.2 中断服务程序PendSV_Handler剖析\t289
10.2.1 osRtxPendSV _Handler的功能概要\t289
10.2.2 osRtxPendSV_Handler函数源代码解析\t290
10.2.3 跳转到SVC_Context进行上下文切换\t291
10.2.4 PendSV_Handler函数完整代码注释\t291
10.3 PendSV应用举例\t292
10.3.1 PendSV在事件中的应用\t292
10.3.2 PendSV在线程信号中的应用\t296
10.4 本章小结\t300
第11章 理解事件与消息队列\t301
11.1 事件\t301
11.1.1 事件的相关结构体\t301
11.1.2 事件函数深入剖析\t302
11.1.3 事件调度剖析\t307
11.2 消息队列\t311
11.2.1 消息或消息队列结构体\t311
11.2.2 消息队列函数深入剖析\t313
11.2.3 消息队列调度剖析\t318
11.3 本章小结\t322
第12章 理解线程信号、信号量与互斥量\t323
12.1 线程信号\t323
12.1.1 线程操作函数\t323
12.1.2 线程信号函数深入剖析\t329
12.1.3 线程信号调度剖析\t333
12.2 信号量\t337
12.2.1 信号量控制块结构体\t337
12.2.2 信号量函数深入剖析\t337
12.2.3 信号量调度剖析\t341
12.3 互斥量\t345
12.3.1 互斥量结构体\t345
12.3.2 互斥量函数深入剖析\t346
12.3.3 互斥量调度剖析\t352
12.3.4 互斥量避免优先级反转问题调度剖析\t356
12.4 本章小结\t359
第3篇 综合实践篇
第13章 基于Mbed OS的AHL-EORS应用\t363
13.1 AHL-EORS简介\t363
13.1.1 硬件清单\t363
13.1.2 硬件测试导引\t364
13.2 卷积神经网络概述\t364
13.2.1 卷积神经网络的技术特点\t364
13.2.2 卷积神经网络原理\t365
13.3 AHL-EORS选用模型分析\t368
13.3.1 MobileNetV2模型\t369
13.3.2 NCP模型\t370
13.4 AHL-EORS的数据采集与训练过程\t373
13.4.1 数据采集程序\t373
13.4.2 模型训练与部署\t376
13.5 在通用嵌入式计算机GEC上进行的推理过程\t377
13.6 本章小结\t380
第14章 基于Mbed OS的NB-IoT应用开发\t381
14.1 窄带物联网应用开发概述\t381
14.1.1 窄带物联网简介\t381
14.1.2 NB-IoT应用开发所面临的难题及解决思路\t382
14.1.3 直观体验NB-IoT数据传输\t383
14.1.4 金葫芦NB-IoT开发套件简介\t384
14.2 NB-IoT应用架构及通信基本过程\t386
14.2.1 建立NB-IoT应用架构的基本原则\t386
14.2.2 终端UE、信息邮局MPO与人机交互系统HCI的基本定义\t386
14.2.3 基于信息邮局粗略了解基本通信过程\t387
14.3 终端UE与云侦听程序的通信过程\t388
14.3.1 基于mbed的终端UE模板工程设计\t389
14.3.2 云侦听模板工程功能简介\t391
14.3.3 建立云侦听程序的运行场景\t392
14.3.4 运行云侦听与终端UE模板工程\t394
14.3.5 通信过程中的常见错误说明\t396
14.4 通过Web网页的数据访问\t397
14.4.1 运行Web模板观察自己终端UE的数据\t397
14.4.2 NB-IoT的Web网页模板工程结构\t398
14.5 通过微信小程序的数据访问\t399
14.5.1 运行小程序模板观察自己终端UE的数据\t399
14.5.2 NB-IoT的微信小程序模板工程结构\t401
参考文献\t403