版权归原作者所有,如有侵权,请联系我们

[科普中国]-嵌入式应用设计

科学百科
原创
科学百科为用户提供权威科普内容,打造知识科普阵地
收藏

概述

嵌入式系统已经具有相当长的历史,最初是在军事、航空航天、工业过程控制等领域。从20世纪90年代中后期开始,互联网、通信、信息家电等的兴起使嵌入式系统渗透到了人们的日常生活当中,这也使得计算机产业从PC时代来到了以普及计算(Pervasive Computing)和嵌入式系统为重要代表的后PC时代。嵌入式系统是以应用为中心的计算机系统,一般具有实时性、专用性和资源有限性等特点,因此嵌入式软件的设计既具备一般计算机系统的软件设计共性,也具有其特殊性1。

结构化设计方法结构化设计方法是目前嵌入式软件最成熟、使用最广泛的设计方法,它又分成两大类:单任务的结构化设计方法和多任务的结构化设计方法。

单任务的结构化设计方法嵌入式软件在逻辑上可以抽象成一个不断处理外部事件的过程,单任务的结构化设计方法的主要思想就是按照结构化的设计原则分别设计好各个事件的处理模块,然后在一个主循环中依次循环调用这些模块(如下面的程序段所示)。这种设计方法具有软件结构简单、运行效率高、占用资源少和可以不需要OS支持等优点,但是它也有以下的缺点:

事件处理之间无优先级并且不可抢占,当一个紧迫事件来临时,如果处理该事件的模块刚被调用,则必须要等到下一次循环才能被调用处理;

事件处理模块之间的互斥和同步原语操作需要用户自己来编程实现。单任务的结构化设计方法比较适合于很简单的嵌入式系统,这些系统的硬件资源非常紧张,并且处理的事件比较单一,如简单的单片机控制系统;另外在一些处理的事件比较单一并且要求高速的场合也可以使用,例如数字信号处理(DSP)。

单任务的结构化嵌入式软件体系框架如下:

While(继续运行)

调用事件处理模块1;

调用事件处理模块2;

多任务的结构化设计方法多任务的结构化设计方法的基本思想仍然是先划分模块,然后进行模块综合,与单任务的结构化设计方法不同之处在于这些并发模块并不是被综合在一个主循环中,而是被综合分配到多个任务中,在多任务运行时环境(RTOS)协调下执行。系统地描述了一种多任务的结构化设计方法DARTS———一种结构化分析和设计方法在嵌入式软件设计中的扩展。DARTS在结构化分析和设计过程中,需要进行任务的划分,通过对事件处理模块的相互关系进行分析,按照它们之间的时间特性、紧急程度、是否可以并行操作、相互之间的耦合强度等特性,将模块分配到相应的任务中去。另外,DARTS利用任务通信模块和任务同步模块来完成任务间的通信、互斥与同步。DARTS方法是多任务的结构化设计方法的典型代表,在目前的嵌入式软件中被广泛使用。与单任务的结构化设计方法比较起来,任务之间可以按照优先级进行抢占,在设计时把紧急事件的处理模块分配到高优先级的任务中,这样紧急事件就可以随时得到优先处理;另外事件处理模块之间的通信、互斥和同步通过任务通信模块和任务同步模块来完成,这些通信模块和同步模块抽象了所有嵌入式软件的共同特点,在所有嵌入式软件中都可以使用,并且它们在实时操作系统(RTOS)提供的通信原语、同步互斥原语基础上来实现,这样减轻了应用程序开发人员的负担,使应用开发人员专注于与应用本身相关的设计。当然,多任务的结构化设计方法对系统硬件资源的要求比单任务的结构化设计方法高一些,并且需要RTOS的支持,因此在一些硬件资源很紧张的嵌入式系统中无法使用。

面向对象的设计方法结构化的软件设计方法虽然获得了很大的成功,但是设计出来的软件在扩展性、维护性等方面却不能尽如人意,主要原因在于结构化的设计方法将数据和在数据上的操作分离开来,封装性和信息隐藏性不好。面向对象(OO)设计方法将数据与数据上的操作封装在对象这个实体中,对象外界不能直接对对象内部进行访问和操作,只能通过消息的方式间接访问对象。OO方法符合人们的思考方式,并使问题空间和解空间的描述相一致,各个对象之间不需要了解对方内部细节,并且提供了继承、多态、重载等方式来提高软件的重用性;另外,在OO设计方法中可以采用面向对象的应用程序框架的方式来捕捉大规模应用的设计模式,提高了软件体系结构的重用性。因此,OO设计方法能够使软件开发人员理解和管理更大更复杂的软件,提高软件的扩展性、维护性和重用性。

面向对象的嵌入式软件设计方法包括面向对象的系统建模、面向对象的系统设计、对象的详细设计这几个典型步骤。文献提出了一种面向对象的实时多任务设计方法,它在面向对象的系统建模阶段,使用UML进行对象建模,使用MSC进行用户实例建模,从而分别描述了系统的静态和动态行为;在面向对象的系统设计阶段,根据系统建模结果进行应用的体系结构设计,主要过程包括体系结构描述(根据对象模型中的并行类及其它因素确定体系结构中的高级对象),细化高级对象,描述对象之间的通信关系,确定被动对象等,并使用SDL来描述相关的设计;在对象的详细设计阶段,包括并行对象和被动对象的详细设计,前者使用SDL的进程图来描述,后者使用UML的类图来描述。文献的方法不但具有面向对象的设计方法的好处,还充分利用了各种形式化的语言和各种辅助工具,提高了嵌入式软件的开发效率。

从以上叙述可知,为了将面向对象设计方法应用到嵌入式软件设计中,在对象中明确引入了并行特性,从而有了并行对象和被动对象的概念。另一种面向对象的嵌入式软件设计—自适应通信环境ACE(Adaptive Communication Environment)框架,使用主动对象(Active Object)或反应式对象(Reactive Object)来为对象引入并行特性。同样,将面向对象设计方法应用到嵌入式软件设计中的另一种方式是在对象的方法中引入实时特性,建立实时对象的概念,TMO和PBO就是两个典型的代表。TMO将对象中的方法分成以时间驱动和以消息驱动两类,在设计时,对具有定时特性的操作就用时间驱动类方法来描述。TMO利用BBC(Basic Concurrent Constraint)规则控制对象方法之间的调度,BBC规则中基本的一条就是时间驱动类方法的优先级高于消息驱动类方法;PBO采用自治计算模型,PBO中的每个方法在运行时就假定需要的输入已经准备好,每个方法被调度执行时都是一次执行完毕,不会被其它方法打断,而PBO之间的互斥与同步(包括同一PBO对象中的方法驱动)交由系统处理,使PBO方法之间以及PBO对象之间的同步简化。

面向对象的嵌入式软件设计方法能够充分利用面向对象的优点,并且能够利用许多的形式化语言和辅助工具来协助软件开发,使嵌入式软件的开发效率、扩展性、维护性和重用性都有很大的提高。嵌入式软件的面向对象设计与普通软件的面向对象设计并没有本质的不同,主要差异是在对象中引入了嵌入式软件的特征(并行性、实时性、可靠性等)。很明显,面向对象的嵌入式软件设计方法一般需要面向对象的编程语言(例如C++)的支持。但是,面向对象的编程语言占用内存空间比面向过程的编程语言要多,运行效率也比不上后者。在现有的RTOS上实现面向对象的嵌入式软件设计,一般采用如图所示的模型。RTOS的对象化封装层将RTOS的API封装成对象的类(如C++类),面向对象的运行支撑层在对象化封装层基础上,将应用中共性的东西抽象出来形成对象的类和面向对象的应用程序框架(例如上文中的ACE框架及其包含的主动对象、反应式对象等)并为对象框架的运行提供支撑,应用层则在面向对象的运行支撑层提供的框架和类以及RTOS对象化封装层提供的类的基础上进行构建。引入的面向对象的运行支撑层和RTOS对象化封装层进一步加大了内存空间的占用,降低了运行效率;另外面向对象的运行支撑层如何抽象出应用中共性的对象和框架非常关键,甚至影响到面向对象的嵌入式软件设计方法的成败,而这个问题目前还是一个开放的问题,上文中的ACE、TMO、PBO等都只是在某一类应用中使用效果比较好。但是不管如何,面向对象的嵌入式软件设计方法是设计大型复杂嵌入式软件的有效途径1。

基于构件的设计方法近年来,软件生产线的概念被人们提了出来,其最终目的就是希望软件象硬件一样进行生产。构件化的软件开发主要通过提高软件的重用性来提高软件开发效率,同时它强调软件体系结构的重要性,认为应该在软件体系结构层次上对软件进行设计和维护,即所谓“粗粒度”软件设计。构件的定义很多,比较典型的有:构件在逻辑上可以看着被多个软件系统所复用的具有独立功能的系统构成成分;构件是系统的基本构造单元,具有较好的自包含性;构件可以视为一个通过接口对外界提供服务或向外界请求服务的黑盒,多个构件可以组成一个更高层次的构件,构件比对象提供了更高的设计抽象。从以上的定义可以看出构件最重要的特点是其独立性、重用性和具有层次的抽象性,重用性强调构件的目的是为了软件的重用性,独立性则强调构件达到该目的手段,即通过其功能和实现的独立性从而使它能够在很多的环境中被使用,具有层次的抽象性表明构件的广泛适用性,从整个软件系统到具体的每个细小的功能块都可以使用构件概念来描述和设计。构件化软件设计的研究内容可以分成领域工程和应用工程两部分。领域工程的主要任务是获取构件,存在大量可复用的构件是有效地使用构件进行应用软件设计的前提,而领域工程是获取构件、构架的主要途径。领域是一组具有相似或相近软件需求的应用系统所覆盖的功能区域,领域工程是为一组相似或相近系统的应用工程建立基本能力和必备基础的过程。领域工程过程划分为领域分析、领域设计、领域实现等多个活动,其中的活动与结果如图所示。应用工程的主要任务是构件复用,利用领域工程结果进行软件系统的开发,与普通的软件开发过程类似,应用工程也可以划分为分析(需求获取)、设计、实现等阶段。不同的是,本过程中的每一阶段皆可以从构件库中获得可复用的领域工程结果,并将其作为本阶段集成与开发的基础,应用工程中的活动与结果见图

领域工程研究的核心是构件模型和软件体系结构(软件构架)这两个相互关联的问题,不同的构件只能在相应的软件构架中使用,就象计算机硬件上不同总线的扩展卡只能插在相应的扩展总线上,因此基于构件的应用软件设计也可以认为是基于体系结构(构架)的软件设计,也有人称之为基于“构件———构架”的应用软件设计。目前针对构件和构架的研究包括:提出各种“构件———构架”模型、提出各种形式化的描述方法和可重用构件的产生等。在构件和构架模型中,把构件与连接件相区别是一个非常重要的思想,这种思想把构件的功能与构件间的交互分离,这种分离提高了构件的独立性和重用性,因为构件在生产时不需要考虑其使用环境(与其它构件的交互)。同时在大型分布式复杂软件中引入了具有更高抽象层次的Agent概念,利用Agent来实现软件的高抽象层次的构件和连接件,能够在不同层次上清晰描述和实现构件化的软件体系结构———在此把这些构件/构架模型称为高级构件/构架模型,而且也有了一些针对基础构件和构架模型的业界标准提供给用户直接使用。构件库管理为应用工程重用已有的构件提供支持,随着构件化的软件设计逐渐成为主流,能够重用的构件必然越来越多,用户花在查找适合自己需要的构件上的成本也必然在整个软件开发过程中占据越来越大的比例,所以构件库的管理也开始受到研究者的注意。系统分析了构件重用成本问题,并给出了量化的公式,在该公式中,涉及到构件库的大小和组织问题,给出了构件库管理的两个性能指标:查全率和查准率。所谓查全率是指具备用户指定特征的构件都能够反馈给用户挑选;所谓查准率率是指尽量反馈精确具备用户指定特征的构件,不相关的构件不要反馈给用户,以减小用户筛选适合自己需要的构件的工作量。

可重用构件和构架的获取也是学术界和工业界关注的问题之一,因为只有构件库中有丰富的构件才能提供给用户使用。如何充实构件库(可重用构件和构架的获取)成了实践者的一个紧迫问题。获取可重用构件有两种途径:第一种方法就是按照构件———构架模型来从头生产可重用的构件和构架,为以后的应用开发服务;第二种方法就是从传统的软件中提取出可重用的构件和构架。很显然,第二种方法更具有吸引力,因为它尽可能减小了重复开发。从传统的软件中提取出可重用的构件和构架可以看成软件反向工程的一部分。应用工程解决的核心问题是如何利用领域工程的构件和构架,进行应用程序的生成,这个过程也称之为基于构件的软件开发过程,它可以分成三步:构件的抽取、构件的组合、构件的适应性修改。构件的组合就是指把各个构件(包括连接件)组装起来形成应用系统的过程,该过程也可以称为基于构件的软件设计过程。基于构件的应用软件设计是一个自底向上和自顶向下相结合的设计过程。这个过程的关键是如何把一个应用系统的需求进行分解,使其尽量能够通过用已存在的构件组合来完成,构架模型(软件体系结构)为这个分解过程提供了指导方向。对分解过程采用的方法进行了比较全面的叙述,描述了通过枚举选择的构件组合的自底向上的设计算法及其改进算法。构件的适应性修改也是相当重要的,因为许多年来,我们已经积累了大量的软件制品,可以把它们进行适应性修改使之构件化加入到构件库中,从而适合在构件化软件设计中使用。目前有关这方面的研究不是非常系统,也没有提出一个普遍化的方法来进行这项工作。

嵌入式软件因其应用环境的约束,基于构件的软件设计方法在嵌入式软件开发中还会遇到特有的技术问题,综合论述了基于构件的嵌入式软件设计中面临的问题:降低构件间在时间和空间上的耦合性;端到端的可靠性依赖;资源的有限性(时间和空间资源);对平台的依赖性。该文还提出基于构件的嵌入式软件设计中最重要的是定义一种构件/构架模型,该模型要把资源和系统的非功能性需求方面一起考虑。总的说来,嵌入式软件的构件化开发技术遇到的特殊技术问题主要有:(1)在模型和模型描述中引入实时特性;(2)抽象出一个可以灵活定制并满足实时约束的通用体系结构;(3)软件的形式化技术,嵌入式实时软件往往要求高可靠性,而软件的形式化技术可以保证生成正确的软件;(4)软件的动态演化技术,嵌入式实时系统往往需要长期不间断的运行,在运行过程中软件不可避免地要进行升级,如何进行软件动态升级也是嵌入式软件研究的一个重点。构件化的嵌入式软件设计由于使软件模块化,各模块间的独立性强,为软件动态升级提供了很好的基础。但是为了达到构件的动态配置与替换,仍然有相当多的问题要解决;(5)在语言级上支持基于构件的实时系统的编程;(6)从实时应用程序中抽取可重用的构件的问题等。

目前在嵌入式软件中使用基于构件的设计方法研究较多的是基于实时CORBA的研究,但是这些研究远未成熟。基于构件的软件设计建立在面向对象设计基础之上,它把对象对外的接口声明与对象内部的接口实现相分离,一个构件在修改自己的接口时,只影响与修改接口相交互的构件,与被修改构件的其它接口相交互的构件不受任何影响。因此,构件化的软件具有面向对象的软件的所有优点,并且重用和扩展性更高,可以做到在二进制级别上的重用。相对而言,基于构件的嵌入式软件设计方法对嵌入式系统的硬件资源要求更多,目前较多应用在大型分布式嵌入式软件系统中,要使这种方法在嵌入式软件设计中普及开来,需要等待嵌入式系统硬件的发展和基于构件软件设计方法的相关问题的解决。