[原创]嵌入式系统软件仿真器理论介绍
0赞由于嵌入式系统开发软硬件架构比较复杂,因此很多硬件可以用软件进行模拟,如Blankfin,ARM,INTEL,龙蛇等,这个是一个全新的领域,今天我跟大家探讨一下这方面知识。
目前很多嵌入式开发平台提供在线仿真方式,采用这种开发方式在应用开发过程中仍需与硬件打交道,软/硬件间敏感的交互影响会产生大量的麻烦和进度的延误,很多不确定因素会引起错误。而纯软件的仿真开发方式可进一步改善开发环境,避免硬件干扰,集中精力开发软件。它是用计算机软件模拟实际硬件电路的运行,构建应用软件运行所需的虚拟硬件环境,提供嵌入式软件开发和调试的真正“软”平台。现在一些硬件模型已经相当精确,软件仿真可以真实地反映实际电路的行为。
引入软件仿真开发相当于引入一种新的开发模式,为程序员提供了一个更便捷高效低成本的开发平台,在仿真平台开出的程序,具有较高的可移植性,一些成熟的通用程序可以作为专家库函数产品推向社会。
1构件技术
嵌入式系统主要特点之一是多样性。设备生产厂商在芯片选择、功能定义、显示设备特性、耗电限制方面会有许多不同的要求,同时嵌入式系统应用广泛,嵌入式硬件平台必须满足应用实际要求,可灵活定制。仿真目标硬件平台的仿真运行环境要覆盖不断变化的嵌入式硬件系统,需要选择具有良好可扩展性、开放性的技术方案,以较小的代价应对未来不断变化的需求。因此,仿真运行环境的研究和实现必须借助于软件复用技术,同时可以充分利用已有的开发成果,消除在设计、编码、测试等方面的重复劳动,提高软件开发的效率;通过复用高质量的已有的开发成果,也可避免重新开发可能引入的错误,以提高软件质量。
当前有两大软件复用方式:面前对象和构件方式,两者区别在于:
- 构件是设计的概念,与具体编程语言无关,不象OO中的对象属于编程中的概念,要依赖于具体的编程语言。
- 在对构件操作时不允许直接操作构件中的数据,数据真正被封装了。而对象的操作通过公共接口部分,这样数据是可能被访问操作的。
- 从构件和对象的生成方式上,OO中的对象生成属于实例化的过程,比较单一,而生成构件的方式较多。
- 在纯OO设计中,对象(类)、封装和继承三者缺一不可,但对构件可以没有继承性,只要实现封装即可。因此,构件不是OO中的对象,而是与基于对象中的对象类似。
- OO中的对象对软件重用是通过继承实现的,构件对软件重用不仅可以通过继承还可以通过组装时的引用来实现。
比较发现,基于构件的软件开发模式更满足仿真运行环境的设计要求,多年来构件技术的发展也提供了必要的技术支持。构件是可重用的,对外提供统一接口,既包括接口信息,还包括自身的功能实现体;软件开发者或用户选择一些这样的构件,通过一些适当的方式组合起来构成一个仿真硬件平台[12,14],使它们在一个时间或空间相一致的环境中实现交互作用,协调运行,完成特定的仿真任务。构件的组合运行涉及到集成方式和体系结构的研究,本章后面对此有专门阐述。
1.1构件概述
软件构件技术是近几年来迅速发展并受到高度重视的一门技术。所谓构件(component)是指一组封装的、规范的、可重用的软件模块,它具有特定的功能,支持灵活的即插即用,可以方便地插入到网络、语言、应用、工具、操作系统中工作,是组织系统的基本单位。构件是指应用系统中可以明确辨识的构成成分,而可复用构件是指具有相对独立的功能和可复用价值的构件。从功能角度可将软件构件分为系统构件System、支撑构件Support和领域构件Demain。系统构件为在整个构件集成环境和运行环境中都使用的构件,支撑构件为在构件集成环境与构件库管理系统中使用的构件,领域构件为专用领域开发的构件。
构件是一个动态的概念,运行时要占用内存空间。构件有一个生命周期:构件的创建,构件的运行和构件的消亡。其中激活构件是通过事件来触发的,即构件是通过事件来驱动的,事件是指消息、过程调用和指令等。
构件的封装性有两层含义:一层指数据和操作的封装;另一层是指没有操作下的数据属性的封装,这一层的封装可以认为是数据和操作封装的一种特例,即操作为空的特殊封装。象Ada的Package、Smalltalk-80的object、C++的class和数据类型都可属于构件范畴。但是,操作集合、过程、函数即使可以重用也不能成为一个构件[10]。
由于构件的标准化特点,组装标准的构件来形成新软件很容易;同时依据标准开发的构件也才可能大量被其它软件使用。基于构件的软件开发技术也正是强调:(1)构件的使用,开发新软件尽量通过重用已有的构件来实现;(2)构件的生产,在新软件的开发过程如果必须要添加新代码,尽量把这部分代码按照标准做成构件的形式,方便以后重用。
构件技术的主要研究内容包括构件获取、构件模型、构件描述语言(CDL)、构件分类与检索、构件复合组装、标准化。其中构件模型和构件描述语言是构件制作、检索和组装的基础。由于构件的种类繁多,形态各异,因此很难建立一个能够描述所有类型构件而又支持制作和组装的构件模型。一般来说特定的构件模型只能用于描述特定类型的构件。
1.2构件模型
构件模型是一种部件通用体系结构,旨在建立一套软部件形态标准与接口标准,而且可以用不同的语言来编写,同时为用户提供各种不同的函数功能。设计初期建立参考模型构件,还需要花一定的时间构造参考模型库,但一旦模型库建好以后,用户就可以根据这些参考模型库来定制自己的构件,使用起来特别方便。
目前国际上较为流行的构件模型主要有:3C模型、CORBA模型、COM/DCOM模型、EJB模型等。3C模型是一个指导性的构件模型,认为对一个构件的描述应该包括概念(concept)、内容(content)和语境(context)三个不同方面的内容。从构件组装的角度可以将构件分为源代码级构件和二进制代码级构件。CORBA模型则是通过属性、功能接口和依赖关系三个部分来描述一个分布式二进制代码级构件,COM/DCOM模型和EJB模型与CORBA模型类似,侧重于实现分布式二进制代码级构件的复用。真正意义上的基于构件的软件开发模式是在源码件或者比它更高层次的设计件、分析件的基础上进行的,而就目前的研究情况来看,支持源码级组装的构件模型并不多。
1.3构件设计
构件在概念设计阶段主要是定义构件接口和描述构件功能。构件不仅要提供外部物理实现接口,还要提供一个外部逻辑接口,外部逻辑接口是给用户提供一个非形式化的该构件的功能描述,这样更能方便用户了解和使用构件。深入、明确的刻划构件功能有利于构件的重用,而构件功能的描述,就是通过构件的外部逻辑接口提供给用户的。构件的逻辑设计须在构件设计规范下进行,利用规范所提供的构件定义语言和构件操作语言来进行逻辑设计。构件的逻辑设计阶段和物理设计阶段是分开的,这样可以使构件有不同的语言实现版本。随着构件规范的标准化,今后构件的设计开发将由构件制造商来完成,这样不但减少了用户开发系统的周期,同时还会提高系统的质量和可靠性。
可以这样设计一个可复用构件:在设计一个构件A时,从提高复用性的角度出发需要将其内部某些功能相对独立的部分抽象出来,作为另外一些构件。假设某一功能独立部分抽象为构件B,则A中原来B所在的部分将被B的部分功能描述(注意不是B本身)所替代,这一部分就是A的协作构件。之所以说是B的部分功能描述,是因为这些功能描述可能只包括B中A要用到的那些功能,而不是B的全部功能。
构件设计应遵循以下原则:
- 构件应设计有很好的与语义有关的界面,界面构件要有标准。
- 构件将代表一个抽象,有很高的内聚力,并提供一些所需的特定操作、属性、事件和方法接口。
- 提高构件的复用程度,区分领域的可变与不可变部。
- 构件系统要向下兼容。
- 构件粒度大小、复杂度适中。
易于原型演化。