第1章 嵌入式实时操作系统 1
1.1 介绍 1
1.2 何谓嵌入式系统 1
1.3 嵌入式系统的特征 2
1.4 实时系统 2
1.5 实时操作系统和实时内核 2
1.6 进程、任务和线程 3
1.7 实时系统的系统结构 4
1.8 嵌入式系统的开发 5
1.9 关键词和术语 5
第2章 初步了解使用RTOS的系统 7
2.1 操作环境 7
2.2 ThreadX演示系统的安装 7
2.3 包含两个线程的演示系统 7
2.4 创建线程对象 9
2.5 编译并执行示例系统 11
2.6 系统和输出结果的分析 11
2.7 02_sample_system.c代码清单 12
2.8 关键词和术语 17
2.9 问题 18
第3章 RTOS概念和定义 19
3.1 介绍 19
3.2 优先级 19
3.3 就绪线程和挂起线程 20
3.4 占先,基于优先级的调度 21
3.5 轮转调度 21
3.6 确定性 22
3.7 内核 22
3.8 RTOS 22
3.9 上下文切换 23
3.10 时间片轮转 23
3.11 中断处理 23
3.12 线程饥饿 23
3.13 优先级翻转 24
3.14 优先级继承 24
3.15 抢占阀值 25
3.16 关键词和术语 25
3.17 问题 26
第4章 用于系统开发的基本RTOS组件 27
4.1 介绍 27
4.2 定义公共资源 27
4.3 ThreadX数据类型 28
4.4 线程 28
4.5 内存池 29
4.6 应用定时器 31
4.7 互斥量 31
4.8 计数信号量 32
4.9 事件标志组 33
4.10 消息队列 33
4.11 线程同步和通信组件总结 34
4.12 关键词和术语 35
4.13 问题 36
第5章 ARM微处理器简介 37
5.1 介绍 37
5.2 历史 37
5.3 技术特征 38
5.3.1 兼容片上系统 38
5.3.2 低功耗 39
5.3.3 改进的代码密度 39
5.3.4 多样化的寄存器 39
5.3.5 CPSR的定义 41
5.3.6 处理器模式 42
5.4 ARM对节能的支持 43
5.5 关键词和术语 43
第6章 线程 45
6.1 介绍 45
6.2 线程控制块 45
6.3 线程调用综述 46
6.4 创建线程 47
6.5 删除线程 52
6.6 识别线程 53
6.7 获取线程信息 53
6.8 改变抢占门限 54
6.9 改变优先级 54
6.10 放弃执行 55
6.11 恢复线程执行 55
6.12 线程睡眠 55
6.13 挂起线程 56
6.14 中止线程 56
6.15 改变时间片 56
6.16 中止线程等待 57
6.17 线程执行综述 57
6.18 线程状态 58
6.19 线程设计 59
6.19.1 最小化线程的数量 60
6.19.2 谨慎设置优先级 60
6.19.3 最小化优先级的数目 60
6.19.4 考虑使用抢占门限 60
6.19.5 考虑优先级继承 61
6.19.6 考虑轮转调度方式 61
6.19.7 考虑时间片 61
6.20 线程内部结构 61
6.21 总结 62
6.22 关键词和术语 63
6.23 问题 64
第7章 互斥量 66
7.1 介绍 66
7.2 保护临界区 66
7.3 提供对共享资源的互斥访问 67
7.4 互斥量控制块 67
7.5 互斥量服务综述 68
7.6 创建一个互斥量 68
7.7 删除一个互斥量 69
7.8 申请互斥量 69
7.9 获取互斥量信息 70
7.10 按优先级调整挂起队列 71
7.11 释放一个信号量 71
7.12 避免死锁 72
7.13 用互斥量保护临界区的示例程序 73
7.14 示例程序的输出 78
7.15 07_sample_system.c代码清单 80
7.16 互斥量内部结构 85
7.17 总结 86
7.18 关键词和术语 86
7.19 问题 87
第8章 内存管理:字节池和块池 88
8.1 介绍 88
8.2 内存字节池概述 88
8.3 内存字节池控制块 89
8.4 内存字节池的缺陷 90
8.5 内存字节池服务概述 91
8.6 创建内存字节池 91
8.7 从内存字节池中分配内存 92
8.8 删除内存字节池 92
8.9 获取内存字节池信息 93
8.10 优先排列内存字节池挂起列表 93
8.11 释放内存到内存字节池 94
8.12 内存字节池例程——分配线程堆栈 94
8.13 内存字节池内部机制 95
8.14 内存块池概述 97
8.15 内存块池控制块 98
8.16 内存块池服务概述 98
8.17 创建内存块池 99
8.18 从内存块池中分配内存 100
8.19 删除内存块池 100
8.20 获取内存块池信息 101
8.21 优先排列内存块池挂起列表 102
8.22 释放内存块 102
8.23 内存块池例程——分配线程堆栈 103
8.24 内存块池内部机制 104
8.25 总结和对比 104
8.26 关键词和术语 105
8.27 问题 105
第9章 内部系统时钟和应用定时器 107
9.1 介绍 107
9.2 内部系统时钟服务 108
9.3 应用定时器控制块 109
9.4 应用定时器服务概述 110
9.5 创建应用定时器 110
9.6 启动应用定时器 111
9.7 修改应用定时器 112
9.8 停止应用定时器 112
9.9 删除应用定时器 113
9.10 获取应用定时器信息 113
9.11 使用定时器测量线程性能的例程 114
9.12 09_sample_system.c代码清单 117
9.13 应用定时器内部机制 123
9.14 总结 124
9.15 关键词和术语 124
9.16 问题 125
第10章 事件通知和利用信号量同步线程 127
10.1 介绍 127
10.2 计数信号量控制块 128
10.3 避免死锁 129
10.4 防止优先级倒置 129
10.5 信号量服务综述 129
10.6 创建一个信号量 129
10.7 删除一个信号量 130
10.8 从信号量申请一个实例 131
10.9 获取信号量的信息 131
10.10 按优先级调整信号量的挂起队列 132
10.11 向信号量放入一个实例 132
10.12 对比信号量和互斥量 133
10.13 使用二进制信号量代替互斥量的示例程序 134
10.14 10a_sample_system.c代码清单 135
10.15 在生产者—消费者程序中使用信号量的例子 142
10.16 10b_sample_system.c代码清单 144
10.17 信号量内部结构 150
10.18 总结 151
10.19 关键词和术语 151
10.20 问题 152
第11章 用事件标志组同步线程 153
11.1 介绍 153
11.2 事件标志组控制块 154
11.3 事件标志组服务综述 155
11.4 创建一个组 155
11.5 删除一个组 156
11.6 等待组中的标志被置位 156
11.7 获取组的信息 159
11.8 设置组中的事件标志 159
11.9 使用事件标志组同步两个线程的示例系统 161
11.10 11_sample_system.c代码清单 164
11.11 事件标志组内部结构 170
11.12 总结 171
11.13 关键词和术语 171
11.14 问题 172
第12章 使用消息队列进行线程通信 173
12.1 介绍 173
12.2 消息队列控制块 174
12.3 消息队列服务函数的概要 175
12.4 创建消息队列 176
12.5 向消息队列发送消息 176
12.6 从消息队列中获取消息 177
12.7 删除消息队列 178
12.8 清除消息队列中的内容 178
12.9 向消息队列头发送消息 179
12.10 检索消息队列信息 179
12.11 将消息队列挂起列表以优先顺序排列 180
12.12 使用消息队列作为线程间通信的示例系统 181
12.13 12_sample_system.c代码清单 184
12.14 消息队列的内部 190
12.15 总结 191
12.16 关键词和术语 192
12.17 问题 192
第13章 ARM异常处理 193
13.1 介绍 193
13.2 ThreadX对ARM异常处理的实现 194
13.2.1 复位向量的初始化 194
13.2.2 线程的调度 196
13.2.3 ThreadX中断处理 199
13.2.4 内部中断处理 201
13.3 关键词和术语 203
第14章 案例分析:设计一个多线程系统 204
14.1 介绍 204
14.2 问题的描述 205
14.3 问题的分析 207
14.4 系统的设计 209
14.4.1 线程设计 209
14.4.2 公共资源设计 210
14.5 实现 213
14.6 VAM System代码清单 226
14.7 总结 237
附录 239
附录A 内存块池服务 241
附录B 内存字节池服务 249
附录C 事件标志组服务 257
附录D 中断控制服务 265
附录E 互斥量服务 267
附录F 消息队列服务函数 275
附录G 信号量服务 287
附录H 线程服务 295
附录I 内部系统时钟服务 313
附录J 应用定时器服务 315
附录K ThreadX API 323