第1章 嵌入式系统导论 1
1.1 嵌入式系统概述 1
1.1.1 嵌入式系统的发展概况 1
1.1.2 嵌入式系统的定义 3
1.1.3 嵌入式系统的特点 4
1.2 嵌入式系统的组成结构 5
1.2.1 硬件层 5
1.2.2 软件结构 8
1.2.3 硬件抽象层 9
1.3 嵌入式系统的基本设计方法 10
1.3.1 总体设计 10
1.3.2 软/硬件详细设计 13
1.3.3 系统集成 13
1.3.4 系统测试 13
1.4 嵌入式操作系统概述 13
1.4.1 嵌入式操作系统的发展历程 13
1.4.2 嵌入式实时操作系统的定义 14
1.4.3 评价嵌入式操作系统的几个重要指标 16
1.4.4 嵌入式实时操作系统的特点 17
1.4.5 嵌入式操作系统的分类 19
1.4.6 通用操作系统与嵌入式操作系统的区别 19
1.5 μC/OS-Ⅱ操作系统概述 21
1.5.1 μC/OS-Ⅱ的特点 21
1.5.2 μC/OS-Ⅱ内核文件组成 22
1.5.3 如何学好μC/OS-Ⅱ 23
1.5.4 实例 23
习题 25
第2章 嵌入式操作系统中的基本概念 26
2.1 前后台系统 26
2.2 调度 27
2.3 临界区 27
2.4 进程与线程 27
2.4.1 进程的概念 27
2.4.2 线程的概念 28
2.5 任务与多任务 28
2.6 任务切换 29
2.7 死锁 30
2.8 不可剥夺型内核 30
2.9 可剥夺型内核 31
2.10 可重入性 32
2.11 优先级反转 33
2.12 事件 35
2.12.1 信号量 35
2.12.2 消息邮箱 36
2.12.3 消息队列 36
2.12.4 事件标志组 37
2.13 互斥 38
2.13.1 禁止中断 38
2.13.2 禁止抢占 39
2.13.3 信号量 39
2.13.4 测试并置位 40
2.14 同步 40
2.15 通信 41
2.16 对存储器的要求 41
2.16.1 代码存储器的需求 41
2.16.2 数据存储器的需求 41
习题 42
第3章 任务管理 43
3.1 核心函数 43
3.1.1 临界区的处理 43
3.1.2 任务的形式 44
3.1.3 任务的状态 46
3.1.4 任务控制块 46
3.1.5 就绪表 49
3.1.6 任务的调度 52
3.1.7 任务级的任务切换 53
3.1.8 调度器上锁和开锁 56
3.1.9 空闲任务 57
3.1.10 统计任务 58
3.1.11 μC/OS-Ⅱ的初始化 60
3.1.12 μC/OS-Ⅱ的启动 62
3.2 任务管理函数 64
3.2.1 任务栈 65
3.2.2 建立任务——OSTaskCreate() 67
3.2.3 建立任务——OSTaskCreateExt() 70
3.2.4 优先级变更——OSTaskChangePrio() 73
3.2.5 删除任务——OSTaskDel() 76
3.2.6 请求删除任务——OSTaskDelReq() 79
3.2.7 堆栈检验——OSTaskStkChk() 81
3.2.8 任务挂起——OSTaskSuspend() 85
3.2.9 任务恢复——OSTaskResume() 87
3.2.10 任务信息的获取——OSTaskQuery() 89
3.3 部分其它系统服务功能 91
习题 91
第4章 中断处理与时间管理 92
4.1 中断处理的基本概念 92
4.1.1 中断 92
4.1.2 中断延迟 92
4.1.3 中断响应 93
4.1.4 中断恢复时间 93
4.1.5 中断延迟、响应和恢复时间的比较 94
4.1.6 非屏蔽中断 94
4.2 μC/OS-Ⅱ的中断处理 95
4.2.1 中断处理程序 95
4.2.2 中断处理过程 97
4.3 μC/OS-Ⅱ的时钟节拍 98
4.3.1 时钟节拍 98
4.3.2 时钟节拍程序 101
4.3.3 时钟节拍器的正确用法 102
4.4 μC/OS-Ⅱ的时间管理 103
4.4.1 任务延时函数——OSTimeDly() 103
4.4.2 按时、分、秒、毫秒延时函数——OSTimeDlyHMSM() 105
4.4.3 让处在延时期的任务结束延时函数——OSTimeDlyResume() 107
4.4.4 系统时间函数——OSTimeGet()和OSTimeSet() 108
习题 109
第5章 事件控制块 110
5.1 基本概念 110
5.2 将任务置于等待事件的任务列表中 112
5.3 从等待事件的任务列表中使任务脱离等待状态 113
5.4 在等待事件的任务列表中查找优先级最高的任务 113
5.5 空余事件控制块链表 115
5.5.1 基本概念 115
5.5.2 对事件控制块的基本操作 115
5.6 初始化事件控制块——OSEventWaitListInit() 116
5.6.1 函数原型 116
5.6.2 源代码 116
5.7 使任务进入就绪态——OSEventTaskRdy() 117
5.7.1 函数原型 117
5.7.2 实现算法 117
5.7.3 源代码 118
5.8 使任务进入等待某事件发生状态——OSEventTaskWait() 119
5.8.1 函数原型 119
5.8.2 算法及源代码 119
5.9 由于等待超时而将任务置为就绪态——OSEventTO() 119
5.9.1 函数原型 119
5.9.2 源代码 120
习题 120
第6章 消息 121
6.1 消息邮箱管理 121
6.1.1 概述 121
6.1.2 建立消息邮箱——OSMboxCreate() 123
6.1.3 删除消息邮箱——OSMboxDel() 125
6.1.4 等待消息邮箱中的消息——OSMboxPend() 127
6.1.5 发送消息到消息邮箱中——OSMboxPost() 130
6.1.6 发送消息到消息邮箱中——OSMboxPostOpt() 133
6.1.7 无等待地从消息邮箱中得到消息——OSMboxAccept() 135
6.1.8 查询消息邮箱的状态——OSMboxQuery() 137
6.2 消息队列管理 139
6.2.1 概述 139
6.2.2 实现消息队列所需要的各种数据结构 141
6.2.3 建立消息队列——OSQCreate() 143
6.2.4 删除消息队列——OSQDel() 145
6.2.5 等待消息队列中的消息——OSQPend() 148
6.2.6 向消息队列发送(FIFO)消息——OSQPost() 151
6.2.7 向消息队列发送(LIFO)消息——OSQPostFront() 153
6.2.8 以可选方式(FIFO或LIFO)向消息队列发送消息——OSQPostOpt() 155
6.2.9 无等待地从消息队列中取得消息——OSQAccept() 158
6.2.10 清空消息队列——OSQFlush() 159
6.2.11 查询消息队列的状态——OSQQuery() 160
习题 162
第7章 信号量与互斥信号量 163
7.1 信号量 163
7.1.1 概述 163
7.1.2 建立信号量——OSSemCreate() 165
7.1.3 删除信号量——OSSemDel() 167
7.1.4 等待信号量——OSSemPend() 169
7.1.5 发送信号量——OSSemPost() 171
7.1.6 无等待地请求信号量——OSSemAccept() 173
7.1.7 查询信号量的当前状态——OSSemQuery() 174
7.2 互斥信号量 177
7.2.1 概述 177
7.2.2 建立互斥信号量——OSMutexCreate() 178
7.2.3 删除互斥信号量——OSMutexDel() 181
7.2.4 等待互斥信号量——OSMutexPend() 183
7.2.5 释放互斥信号量——OSMutexPost() 186
7.2.6 无等待地获取互斥信号量——OSMutexAccept() 190
7.2.7 获取当前互斥信号量的状态——OSMutexQuery() 192
习题 194
第8章 事件标志组 195
8.1 概述 195
8.1.1 事件标志组的组成及管理函数 195
8.1.2 事件标志组管理函数的配置常量 195
8.1.3 实现事件标志组所需要的数据结构 196
8.2 建立事件标志组——OSFlagCreate() 197
8.2.1 函数原型 197
8.2.2 返回值 198
8.2.3 源代码 198
8.3 等待事件标志组中的事件标志位——OSFlagPend() 199
8.3.1 函数原型 199
8.3.2 返回值 199
8.3.3 源代码 199
8.4 置位或者清零事件标志组中的事件标志——OSFlagPost() 203
8.4.1 函数原型 203
8.4.2 返回值 204
8.4.3 源代码 204
8.4.4 范例 206
8.5 删除事件标志组——OSFlagDel() 207
8.5.1 函数原型 207
8.5.2 返回值 208
8.5.3 源代码 208
8.5.4 范例 210
8.6 无等待地获得事件标志组中的事件标志——OSFlagAccept() 210
8.6.1 函数原型 210
8.6.2 源代码 211
8.7 查询事件标志组的状态——OSFlagQuery() 213
8.7.1 函数原型 213
8.7.2 返回值 213
8.7.3 源代码 213
8.7.4 范例 214
习题 214
第9章 内存管理 215
9.1 概述 215
9.1.1 基本原理 215
9.1.2 内存管理函数 216
9.1.3 内存管理函数的配置常量 216
9.1.4 内存控制块 216
9.2 建立内存分区——OSMemCreate() 217
9.2.1 函数原型 217
9.2.2 源代码 218
9.2.3 范例 220
9.3 分配内存块——OSMemGet() 220
9.3.1 函数原型 220
9.3.2 注意事项 221
9.3.3 源代码 221
9.3.4 范例 222
9.4 释放内存块——OSMemPut() 222
9.4.1 函数原型 222
9.4.2 返回值 222
9.4.3 注意事项 223
9.4.4 源代码 223
9.4.5 范例 224
9.5 查询内存分区的状态——OSMemQuery() 224
9.5.1 函数原型 224
9.5.2 返回值 225
9.5.3 源代码 225
9.5.4 范例 226
习题 226
第10章 μC/OS-Ⅱ的移植与应用 227
10.1 移植的基本方法 227
10.1.1 移植的概念与一般要求 227
10.1.2 OS_CPU.H代码的移植 229
10.1.3 OS_CPU_C.C代码的移植 231
10.1.4 OS_CPU_A.ASM代码的移植 234
10.1.5 移植代码的测试 236
10.2 基于MCS-51单片机的移植实例 237
10.2.1 OS_CPU.H代码的移植 237
10.2.2 OS_CPU_C.C代码的移植 238
10.2.3 OS_CPU_A.ASM代码的移植 238
10.3 基于ARM处理器的移植实例 245
10.3.1 移植规划 245
10.3.2 OS_CPU.H代码的移植 245
10.3.3 OS_CPU_C.C代码的移植 246
10.3.4 OS_CPU_A.ASM代码的移植 248
10.4 基于MCS-51单片机的应用实例 261
10.4.1 设计目标 261
10.4.2 总体设计 261
10.4.3 程序详细设计 263
10.5 基于ARM处理器的应用实例 272
习题 276
第11章 μC/OS-Ⅱ几个版本的区别 277
11.1 μC/OS-Ⅱ V2.52与V2.62的区别 277
11.2 μC/OS-Ⅱ V2.62与V2.76的区别 278
11.3 μC/OS-Ⅱ V2.76与V2.83的区别 279
附录 函数与配置常量一览表 280
参考文献 283