基于Rhapsody和VxWorks的自动取款机系统
摘要:介绍如何运用UML设计简单的自动取款机系统模型并在操作系统VxWorks上实现它:首先,介绍如何运用基于UML的嵌入式实时应用软件开发环境Rhapsody设计和实现自动取款机系统的模型,以使它能独立于实际的硬件和使用的操作系统;然后详细介绍上述模型如何在实时多任务操作系统VxWorks上实现。
关键词:Rhapsody VxWorks 自动取款机
引 言
随着嵌入式应用的不断增长,嵌入式系统需求的复杂性、不确定性不断提高,系统规模也逐步扩大;而产品的研发周期又在很快地缩短,给嵌入式应用软件的开发带来了新的挑战。同时,嵌入式软件的开发者必须面对由于芯片性能的增长、嵌入式操作系统平台等技术方面不断变化所带来的各种压力。嵌入式软件开发环境的发展,使一直“深埋”于系统的嵌入式应用软件变得开放而易于开发,从而促进了嵌入式技术的广泛应用。
1 基于UML的嵌入式软件开发环境结构javascript:window.open(this.src);" style="cursor:pointer;"/>
图1所示为一种支持基于UML(Unified Modeling Language,统一建模语言)的迭代式开发方法的开发环境的结构,虚框部分为基于UML的软件开发环境。
系统分析和设计用UML来描述,对系统建模;实现过程利用代码自动生成技术来实现;测试过程将依赖于生成的代码,通过在代码中拆装一些用于支持模型调试的调试信息来实现;而代码的编译、链接则采用目标系统的操作系统开发环境来完成,代码的运行与源程序级的调试仍然采用一般的嵌入式软件调试环境。
Rhapsody是一个基于UML的面向嵌入式实时应用开发的集成、可视化环境。软件开发者可以在这个环境里进行分析、设计、实现及验证。Rhapsody支持基于模型的调试;提供专门为实时嵌入式应用设计的可执行的框架,可以产生基于VxWorks、POS、OSE等多种操作系统的C语言、C++语言、Java语言的源程序。本文所给出的自动取款机系统的模型正是基于Rhapsody设计的。
2 自动取款机系统模型的设计
2.1 需求分析
我们设计的自动取款机系统要满足如下要求:
在自动取款机系统中,当顾客在自动取款机操作面板上插入信用卡并输入密码和现金支取数额(每次最多只能取一千元)后,由自动取款机读取卡上的内容,并把相应信息传送到银行。银行把自动取款机送来的信息与银行帐号上的信息进行比较,如果两者一致,则银行传送确认信息到自动取款机,由自动取款机输出现金,然后顾客取出卡和现金;如果两者不一致,则要求顾客再次输入密码和现金支取数额,然后重复上述操作;若密码输入三次不正确,自动取款机就会吞掉信用卡,顾客就不能取出信用卡和现金。
javascript:window.open(this.src);" style="cursor:pointer;"/>
该自动取款机系统包括1个键盘(10个数字键、ENTER键和CANCEL键)、1个LCD液晶显示屏、1个插卡孔和1个现金出口;通过双绞线与银行中的电脑进行串行通信。该自动取款机系统不包括银行中的电脑,只是通过软件与银行中的上位机进行串行通信。
2.2 可视化建模
建模是面向对象分析和设计的核心,也是分析和设计过程中最基本和最关键的活动之一。UML不仅适用于以面向对象技术描述的任何类型的系统,而且适用于系统开发的不同阶段。根据开发过程中不同阶段的具体要求,利用UML不同类型的图来描述系统的各种静态结构模型和动态行为模型。下面介绍如何利用基于UML的面向嵌入式实时应用开发的集成可视化环境Rhapsody创建自动取款机系统的模型。
图3 取出现金的黑匣子场景
第一步:根据要求建立用例图。
图2所示为用例图。图中给出了自动取款机系统的主要用途,并表明由谁使用自动取款机系统。有一个主要成员——顾客。一个用例图应该具有这样的系统功能:对操作者而言,它返回可观察的结果但并不显示系统的内在结构。
自动取款机系统的主要用途是“取出现金”用例。顾客参与其中的两个实例是“输入密码”和“取出现金”。这两个实例都包含了另一个用例“读取卡上内容并验证”。对每一个用例而言,我们都可以增加文本描述。假如需要的话,这些用例能够被细化成另一张更多用例的图。这些用例并没有显示任何内在的结构,仅是一个功能性的视图。
第二步:设计黑匣子场景。
建立了一个用例图后,下一步便是细化用例,即设计一些黑匣子场景。这些黑匣子场景的主要作用是表明模型和对象之间的相互关系。把整个系统看作一个整体,对 “取出现金” 用例,我们细化为图3所示的场景。(由于每次最多只能取一千元,所以最多只需要按键4次。)
图3所示的场景能被MSD(消息序列表)捕获,用来描述在顾客和自动取款机系统之间的通信行为。当创建这样的图表时,关于系统的更多细节被隐藏了;同时,这些场景帮助我们更好地理解使用者如何使用报警系统以及需要做哪些事情。总而言之,每一用例都有很多的场景需要捕获,每一个场景都是用例的一个有效的实例。
javascript:window.open(this.src);" style="cursor:pointer;"/>
第三步:设计子系统图。
下一步是如何把模型分割成子系统。在UML中,一个子系统作为一个封装显示,即主要是一个类的集合。图4的子系统图表明自动取款机系统已经被分解成两个基本的部分:自动柜员机封装(AtmerPkg)和硬件封装(HardharePkg)。同时也表明:自动柜员机封装是完全独立于