0 引 言
基于组件的开发(Component Based Development,CBD)技术在软件工程中占有举足轻重的地位,并且在许多工程应用领域已经取得了重大的成功。在通用计算机软件、电子商务、Internet和分布式计算环境中CBD技术已经得到了成熟的应用。但是,在其他一些领域,如嵌入式系统中,CBD的应用还及其有限。由于不同嵌入式系统的需求和硬件平台各异,要开发出适用于所有系统的通用组件是极其困难的,目前只能够针对特定应用领域和平台研究开发适用的组件。正是由于嵌入式系统的差异性、专门性与组件技术的通用性之间的矛盾,所以要利用组件进行嵌入式软件开发,就必须采取适用的组件技术和系统开发方法。
在此,主要介绍了面向组件软件工程的总体原则及其在嵌入式系统中的应用。通过分析嵌入式系统中对组件的要求和通用组件技术的差异,提出了嵌入式组件的设计原则,并基于嵌入式组件的特点,提出一种面向组件的嵌入式软件系统开发方法。表明尽管嵌入式系统与通用计算平台具有很大的差异,但是组件技术仍然可以成功地应用于嵌入式领域。
1嵌入式系统和组件技术
1.1嵌入式系统
嵌入式系统是满足专门需求的小型计算机系统。例如,车载控制系统、工业控制系统、移动电话或者传感控制系统。嵌入式系统的范围极其广泛,从微型计算设备到复杂的大型监控设备都属于嵌入式系统的范畴。实时性是大多数嵌入式系统的特性,是在系统设计时需要考虑的重要概念。对于实时性的要求,不同嵌入式系统可以分为软实时系统(Soft Time System)和硬实时系统(Hard Time System)。嵌入式系统一般还要求有很好的稳定性和可靠性。由于功能专一,需求多样和系统小型化,这就要求系统的成本低廉,从而限制了系统的硬件性能。由于嵌入式系统的资源限制和实时性要求,软件开发人员往往不能够利用先进的通用软件工程技术,而必须使用一些非正规的方法,利用高效的程序语言进行开发。随着系统复杂性不断增加,对系统的需求分析,模型设计,早期的错误检测,开发周期,可维护性等方面提出了新的要求。因此推动了先进的软件工程方法向嵌入式开发领域的转移。
1.2组件技术
组件技术就是一种软件工程中的先进技术。组件可以认为是能够用于构建大型系统的自包含的部件或子系统。在软件工程中,一个组件与一个微型应用程序类似,即都是已经编译链接好,并可以使用的二进制代码,应用程序由多个这样的组件打包而得到。在需要对应用程序进行修改或改进时,只需要将构成此应用程序组件中的某个用新版本替换掉即可。这样,使用组件技术的系统就具有很好的灵活性和可移植性。另外强大的组件库能够为开发人员提供功能丰富的组件支持,从而大大缩短软件的开发周期。使用组件的种种优点直接来源于可以将它们动态地插入或卸出的应用。为了实现这种功能,所有的组件必须满足两个条件:一是组件必须动态链接;二是它们必须隐藏其内部实现细节。另外,利用组件还能帮助开发人员根据所使用的组件功能预测和验证系统的功能特性。正是由于组件具有诸多优点,基于组件的开发技术才引起了软件工程领域的广泛应用,并且逐渐将它引入迅猛发展的嵌入式软件开发领域中。
2嵌入式系统组件的设计原则
2.1接口设计原则
适用于嵌入式系统中的组件遵从大部分的通用组件设计原则,特别是组件的接口和实现相分离的封装特性。组件的接口是组件功能的体现,系统中的其他部分或者组件正是通过接口使用组件提供的功能。但是对于嵌入式系统而言,有一些额外的系统特性或约束和系统功能是同样重要的(如实时性),那么接口仅包含组件本身的功能特性就不完备,它还必须包含额外的系统特性,即加入约束条件。这样在系统设计阶段,利用组件进行设计不但能够验证功能需求,而且还能预测和分析系统特性需求。
2.2组件绑定与发布原则
在通用组件的设计中,接口是以支持运行期绑定的多态对象接口方式实现的。组件完全以动态形式绑定,独立于接口的定义。这样为组件复用、系统升级提供了强大的灵活性。但是,这种灵活性在嵌入式系统中会带来性能的下降和风险的上升,影响系统的实时性和稳定性。因为所有组件都在运行期绑定,这样必然会增加冗余代码,并且让系统行为变得难以预测。因此,通用组件的动态特性在嵌入式系统中特别是小型系统中是不可行的。由于实时性和硬件资源限制,在嵌入式系统中,组件链接和组合最好在系统设计期静态而不是运行期动态地进行。进行组件的静态绑定,可以通过系统建模工具对一个基于组件的系统设计产生一个总体视图,这样能够对系统性能有更好的预测和优化。所以组件的形式不应该再使用通用组件中的二进制可执行文件形式发布,而应该采用高级语言或更为抽象的建模语言(如UML)定义组件的形式,这样可以让组件在编译期或者在设计的早期就可以绑定链接,而不是像通用组件那样的迟绑定(Late Binding)。
2.3 大型嵌入式系统中的组件原则
随着嵌入式技术的不断发展,许多功能复杂的大型嵌入式系统也随之出现。对于这些系统硬件资源和实时性已经不是首要的考虑因素,如何有效控制系统复杂性和降低高昂的开发成本已成为最主要的问题。所以对于这样的大型嵌入式系统,通用组件几乎可以毫无障碍地在系统中发挥作用,极大地简化了开发难度,减少了开发工作量和开发周期。如微软的嵌入式系统Windows CE就是这项技术的成功应用,系统功能和应用功能完全以组件方式列出,开发人员只需要简单地添加和删除就能将一项复杂功能加入或移除系统镜像,并且支持功能强大的COM组件库,为应用程序的开发提供了非常便利的工具。当然,那些要求强实时的大型嵌入式系统也不应该使用通用组件技术,应该根据具体的系统特性使用精简版本来进行系统开发。
3面向嵌入式组件的系统开发过程
由以上分析可以看出,由于嵌入式系统的功能和性能要求,以及硬件资源限制和复杂性控制需求,适用于嵌入式软件系统的组件体现了接口定义约束、静态绑定和抽象语言的发布形式等特性。那么正是由于这些特性的存在,适用于通用组件的软件开发方法就不能直接应用于嵌入式软件开发过程,而需要一种适合于嵌入式组件特性的系统开发方法。下面介绍面向嵌入式组件的开发过程,它能够有效地利用和体现嵌入式组件的特性。
整个开发过程如图1所示。根据组成与分解、抽象与具体的两个基本开发思想建立了一个二维坐标系,横坐标为抽象与具体;纵坐标为分解与组合。两个坐标轴将整个开发空间分成了4部分,即建模过程的4个基本步骤:分解、实体化、组合、确认。
![](http://www.picavr.com/upload/2009_10/091020171883691.jpg)
分解 整个开发过程从图1的左上角开始。黑色方框代表了最初的待实现系统,即开发人员经过需求分析所建立的系统模型。通过系统功能域的划分,将系统进行分解,在每一个功能域都包含了与该功能相关的所有逻辑组件。每一个逻辑组件再作为一个子系统递归地进行分解,直到组件达到了可重用组件的粒度。分解过程只是从抽象和逻辑角度决定组件的功能形式。
实体化 将具有最小粒度的不能再分解的逻辑组件进行实体化。由于这些逻辑组件已经具有了明确的功能或者直接就是已有的组件,所以可以很容易地将这些逻辑组件转化为实际组件,如图1中右下角的黑粗线方框所示。
组合 将重用的或者是将实现的实际组件,根据抽象模型,通过组件接口组合起来,该过程完全是分解的逆过程。如图2所示。
![](http://www.picavr.com/upload/2009_10/091020171883692.jpg) 验证 对实体化以后再构建起来的系统与最初的待实现系统进行对比,利用组件的功能和约束特性预测整个系统的功能和性能,从而验证系统设计的正确性。
面向嵌入式组件开发的整个过程体现为一个树形结构,相当于一棵组件树。树的每一片叶子都代表一个组件,而每一个组件都可以视为一棵子树,递归地利用该开发过程。整个过程总是不断利用已有组件或者明确可实现的小粒度组件的组合对设计进行验证,由于组件接口和实现已经静态绑定,每一个组件在运行时的功能在设计期就能完全确定,这样能帮助开发人员在最早的时间内发现设计上的缺陷,及时对设汁进行修改。
4 结 语
如今,嵌入式系统已经被广泛地应用于生活的方方面面。CBD技术无疑会对嵌入式领域的发展起到重要的作用。这里通过深入分析通用组件的设计原则和嵌入式系统的特性要求,提出了适合于嵌入式系统的组件设计原则和开发方法,使组件技术的优点在嵌入式系统中得到了很好的体现,为CBD技术向嵌入式领域的转移提供了一种有效的途径。
当然,要使CBD技术得以在嵌入式系统中充分的利用,还有一些问题有待推进和解决。例如,目前还缺乏广泛使用的适合于嵌入式系统的组件技术标准,大多数的组件技术还不能够支持对嵌入式系统性能特性(如实时性)的定义和分析,并且应用于具有特定系统性能要求的嵌入式系统的组件组合方法和系统设计时的功能预测和验证手段都还有待于发展。此外,帮助嵌入式开发人员进行组件和系统建模、分析和验证的辅助工具还需要进一步的开发和引入 |