构件管理工具需求819.docx
《构件管理工具需求819.docx》由会员分享,可在线阅读,更多相关《构件管理工具需求819.docx(14页珍藏版)》请在冰豆网上搜索。
构件管理工具需求819
构件管理工具需求
一、构件需求分析
1.1概述
构件需求是领域需求中某一个小部分的具体化需求,是领域需求的精化。
是需求变化性的固定。
包括功能需求、用户需求、业务需求。
构件需求分析则是要求详细、准确地搞清楚构件必须做什么,它是构件实现者和用户之间的桥梁,内部结构则在高层展现了构件间的组织关系,并为构件的连接奠定了基础。
它是在领域需求和领域设计的基础上进行的,它是对领域涉及中的构件模块的具体分析。
构件需求分析的主要目的就是要给构件开发人员提供一个清晰的、精确的且无二义性的构件需求分析模型。
我们可以参考已有类似构件需求(通过遗产工程),结合实际,确定当前开发构件需求。
1.2输入
输入为DSSA,(但用户可以参考DRM和领域词典);表现形式为*.dsa的文件,内部数据描述采用adl。
1.3处理
1)打开.dsa文件,抽取出某个构件的adl数据,写入到新建的a.crd文件中。
2)填写构件属性。
使用语言、使用环境、功能要求、性能要求、对接口的规约描述。
3)把填写的属性写入a_CRD.cmp文件中,.cmp文件可以采用任何形式化文本进行描述,在此考虑使用规范的XML文件格式。
4)向a.crd文件中加入对需求属性文件a_CRD.cmp的扩展连接。
Properties
{//path为文件存放路径
PropertyRequirement:
CMPFile=path+”a_CRD.cmp”;
}
1.4输出
构件需求分析阶段的产物有两个:
一个需求属性文件A_CRD.cmp和一个构件需求描述文件a.crd。
A_CRD.cmp文件内容包括如下属性:
使用的语言和环境、功能和性能要求、对接口的规约描述,内部数据采用XML语法进行描述。
a.crd内容为dsa文件中抽取出来的a构件的相关信息并加入对a_crd.cmp的扩展链接。
内部数据采用ADL规范语法描述。
而A_CRD.cmp是包含在a.crd文件之中的,所以向构件设计阶段提供的支持其实就是a.crd文档。
二、构件设计
2.1概述
构件设计是对领域设计阶段产物(领域架构模型)中某一部分的进一步设计。
构件需求分析阶段得到的是构件需求分析模型,在构件设计阶段则对构件需求模型中表示的需求给出具体的解决方案,确定构件的运行环境,定义构件间的约束,通过架构建模工具建立构件架构模型,详细反映构件的内部组织结构,在此阶段还要对构件的接口进行详细定义。
对于通过遗产工程所提取的功能模块,需要根据构件需求对其进行适应性改造设计,即构件化。
此外,构件间通过连接件进行关联,连接件可以看成是一类特殊的构件,因此在设计阶段,还需要确定连接件的连接协议和数据转换方式。
通过构件设计最终得到构件的架构描述,包含构件的内部结构,组织关系,连接协议及数据转换方式,为构件实现提供输入。
构件设计的任务
构件设计的任务主要有两方面:
其一是在软件体系结构设计的基础上,对软件架构图中的软件构件进行详细的内部细节设计和控制过程的描述,即描述每一个构件确定采用的算法、块内数据结构以及接口的描述。
在描述时需要用到相应的设计工具,比如设计建模工具,在该工具中导入构件需求阶段得出的数据,进行后续设计。
其二是编写软件的“构件设计规格说明书”,这样在编码阶段,程序员就可以根据软件构件详细设计文档进行编码。
构件设计的主要工作
1.确定构件的内部结构细节,通过设计建摸工具进行描述。
2.确定每个构件采用的算法。
选择某种适当的设计工具描述算法的过程,并写出构件的详细过程性描述;
3.确定每一构件使用的数据结构;
4.确定构件接口的详细信息,包括对系统外部的接口和用户界面,对系统内部其他模块的接口,以及关于构件输入数据、输出数据及局部数据的全部细节。
5.对于连接件这类特殊的构件,需要确定其连接协议和数据转换方式。
6.确定构件的可视化属性信息,包括构件图示的大小、位置、颜色等信息。
在构件级设计阶段结束时,应该把上述工作的结果写入构件级设计规格说明书,作为下一阶段(实现阶段)工作的依据。
2.2基本操作
2.2.1新建构件设计图
构件设计必须建立在构件需求的基础上。
因此,新建构件设计图首先需要选择一个构件需求描述文件(ComponentName.crd)作为其基础。
新建构件设计图时,本工具将会复制这个构件需求描述文件的内容到一个空白的同名构件设计描述文件(ComponentName.cfd)里,作为设计描述文件的初始内容。
同时在同目录下新建一个空白的同名构件组成视图文件(Component-Name_ccv.cmp)作为存放可视属性的容器。
其中后者在工具的文件夹视图中对用户不显式可见。
2.2.2构件设计的保存和读取
用户按照一般的方式(在菜单或工具栏中选择“保存”)保存构件设计时,构件设计的内容分为两部分保存。
其中构件包含的子构件、构件的内部结构等信息保存在构件设计描述文件里,使用ADL描述;构件及其内部元素的可视属性,比如在图中的大小、位置等则以XML的形式保存在构件组成视图文件里。
而构件设计描述文件里还包含着构件组成视图文件的路径,以通过这种方式链接到构件组成视图文件。
当使用本工具打开.cfd文件时,若.cfd文件符合ADL描述规范,则可以通过读取.cfd文件与其所链接的.cmp文件还原构件设计图以及构件的可视属性。
2.2.3构件描述的查看和编辑
查看和编辑构件描述的方法与领域设计中查看/编辑架构描述的方法相同。
同样地,在构件设计图中的更改会反映到构件描述中。
在构件设计中,更改主要集中在构件的组成、接口的声明以及接口间的连接上。
值得注意的是,这一阶段的构件描述包含链接到构件组成视图文件的语句。
2.2.4可视属性的查看和编辑
可视属性的查看和编辑与领域设计中可视属性的查看和编辑大致相同。
即,除了直接调用连接图内的所有可放置元素都有X坐标、Y坐标、宽度、高度这四个可视属性,每种元素可能还会有各自特定的可视属性(尚未确定)。
这些属性确定了元素在构件设计图中的外观。
不同的是,构件设计中的可视属性存储在构件组成视图文件中。
2.3复合构件的设计
2.3.1子构件的添加/删除/移动
与领域设计中构件的添加/删除/移动大致相同。
不同点在于,添加子构件时必须在构件库中选择一个构件,如果构件库中没有需要的构件,则需要立即创建一个新构件,然后按照构件需求->构件设计的标准步骤先定义好子构件。
即子构件的设计必须先于父构件的设计,子构件必须是确定的。
2.3.2接口的添加/删除/移动
与领域设计中接口的添加/删除/移动相同。
2.3.3连接件的添加/删除/移动
构件设计中可以放置的连接件只有两种:
●直接调用连接。
操作方法与领域设计中的直接调用连接相同。
●非直接调用连接件。
代表除直接调用连接外所有类型的连接件,同样要经过需求->设计->实现->测试->提交的阶段。
在其设计阶段可以安排其所允许连接的接口数量以及对接口的要求等,具体参见下面的连接件设计部分。
与子构件的添加一样,添加非直接调用连接件时必须在连接件库中选择一个连接件,如果连接件库中没有需要的连接件,则需要立即创建一个新连接件,然后按照构件需求->构件设计的标准步骤先定义好连接件。
2.3.4接口的设计
接口的设计是指对接口所包含的操作进行声明。
接口的设计界面与属性视图融合在一起,作为接口属性视图的其中一页。
接口设计页包含选中接口的一个操作列表。
列表分成三栏:
返回类型,操作名,参数列表。
其中参数列表中的参数使用“参数类型形参名”的形式,参数之间用逗号分隔。
操作列表中的三栏均可编辑。
在接口设计页中点击右键,在菜单中选择“添加操作”,即可为列表添加一个条目。
而选中一个条目后在右键菜单中选择“删除操作”则可以删除这个操作。
2.4原子构件的设计
原子构件即内部不包含构件的构件。
除了无法在内部添加构件和连接件外,原子构件的设计与复合构件的设计完全相同。
2.4.1接口的添加/删除/移动
参照复合构件设计中接口的添加/删除/移动。
2.4.2接口的设计
参照复合构件中接口的设计。
2.5连接件的设计
连接件内部同样不包含构件、连接件,因此连接件的设计主要指的是规定连接件的连接类型,接口数量以及对接口的要求等。
连接件的设计界面与属性视图融合,作为连接件属性视图的其中一页。
三、构件实现
(一)代码转换工具的设计需求
因为所用的软件开发环境是基于嵌入式的软件开发环境,因而在开发新的软件项目时,已开发的构件模型即是我们将要开发软件功能的数据输入。
3.1数据输入
在进行代码转换时,我们需要考虑哪些东西作为数据输入;若将现有的构件作为数据输入时,又要考虑构件的组成部分以及它的设计思想是什么。
3.1.1构件特点
将构件模型作为数据输入时,其可以完成独立的功能,或可以完成某部分功能,则构件应该具有较强的独立性。
其特点应包括:
接口明确
功能明确
3.1.
主框架
不是所有的构件都能满足上述特点,在某些情况下构件设置的变量会很多,很杂乱等,则我们把构件的复杂部分集成框架,将其独立出来.
主框架主要包括以下控制:
显示控制
按键控制
算法控制
报警控制
时间控制
主框架的表示形式
main(){
init();
CreatDisplay();
CreatKey();
CreatArithmetic();
CreatAlarm();
CreatTime();
……………
}
显示控制的表示形式
DisplayControl(){
Switch(key){
Case0:
…….
Case1:
……..
…………..
Default();
}
}
算法控制的表示形式
ArithmeticControl(){
If(){……..}
Else{……….}
}
时间控制的表示形式
TimeControl(){
Delay(10);
………
}
2.1.3系统构件
除了一些相对功能简单的构件、独立的主框架之外,有时我们可能要调用、读取CPU或内存等底层的东西,而这些东西又与硬件直接相关。
所以,我们还应该把跟底层相关的操作设计成系统构件,取名为sysComponent。
例如:
设计一个系统构件DADriver,我们可取名为DADriver.CMP
实例:
DADriver.CMP
ComponentDADriver
{interface
>
Source=DADriver.c
2.1.4应用构件
可信嵌入式软件开发环境主要包含两条主线:
领域建模、构件添加入库和应用系统开发,且领域建模、构件添加入库是应用系统开发的必要前提。
当前我们开发的软件主要是面向呼吸机领域,设计出原子构件之后,其功能已经以.c和.h文件形式表示出来并会暴露一定的接口。
要设计应用构件时,若要开发的应用构件的部分功能在已构件中已经实现,则我们可以调用这些构件来实现。
例如:
要设计应用构件A(AppComponent),其要实现的某部分功能构件B(Component)已经实现,则我们可以调用构件B来实现。
应用构件的设计可分为两部分:
一、变量定义:
声明所要调用构件的模块;二、控制实现。
A(AppComponent)
变量定义:
调用控件:
B.a1,B.control等;
控制:
{
If(flag=true){
C=B.a1;
……………
}
}
3.2代码转换
3.2.1构件描述的特点:
已开发的构件模型是采用形式化语言ADL描述的,而开发的软件最终运行环境是使用C语言。
因此在利用已开发的构件模型时,需要将ADL描述语言转换成C语言。
在转换之前,首先要了解构件描述的特点:
构件描述中主要包括接口、连接体、构件和属性。
例如:
ComponentComponentName{
INTERFACES{
INTERFACE-DECLARATION;*
}
CONTAINS{
[COMPONENT-DECLARATION;]*COMPONENT-DECLARATION;
}
CONNECTS{
[COMP-NAME.Interface=CONN-NAME.Interface;]*
}
PROPERTIES{
PROPERTY-DECLARATION;*
}
}
其中ComponentName是复合构件名,Interfaces表示接口集合,INTERFACE-DECLARATION表示接口声明,CONTAINS表示复合构件包含的子构件集合,COMPONENT-DECLARATION表示构件声明,CONNECTS表示构件之间的连接关系,构件的连接是通过接口实现的,首先构件的接口与连接件的一端接口相连,然后连接件的另一端接口与另外一个构件相连,从而建立构件与构件之间的连接关系,Properties表示属性结合,PROPERTY-DECLARATION表示属性声明。
属性声明中,包含构件图元建模过程中的可视化显示属性、构件内部实现的属性以及其他属性,可视化显示属性的声明符合属性声明语法,具体为:
Propertyvisualization:
display=path+”visualization.XML”;
即构件的可视化属性单独存放于visualization.XML文件中,path表示路径。
同样,构件内部实现的属性也遵循属性声明语法,形式为:
PropertyImplementation:
IEC=”IEC代码”;
或者
PropertyImplementation:
CFile=path+”code.c”;
即实现也可以形成单独的c文件存放。
也可以直接将代码写入Implementation实现中。
3.2.2代码转换规则
.对复合构件描叙信息文件按ADL描叙语法进行扫描。
当扫描到第一个复合构件名称时,例如电机驱动构件描叙信息中当扫描到ComponentCMotor_Driver{……}时,将自动生成两个文件:
CMotor_Driver.c和CMotor_Driver.h。
其中CMotor_Driver.h中将必须生成如下代码:
#ifndef__MotoDrive_H__
#define__MotoDrive_H__
#endif/*__MotoDrive_H__*/
构件描述语言中,第一个描述的是复合构件的接口。
当扫描到每一个接口声明时,复制接口函数,并以同样的函数命名,到
CMotor_Driver.c文件中。
比如:
电机驱动中的接口声明,
InterfaceISpeed
{
VoidSet_Speed(uint16MotoValue);
}
则由构件的接口生成同名函数空体VoidSet_Speed(uint16MotoValue){}。
当扫描到contains时,将读取其子构件描述中的属性,并复制子构件的.c和.h文件到复合构件中。
当扫描到connects时,根据各构件间的接口关系,调用接口声明中的函数实体。
例如:
在第二步中,在实现了同名函数空体VoidSet_Speed(uint16MotoValue){}中加入write函数实体。
VoidSet_Speed(uint16MotoValue){
voidSPI1_Write(uint16MotoValue,uint8Channel_write)
{
staticunsignedchari;
staticuint8SpiTx[2],SpiRx[2];
if(Channel_write==0){
SpiTx[0]=(uint8)(MotoValue>>8);
SpiTx[0]=0x30|(SpiTx[0]&0x0f);
}
else{
SpiTx[0]=(uint8)(MotoValue>>8);
SpiTx[0]=0xb0|SpiTx[0];
}
SpiTx[1]=(uint8)MotoValue;
rSPCON1=rSPCON1|(1<<4);//SCK使能
rGPGDAT=rGPGDAT&(~(0x8));//SS1拉低
for(i=0;i<2;i++)
{
while(!
(rSPSTA1&0x1));//CheckTxreadystate
rSPTDAT1=SpiTx[i];
while(!
(rSPSTA1&0x1));//CheckRxreadystate
SpiRx[i]=rSPRDAT1;
}
rGPGDAT=rGPGDAT|0x8;//SS1拉高
rSPCON1=rSPCON1&(~(1<<4));//SCK禁止
}
}
(此块代码转换有问题,例如电机驱动函数中,
InterfaceInit
{
VoidMotoInit(void);
}
voidMotoInit(void)
{
SPI1_Write(0,0);
rGPJCON=(rGPJCON&(~((0x03<<4)|(0x03<<6)|(0x03<<8))))|((0x01<<4)|(0x01<<6)|(0x01<<8));//配置电机制动电机电源使能端
rGPJDAT=rGPJDAT|(0x01<<4)|(0x01<<2);;//对对应位为:
低,高,低电平
rGPJUP|=(0x07<<2);//禁止上拉
}
此块的MotoInit()函数中,SPI1_Write(0,0)调用是已经付了初值,调用函数无法实现,再者,电机驱动的配置不同,使用不同的芯片焊接引脚不同,且为电机初始化所特有。
)
3.3数据存储
整个复合构件代码实现构成的管理是以文件形式存在的,仍然以电机驱动为例:
当扫描到第一个复合构件名称时,例如电机驱动构件描叙信息中当扫描到ComponentCMotor_Driver{……}时,将自动生成两个文件:
CMotor_Driver.c和CMotor_Driver.h,CMotor_Driver.c又包含CMotor_Driver.c的文本文档格式的文件,CMotor_Driver.h又包含CMotor_Driver.h的文本文档格式的文件。
其中CMotor_Driver.h中将必须生成如下代码:
#ifndef__MotoDrive_H__
#define__MotoDrive_H__
#endif/*__MotoDrive_H__*/
如图:
构件描述语言中,第一个描述的是复合构件的接口。
当扫描到每一个接口声明时,复制接口函数,并以同样的函数命名,到CMotor_Driver.c文件中。
比如:
电机驱动中的接口声明,
InterfaceISpeed
{VoidSet_Speed(uint16MotoValue);}
则由构件的接口生成同名函数空体VoidSet_Speed(uint16MotoValue){}。
如图:
当扫描到contains时,将读取其子构件描述中的属性,并复制子构件的.c和.h文件到复合构件中。
例如:
当复合构件调用子构件ISpeed构件时,则将ISpeed构件中的功能代码spi.c和spi.h文件复制到复合构件中。
当扫描到connects时,根据各构件间的接口关系,调用接口声明中的函数实体。
例如:
在第二步中,在实现了同名函数空体VoidSet_Speed(uint16MotoValue){}中加入write函数实体。
如图:
数据存储的最终形式如图:
四、构件测试
五、构件提交
5.1输入:
构件生产管理工具各个阶段的产物汇总其包括:
a.cmp构件文件及a.dtc控制文件,a.cfd文件和a_ccv.cmp文件,A.CRD文件A_CRD.cmp文件。
5.2处理:
添加入库信息:
1、继承领域分析、领域设计阶段确定的构件属性信息如:
构件名称、构件标识信息。
继承领域管理阶段构件需求确定的相关属性信息如:
使用的语言以及环境、功能和性能
要求、对接口的规约描述。
2、收集构件生产管理各个阶段产物其包括:
构件需求阶段产生的构件需求描述文件a.crd;需求属性文件A_CRD.cmp;
构件设计阶段产生的构件组成视图文件a_ccv.cmp;构件设计描述文件a.cfd;
构件实现阶段产生的复合构件a.cmp构件文件;构件控制文件a.dtc;
构件测试阶段产生的完整可编译运行的ads工程文件夹目录;
3、添加构件入库的基本信息如:
构件的作者、构件制作日期、构件入库日期、版本号。
4、添加构件的可信属性包,包括非功能属性包和功能属性包。
可信属性包数据来源于构件生产各阶段采集的可信证据,其包括系统采集和人工采集两种采集方式,例如构件需求阶段人工采集的构件功能和性能要求属性信息、构件应用环境属性信息等。
5、对于硬件构件还需添加构件的物理属性包,其主要针对的是硬件构件的特性描述。
5.3输出:
整理构件生产管理各个阶段产生的文档以及添加的入库信息将构件存储的结构定义为:
构件标识信息+属性包+文档信息+实现代码;
构件标识信息
属性包
文档信息
实现代码
基本属性包
可信属性包
物理属性包
分析文档
设计文档
实现文档
测试用例
源代码信息
将整合的信息分类存储于文件系统中,并将其打包呈交给构件库管理员。