第1部分 状态图
第1章 量子编程的快速浏览
1.1 终结钩子——GUI应用程序的剖析2
1.2 程序设计的更好办法——一个计算器的工作5
1.2.1 传统的事件动作范型的缺点5
1.2.2 计算器状态图7
1.2.3 同Windows集成11
1.2.4 状态处理器方法13
1.3 面向对象相似性15
1.3.1 状态层次和类分类学15
1.3.2 进入/退出状态和初始化/结束类16
1.3.3 按差异编程16
1.3.4 行为继承作为基本的元模式16
1.3.5 状态模式17
1.3.6 重构状态模型17
1.3.7 超越面向对象编程18
1.4 量子类比18
1.5 小结18
第2章 状态图速成
2.1 有限状态机的本质20
2.1.1 状态21
2.1.2 扩展状态21
2.1.3 监测器22
2.1.4 事件23
2.1.5 动作和转换23
2.1.6 Mealy和Moore自动机24
2.1.7 执行模型——RTC步24
2.1.8 状态转换图25
2.2 UML状态图的本质26
2.2.1 层次式状态26
2.2.2 行为继承28
2.2.3 正交区域29
2.2.4 进入和退出动作30
2.2.5 转换执行序列32
2.2.6 内部转换33
2.2.7 伪状态33
2.2.8 细化事件处理34
2.2.9 语义与表示法34
2.2.10 状态图和流程图35
2.2.11 状态图与自动代码综合36
2.3 状态模型的例子37
2.3.1 量子计算器37
2.3.2 氢原子41
2.4 小结44
第3章 标准状态机实现
3.1 状态机接口46
3.2 嵌套的switch语句48
3.3 状态表51
3.4 状态设计模式56
3.5 优化的FSM实现60
3.6 状态机和C 异常处理64
3.7 成员函数指针的作用65
3.8 实现监测器. 接合和选择点66
3.9 实现进入和退出动作67
3.10 处理状态层次68
3.11 小结69
第4章 实现行为继承
4.1 结构71
4.1.1 事件74
4.1.2 状态76
4.1.3 进入/退出动作和初始转换77
4.1.4 状态转换79
4.1.5 top状态和初始伪状态80
4.2 一个注释性例子81
4.2.1 枚举信号和子类构作QHsm82
4.2.2 定义状态处理器方法83
4.2.3 初始化和分发事件86
4.2.4 测试运行87
4.3 试探和约定89
4.3.1 构建状态机代码89
4.3.2 选择正确的信号粒度91
4.3.3 UML一致的HSM91
4.4 事件处理器93
4.4.1 初始化状态机:init()方法93
4.4.2 分发事件:dispatch()方法95
4.4.3 静态和动态状态转换:宏Q_TRAN和Q_TRAN_DYN()96
4.4.4 动态状态转换:tran()方法97
4.4.5 静态状态转换:tranStat()方法和Tran类102
4.4.6 初始化QTran对象:tranSetup()方法104
4.5 C实现107
4.5.1 用“C ”的QHsm类107
4.5.2 QHsm构造函数与析构函数109
4.5.3 状态处理器方法和成员函数指针109
4.5.4 QHsm方法110
4.5.5 用C的状态图例子110
4.6 防止误解的说明113
4.7 小结115
第5章 状态模式
5.1 终结钩子118
5.1.1 目的118
5.1.2 问题118
5.1.3 解决办法118
5.1.4 样例代码119
5.1.5 结论121
5.2 提示法122
5.2.1 目标122
5.2.2 问题122
5.2.3 解决办法122
5.2.4 样例代码123
5.2.5 结论127
5.3 延迟事件128
5.3.1 目的128
5.3.2 问题128
5.3.3 解决办法128
5.3.4 样例代码130
5.3.5 结论133
5.4 正交构件133
5.4.1 目的133
5.4.2 问题133
5.4.3 解决办法134
5.4.4 样例代码135
5.4.5 结论141
5.5 转换到历史143
5.5.1 目的143
5.5.2 问题143
5.5.3 解决办法143
5.5.4 样例代码143
5.5.5 结论147
5.6 小结147
第6章 继承状态模型
6.1 用C 的状态图细化的例子149
6.2 用C的状态图细化举例157
6.2.1 为多态性准备C 状态机157
6.2.2 继承和细化C 状态机159
6.3 防止误解的说明160
6.3.1 静态与动态状态转换的比较161
6.3.2 多重继承161
6.3.3 继承和细化状态图的探索163
6.4 小结165
第2部分 量子框架
第7章 量子框架介绍
7.1 传统多线程方法170
7.1.1 就餐哲学家——传统方法171
7.1.2 Therac25的故事174
7.2 QF的计算模型175
7.2.1 基于活动对象的多线程176
7.2.2 量子类比177
7.2.3 出版订阅事件交付179
7.2.4 通用结构180
7.2.5 重访就餐哲学家问题180
7.3 QF的角色183
7.3.1 概念完整的源泉184
7.3.2 RTOS抽象层185
7.3.3 软件总线186
7.3.4 高度并行计算平台187
7.3.5 自动代码生成的基础188
7.4 小结189
第8章 量子框架的设计
8.1 嵌入式实时系统190
8.2 处理错误和异常条件192
8.2.1 按契约设计194
8.2.2 基于状态的异常条件处理197
8.3 内存管理198
8.3.1 堆问题199
8.3.2 QF中的内存管理201
8.4 互斥和阻塞203
8.4.1 互斥的危险203
8.4.2 基于活动对象的系统中的阻塞206
8.5 传送事件207
8.5.1 动态事件分配209
8.5.2 出版订阅模型212
8.5.3 组播事件217
8.5.4 自动事件回收219
8.6 活动对象220
8.6.1 内部状态机220
8.6.2 事件队列221
8.6.3 执行线程222
8.7 初始化和清除224
8.7.1 初始化框架224
8.7.2 启动QF应用225
8.7.3 优美地终结QF应用226
8.8 时间管理226
8.8.1 QTimer类227
8.8.2 时钟节拍, QF::tick 方法228
8.9 QF API快速参考229
8.9.1 QF接口229
8.9.2 QActive接口231
8.9.3 QTimer接口232
8.10 小结233
第9章 量子框架的实现
9.1 作为一个Parnas家族的QF235
9.2 代码组织236
9.2.1 目录结构238
9.2.2 公共范围头文件240
9.2.3 包范围头文件241
9.3 公共元素242
9.3.1 临界区242
9.3.2 事件池243
9.3.3 事件队列247
9.4 DOS:不具备多任务内核的QF253
9.4.1 前台/后台处理253
9.4.2 使用QF的前台/后台254
9.4.3 DOS特定的代码258
9.4.4 QF给前台/后台系统带来的益处260
9.5 Win32:桌面上的QF261
9.5.1 临界区. 事件队列和执行线程261
9.5.2 时钟节拍264
9.6 RTKernel32:带有一个基于优先级的可抢占内核的QF266
9.6.1 临界区和事件池266
9.6.2 事件队列和执行线程269
9.6.3 RTKernel32的初始化和时钟节拍271
9.6.4 使用RTKernel32进行交叉开发272
9.7 小结273
第10章 量子框架应用实例
10.1 产生一个QF应用274
10.1.1 信号和事件275
10.1.2 Table活动对象277
10.1.3 Philosopher活动对象280
10.1.4 配置DPP282
10.1.5 注解283
10.2 开发QF应用的规则284
10.3 开发QF应用的启发286
10.4 划分事件队列和事件池的大小287
10.4.1 事件队列287
10.4.2 事件池290
10.5 系统集成290
10.6 小结291
第11章 结束语
11.1 QP的关键元素292
11.1.1 是一个设计类型, 而不是工具293
11.1.2 是一个建模助手293
11.1.3 是一个学习上的助手294
11.1.4 是一个有用的隐喻295
11.2 QP的建议296
11.2.1 量子编程语言296
11.2.2 未来的RTOS297
11.2.3 硬件/软件协同设计297
11.3 一个邀请298
附录A C ——用C作面向对象编程
A.1 抽象301
A.2 继承303
A.3 多态性305
A.4 费用和额外开销312
A.5 小结313
附录B 表示法指南
B.1 类图315
B.2 状态图317
B.3 顺序图318
B.4 时序图318
附录C CDROM
C.1 源代码结构321
C.2 安装321
C.2.1 源代码321
C.2.2 OnTime RTOS32评估套件321
C.2.3 Adobe Acrobat Reader322
C.3 练习的答案322
C.4 资源323
参考文献324