Practical UML Statecharts in C/C++ 序言

时间:2021-12-22 21:58:24

序言

要想创造一款有用的软件,你必须同能被优化的每一个点、每一个特性、每一个很小的调整进行战斗。这里没有捷径。运气有时会有,但你不会因运气而胜利。只有在每一寸前进道路上战斗过,你才能最终得到胜利。——Dave Winer

很多年里,我都在寻找一本书或者一篇杂志文章,能描述一种真正实用的方法,使用诸如C或者C++之类的主流编程语言,编写现代状态机程序(UML状态机)。2002年,我写了《Practical Statecharts in C/C++: Quantum Programming for Embedded Systems》(PSiCC)一书,这本书提供了诸多备受期待的特性:它使用CC++实现了一个紧凑的、有效的、高度可维护的UML状态机,提供对状态层次化嵌套的全面支持,并提供了通用的、基于状态机的、实时的嵌入式应用架构的完整C/C++代码库。这也是第一本能提供这些特性的书。                                                    

令我欣慰的是,PSiCC一直是嵌入式系统状态机和事件驱动编程领域里最受欢迎的书籍之一。在出版的第一年,PSiCC就被翻译为汉语,一年后被译为韩语。我收到和回复了读者数以千计的邮件,在全世界范围内,他们在消费品、医疗、工业、无线、网络、研究、国防、机器人、自动化、空间探索和其他诸多应用领域使用了已出版的代码。2003年我开始在美国东西海岸的嵌入式会议上做主题演讲。所有这些给我很多额外的机会,让我在广大应用领域里,亲自去发现工程师们是如何实际使用已出版的设计技术。

在你手中的是PSiCC的第二版。这是我收到的大量反馈以及五年里在一线读者中的“大规模并行测试“和审查的直接结果。


第二版的新特性


正如我在PSiCC,我不断的在升级代码,提炼设计技术。这些改进,以及从读者那里得到的巨大收获,混合而成了这本完全修订了的第二版。

新的代码

首先,本书介绍了一个称为Quantum Platform(量子平台, QP)的新软件版本,包含了层次化事件处理器(QEP)和实时架构(QF),以及两个新组件。自从六年前出版至今,QP经历了几次飞跃。第1PSiCC以来的升级已经不胜枚举,但主要的提高在于更高的效率、更好的可测试性、在不同处理器、编译器和操作系统上的更好的可移植性。两个新的QP组件是占先式轻量级实时内核(QK)(第10章)和软件跟踪器(QS)(第11章)。最后,我对整个QP-nano——全新的、轻量级的QP的裁剪版——感到非常兴奋,它甚至可以应用在8位和16MCU上。我会在第12章介绍QP-nano

开源和双许可证

2004年,我决定基于*软件组织(Free Software Foundation)出版的GNU General Public License (GPL) version 2的条款开放整个QP代码。独立于开源许可,在传统商业授权下,QP源代码也可以获取。

这个双授权模式日益流行,它整合了开源授权与商业授权,我对其在附录A中进行了详细解释。

C作为阐释的主要语言

1PSiCC中的绝大多数代码例程,都是C++完成的。但是,我发现,很多嵌入式软件开发者都是于来自硬件背景(绝大部分是电子工程师),很多时候他们并没有必要捆绑在C++上。

在本版本中,我决定完全颠倒CC++的角色。以前,合作网站上的所有源码都有CC++两个版本。但是现在,文档中绝大多数的代码例程都仅仅指的是C版本,只有当C++C代码在执行上的区别非常重要且不容忽视时,我们采购讨论C++代码。

由于现在我们只涉及C源代码,所以我不在使用在第1版中应用和编写的C++面向对象的扩展。代码依然对C++保持兼容,但不在使用C++的宏指令。

更多的例程

与第1版相比,本书展示了事件驱动系统的更多例程,这些例程也更加完整。我做了相当的努力去提升一些并不是完全琐碎的、且不在太多细节上掩盖原理的例程。我也选择了不需要特定领域知识的例程,所以我不必在问题详述上浪费篇幅和读者的注意力。

占先式多任务支持

QP这样的事件驱动架构可以工作于多种并发机制,从简单的”超循环“,到全占先式的基于优先级的多任务机制。先前的QP版本,本身只能提供简单的非占先式任务调度,如果需要使用占先式多任务机制,必须借助外部RTOS

在第10章里,我描述了一个新的实时内核组件(QK),这个组件能为QP提供确定的、全占先式的、基于优先级的多任务机制。QK是一个特殊的、超级简单的、完全执行的(Run-to-Completion)的单堆栈内核,完美契合了对状态机执行所需的的Run-to-Completion预计的意义。

测试支持

一个架构于并行状态机之上的运行中应用是一个高度结构化的大事件。在这个大事件里,所有重要的系统交互通过事件驱动架构将所有的状态机联系在一起。通过检测这个小小的“烟囱代码”,你在这个实用系统会得到前所未有的灵感。实际上,从事件驱动框架中得到的软件数据,比任何传统的实时操作系统(RTOS)能告诉你关于应用的更多东西,因为这个框架对应用“了解”的太多了。

11章介绍了新的QS组件(“间谍”,Spy),这个组件对QP事件驱动平台提供了一个全面的软件跟踪仪器。通过QS组件产生的跟踪数据,可以让你在不停止或减慢代码执行的前提下,以最少的目标系统资源,对你运行的实时嵌入式系统进行现场分析。在其他的事情中,你可以在系统的所有活动对象中,重建完整的序列图和详细的、时间标记的状态机。你可以监控所有事件交换、事件队列、事件池、时间事件(定时器)和优先权与上下文切换。你也可以使用QS添加你自己的仪器到应用级代码。

超轻量级版本——QP-nano

状态机的事件驱动方法比任何常规实时内核或者RTOS更易于降低规模。为了专注于小型嵌入式系统,QP的裁剪版本QP-nano执行的特性是QP/CQP/C++所支持特性的子集。QP-nano是为了在8位和16位的微控制器(MCU),例如AVRMSP4308051PICmicro68HC(S)08M16C和众多其他芯片上进行层次化状态机的事件驱动编程而特别设计的。一般来说,对于每个状态机而言,QP-nano需要1-2KB左右的ROM空间和仅仅几个字节的RAM。我会在第12章中对QP-nano进行阐述。

舍弃了量子比喻

PSiCC1版中,我提出了一个量子力学的比喻,作为事件驱动的软件系统的一种方法。虽然我仍然相信这种分析方法非常精确,且提供这样一个比喻是极限编程和其他编程方法(XP)的关键实践之一,但它并没有怎么合读者心意。

出于对读者反馈的尊重,我决定从这个版本中去除量子比喻。因为历史原因,量子词汇仍然出现在软件组件的名称中,前缀Q始终如一地用在类型和函数名称的代码中,以便区分QP代码与其他代码,但是读者们不必从这些名称中望文生义。

 

使用QP,你需要什么?

本书提供的绝大部分代码都是高度可移植的CC++代码,不依赖于任何特定的CPU、操作系统或编译器。但是,为了集中讨论,我提供的是可运行于任何Windows版本的DOS平台上的可执行例程。我之所以选择16DOS作为演示平台,是因为对于任何一个标准x86架构的PC,它都允许裸机层面的编程。在不离开电脑桌面的前提下,你可以使用中断、对CPU寄存器直接操作和直接访问IO空间。现代PC上的其他任何32位的开发环境均不能如此容易的提供这些支持。

DOS平台的另外一个优势是容易获取成熟免费的工具。也正是因为如此,我使用Borland Turbo C++ 1.01工具套件进行例程的编译,这套工具可以在Borland上免费下载。

为了使用QP示范现代嵌入式系统编程,我也提供了Luminary Micro公司基于ARM Corterx-M3Stellaris系列EV-LM3S811仿真套件的一些例程。Cortex-M3例程使用了与DOS相同的源代码,只有板级支持包(BSP)有所不同。对于IAR EWARM工具集的KickStart版本,Cortex-M3例程需要最小32KB空间。这个工具集包含在Stellaris套件里,也可从IAR免费下载。

最后要说的是,本书中的一些例程可以在Linux运行,也可以在其他一些POSIX兼容系统,例如BSDQNXMax OS X或者Solaris上运行。使用Cygwin,你也可以在Windows下创建Linux例程。

本书的合作网站,www.quantum-leaps.com/psicc2,提供了本书所用到的所有工具及其他资源的下载链接。网站还包含QP对几十种CPU、操作系统和编译器的接口链接。不断去查看网站,上面会经常增加新的接口。

受众

本书是对面向事件驱动编程和现代状态机感兴趣的软件开发人员:

  • 嵌入式程序员和顾问们会发现,一个完整的、即用的、事件驱动的架构来开发他们的应用。本书描述了状态机编程策略,同样重要的是,还描述了一个颇具兼容性的实时框架来执行并行状态机。这两个组件协同互补,离开任意一个,另外一个都不可能发挥其全部潜力。
  • 寻找实时内核或者RTOS(实时操作系统)的嵌入式开发人员会发现,事件驱动平台QP可以完成RTOS所能完成的一切,而实际上,QP包含了一个全占先式内核和一个简单的协作式调度器。
  • 本书为诸如无线传感网的超低功耗系统的设计者们提供了方法,来缩减基于状态机的事件驱动系统的规模,以适配最小的MCU。超轻量级的QP-nano版本(第12章),整合了一个层次化事件处理器,一个实时框架、一个仅占1-2KB ROM的协作式或者全占先式内核。
  • 在另一个极端,超大规模、大量并行处理的服务器应用的设计人员会发现,整合了层次化状态机的事件驱动方法易于规模的扩大,对于管理极大数量的状态元件,例如客户端对话,非常理想。事实证明,QP的“嵌入式”设计哲学在空间与时间上提供了决定性的单元件效率。
  • 开源组织会发现QP补足了其他开源软件,例如LinuxBSDQPLinux(甚而至于与POSIX兼容的操作系统)的接口会在第8章进行阐述。
  • 使用CC++GUI开发人员和计算机游戏程序员会发现,QP非常漂亮的补足了GUI库。基于层次化状态机,QP提供了高端的“屏幕逻辑”,而GUI库还在使用低端的屏幕组件和图形渲染。
  • 系统架构师们会发现,QP是一个轻量级,而非重量级的设计自动化工具。
  • 设计自动化工具的使用者们会对工具的内部运作得到更深的理解。“在罩子下面瞧瞧”会帮助他们更高效更自信的使用工具。 

由于以代码为中心的方法,本书首先会呼吁软件开发者们创建实际的工作代码,而不仅仅是建模。很多关于UML的书做了一项很好的工作,那就是描述了模型驱动的分析设计以及相关问题,例如软件开发流程和建模工具。

本书不提供其他CASE工具。相反,本书是通过一个实时框架,对层次化状态机和状态机集合技术进行实用的人工编程,使之成为健壮的事件驱动系统。

要想从本书中受益,你应该对CC++相当精通,并对计算机架构有个大致了解。我姑且假定读者们事先并不了解UML状态机,我会在第2章中对基础知识进行简单阐述。我也会在第6章中对基本的多任务、互斥、模块化中的实时部分进行阐述。

 

合作网站

本书的合作网站www.quantum-leaps.com/psicc2,包含以下信息:

  • QP/C, QP/C++QP-nano的源代码下载
  • 所有的QP接口和例程描述
  • QP/C, QP/C++QP-nano的参考手册(HTMLCHM格式)
  • 编译器和书中其他所用工具的下载链接
  • 精选评论和读者反馈
  • 勘误表

另外,自从2002PSiCC1版出版以来,Quantum  Leaps网站(www.quantum-leaps.com)一直支持QP读者社团。网站上可提供以下资源:

  • 最新的QP下载
  • QP接口与开发包
  • 程序员手册
  • 应用指南
  • 资源与工具,例如用来绘制UML状态图的Visio模版、设计样式、相关书籍与文章的链接等等
  • 商业授权和技术支持信息
  • 新闻与大事记
  • 论坛
  • 新闻快报
  • 博客
  • 相关网站链接
  • 等等

最后要说的,QP可以从世界最大的开源代码与应用库SourceForge.net上获得。QP项目的地址是:https://sourceforge. net/projects/qpc/