第1章 概述 1
1.1 前后台系统 2
1.2 实时内核 3
1.3 RTOS(实时操作系统) 4
1.4 μC/OS-Ⅲ 5
1.5 μC/OS、μC/OS-Ⅱ、μC/OS-Ⅲ特性比较 8
1.6 关于本书 10
1.7 μC/Probe调试软件工具 10
1.8 本书的常用约定 11
1.9 各章内容 11
第2章 目录与文件 14
2.1 应用代码 16
2.2 CPU 17
2.3 板级支持包(BSP) 17
2.4 μC/OS-Ⅲ与CPU无关的源代码 18
2.5 μC/OS-Ⅲ与CPU相关的源代码 21
2.6 μC/CPU与CPU相关的源代码 22
2.7 μC/LIB可移植的库函数 24
2.8 小结 26
第3章 初识μC/OS-Ⅲ 28
3.1 单任务应用程序 28
3.2 有内核对象参与的多任务应用程序 34
第4章 临界段代码 41
4.1 关中断 41
4.1.1 测量中断关闭时间 42
4.2 给调度器上锁 42
4.2.1 测量调度器锁定时间 43
4.3 μC/OS-Ⅲ的某些功能会导致临界段代码长度增加 44
4.4 小结 44
第5章 任务管理 46
5.1 任务优先级的分配 52
5.2 栈空间大小的确定 54
5.3 任务栈溢出检测 55
5.4 任务管理函数 58
5.5 任务管理的内部原理 59
5.5.1 任务状态 59
5.5.2 任务控制块TCB 64
5.6 系统内部任务 74
5.6.1 空闲任务(OS-IdleTask()、os_core.c) 75
5.6.2 时钟节拍任务(OS_TickTask()、os_tick.c) 76
5.6.3 统计任务(OS_StatTask()、os_stat.c) 82
5.6.4 定时任务(OS_TmrTask()、os_tmr.c) 85
5.6.5 中断服务管理任务(OS_IntQTask()、os_int.c) 86
5.7 小结 87
第6章 任务就绪表 88
6.1 优先级 88
6.2 就绪任务列表 92
6.3 向就绪任务列表中增加任务 95
6.4 小结 96
第7章 任务调度 97
7.1 可剥夺型调度 97
7.2 调度点 99
7.3 时间片轮转调度 101
7.4 调度的实现细节 102
7.4.1 OSSched() 103
7.4.2 OSIntExit() 104
7.4.3 OS_SchedRoundRobin() 105
7.5 小结 106
第8章 任务切换 107
8.1 OSCtxSw() 109
8.2 OSIntCtxSw() 111
8.3 小结 113
第9章 中断管理 114
9.1 CPU的中断处理 115
9.2 典型的μC/OS-Ⅲ中断服务程序 115
9.3 无需内核参与的中断服务程序 118
9.4 多中断优先级的处理器 118
9.5 所有中断源共用中断服务程序 120
9.6 每个中断源都有专用中断服务程序 121
9.7 直接发布和延迟发布 122
9.7.1 直接发布 122
9.7.2 延迟发布 124
9.8 直接发布模式和延迟发布模式的对比 126
9.9 时钟节拍(或系统节拍) 127
9.10 小结 129
第10章 任务挂起表 130
10.1 小结 134
第11章 时间管理 135
11.1 OSTimeDly() 135
11.2 OSTimeDlyHMSM() 139
11.3 OSTimeDlyResume() 141
11.4 OSTimeSet()和OSTimeGet() 142
11.5 OSTimeTick() 142
11.6 小结 142
第12章 定时器管理 143
12.1 单次定时器 144
12.2 周期定时器(无初始延迟) 145
12.3 周期定时器(有初始延迟) 146
12.4 定时器管理内部机制 147
12.4.1 定时器管理内部机制——定时器状态 147
12.4.2 定时器管理内部机制——os_tmr 148
12.4.3 定时器管理内部机制——定时器任务 149
12.4.4 定时器管理内部机制——定时器列表 151
12.5 小结 156
第13章 资源管理 157
13.1 关中断/开中断 159
13.2 给调度器上锁/开锁 160
13.3 信号量 161
13.3.1 二进制信号量 162
13.3.2 计数型信号量 168
13.3.3 使用信号量的注意事项 170
13.3.4 (用来共享资源的)信号量内部结构 170
13.3.5 优先级反转 174
13.4 互斥型信号量(MUTEX) 176
13.4.1 互斥型信号量的内部结构 180
13.5 何时可以用普通信号量替代互斥型信号量 184
13.6 死锁(或抱死) 184
13.7 小结 187
第14章 任务同步 189
14.1 信号量 189
14.1.1 单向同步 190
14.1.2 信用记录 193
14.1.3 多个任务等待同一个信号量 194
14.1.4 信号量的内部结构(以同步为目的) 195
14.2 任务信号量 200
14.2.1 等待任务信号量 201
14.2.2 发布任务信号量 202
14.2.3 双向同步 203
14.3 事件标志组 205
14.3.1 使用事件标志 206
14.3.2 事件标志的内部结构 210
14.4 与多任务同步 215
14.5 小结 216
第15章 消息传递 217
15.1 消息 217
15.2 消息队列 218
15.3 任务内建的消息队列 219
15.4 双向同步 220
15.5 流量控制 221
15.6 保持数据的可见性 223
15.7 使用消息队列 224
15.8 客户端和服务器 231
15.9 消息队列内部的细节 232
15.10 小结 235
第16章 同时等待多个内核对象 236
16.1 小结 242
第17章 存储管理 243
17.1 创建存储分区 244
17.2 从分区中获得存储块 247
17.3 将存储块归还到分区中 248
17.4 使用存储分区 249
17.5 小结 251
第18章 移植μC/OS-Ⅲ 252
18.1 约定 254
18.2 μC/CPU 255
18.2.1 CPU_BSP.H 256
18.2.2 CPU_DEF.H 256
18.2.3 CPU_CFG.H 256
18.2.4 CPU_CORE.C 257
18.2.5 CPU_CORE.H 258
18.2.6 CPU.H 258
18.2.7 CPU_C.C 261
18.2.8 CPU_A.ASM 261
18.3 μC/OS-Ⅲ移植 262
18.3.1 OS_CPU.H 263
18.3.2 OS_CPU_C.C 264
18.3.3 OS_CPU_A.ASM 270
18.3.4 OS_CPU_A.INC 275
18.4 板级支持包(BSP) 278
18.4.1 BSP.C和BSP.H 279
18.4.2 BSP_INT.C和BSP_INT.H 280
18.5 移植的测试 281
18.5.1 创建一个简单的测试工程 281
18.5.2 验证任务级任务切换 285
18.5.3 验证中断级任务切换 290
18.6 小结 293
第19章 程序运行时的各类统计信息 295
19.1 程序运行时的总体统计信息 295
19.2 程序运行时每个任务的统计信息 299
19.3 程序运行时和内核对象相关的统计信息 302
19.4 OS_DBG.C——编译时(静态)的统计信息 305
19.5 OS_CFG_APP.C——编译时(静态)的统计信息 316
19.6 小结 318
附录A μC/OS-Ⅲ API参考手册 319
A.1 任务管理 319
A.2 时间管理 321
A.3 互斥型信号量——资源管理 321
A.4 事件标志组——同步 322
A.5 信号量——同步 323
A.6 任务信号量——同步 324
A.7 消息队列——消息传递 325
A.8 任务消息队列——消息传递 326
A.9 等待多个对象 327
A.10 定时器 328
A.11 固定大小的存储分区——存储管理 329
A.12 OSCtxSw() 330
A.13 OSFlagCreate() 331
A.14 OSFlagDel() 333
A.15 OSFlagPend() 334
A.16 OSFlagPendAbort() 337
A.17 OSFlagPendGetFlagsRdy() 339
A.18 OSFlagPost() 341
A.19 OSIdleTaskHook() 343
A.20 OSInit() 344
A.21 OSInitHook() 348
A.22 OSIntCtxSw() 349
A.23 OSIntEnter() 350
A.24 OSIntExit() 351
A.25 OSMemCreate() 352
A.26 OSMemGet() 354
A.27 OSMemPut() 356
A.28 OSMutexCreate() 357
A.29 OSMutexDel() 359
A.30 OSMutexPend() 360
A.31 OSMutexPendAbort() 363
A.32 OSMutexPost() 365
A.33 OSPendMulti() 367
A.34 OSQCreate() 370
A.35 OSQDel() 372
A.36 OSQFlush() 374
A.37 OSQPend() 376
A.38 OSQPendAbort() 379
A.39 OSQPost() 381
A.40 OSSafetyCriticalStart() 384
A.41 OSSched() 384
A.42 OSSchedLock() 386
A.43 OSSchedRoundRobinCfg() 387
A.44 OSSchedRoundRobinYield() 388
A.45 OSSchedUnlock() 389
A.46 OSSemCreate() 390
A.47 OSSemDel() 392
A.48 OSSemPend() 394
A.49 OSSemPendAbort() 397
A.50 OSSemPost() 399
A.51 OSSemSet() 401
A.52 OSStart() 402
A.53 OSStartHighRdy() 403
A.54 OSStatReset() 404
A.55 OSStatTaskCPUUsageInit() 405
A.56 OSStatTaskHook() 406
A.57 OSTaskChangePrio() 407
A.58 OSTaskCreate() 409
A.59 OSTaskCreateHook() 418
A.60 OSTaskDel() 419
A.61 OSTaskDelHook() 421
A.62 OSTaskQFlush() 422
A.63 OSTaskQPend() 424
A.64 OSTaskQPendAbort() 427
A.65 OSTaskQPost() 429
A.66 OSTaskRegGet() 431
A.67 OSTaskRegSet() 432
A.68 OSTaskReturnHook() 434
A.69 OSTaskResume() 436
A.70 OSTaskSemPend() 437
A.71 OSTaskSemPendAbort() 440
A.72 OSTaskSemPost() 441
A.73 OSTaskSemSet() 443
A.74 OSStatTaskHook() 444
A.75 OSTaskStkChk() 445
A.76 OSTaskStkInit() 447
A.77 OSTaskSuspend() 451
A.78 OSTaskSwHook() 452
A.79 OSTaskTimeQuantaSet() 454
A.80 OSTickISR() 456
A.81 OSTimeDly() 457
A.82 OSTimeDlyHMSM() 459
A.83 OSTimeDlyResume() 461
A.84 OSTimeGet() 463
A.85 OSTimeSet() 464
A.86 OSTimeTick() 465
A.87 OSTimeTickHook() 465
A.88 OSTmrCreate() 467
A.89 OSTmrDel() 472
A.90 OSTmrRemainGet() 473
A.91 OSTmrStart() 475
A.92 OSTmrStateGet() 476
A.93 OSTmrStop() 478
A.94 OSVersion() 480
附录B μC/OS-Ⅲ配置手册 481
B.1 μC/OS-Ⅲ的功能(os_cfg.h) 483
B.2 μC/OS-Ⅲ的数据类型(os_type.h) 492
B.3 μC/OS-Ⅲ的堆栈、池和其他数据类型(os_cfg_app.h) 493
附录C 从μC/OS-Ⅱ迁移到μC/OS-Ⅲ 497
C.1 源文件名称和内容的差异 498
C.2 编程约定的变化 501
C.3 变量名称的变化 506
C.4 API的变化 507
C.4.1 事件标志 507
C.4.2 消息邮箱 509
C.4.3 存储管理 511
C.4.4 互斥型信号量 513
C.4.5 消息队列 514
C.4.6 信号量 516
C.4.7 任务管理 518
C.4.8 时间管理 523
C.4.9 定时器管理 524
C.4.10 其他 526
C.4.11 介入函数与系统移植 528
附录D MISRA-C:2004和μC/OS-Ⅲ 531
D.1 MISRA-C:2004,规则8.5(强制) 531
D.2 MISRA-C:2004,规则8.12(强制) 532
D.3 MISRA-C:2004,规则14.7(强制) 532
D.4 MISRA-C:2004,规则15.2(强制) 533
D.5 MISRA-C:2004,规则17.4(强制) 534
附录E 参考文献 535
附录F μC/OS-Ⅲ许可政策 536