一种从嵌入式软件代码中自动抽象软件架构的方法

文档序号:6600781阅读:392来源:国知局
专利名称:一种从嵌入式软件代码中自动抽象软件架构的方法
技术领域
本发明涉及一种从嵌入式软件代码中自动抽象软件架构的方法,嵌入式软件应用 中软件架构抽象的技术。
背景技术
随着计算机软件技术的发展,在对新的软件系统进行设计和实现过程中,遗产软 件所发挥的借鉴作用也日益突出,软件的重用技术显得尤为重要。对于遗产软件所能发挥 出的作用,除了它自身保留有的数据之外,更重要的是它本身的架构模型。因为,基于对遗 产软件架构模型的理解,我们可以更好地扩展或裁剪软件的功能,设计更优越的维护方案。 同时,通过运用合理的描述方法对软件系统架构进行描述,可以让不同领域的技术人员更 好的理解软件的架构,并能够对软件提出更具针对性和实用性的改进方案,以提高软件质 量。目前,对于VxWorks、Acore等实时嵌入式系统下开发的软件,多使用到 AADL (Architecure Analysis and Design LangUEige))(寸白勺i殳i十itif i$。AADLi2004 年由AADL在国际汽车工程师协会(SAE)发布的工业标准AS5506,又叫结构分析设计语言, 主要是对嵌入式软件的实时性、容错、安全分区和动态认证等属性进行规约,它可用于软件 任务和通讯结构的描述和分布式多处理器硬件结构的描述。AADL可以使用三种模式进行描 述文本、图形和XML,且这三种模式之间可以相互转化。AADL是一种模型驱动的嵌入式软 件架构描述与分析语言,它可以描述构件之间的交互接口,比如数据的输入和输出,以及构 件的其他行为特性,如实时性、安全性等。此外,AADL的构件还具有扩展功能,用户可以在 新的扩展中定义新的属性。然而,现有的遗产软件更多的是只有软件代码,没有架构描述及其架构中构件间 的交互信息,软件专业技术人员很难利用AADL及其工具从软件架构层次上对软件的属性 进行分析,在系统维护和新系统的设计过程中,无法分析遗产代码中构件间的交互、硬件与 软件间的联接关系,因此,新开发或被维护软件的非功能属性也很难进行量化分析,从而降 低了遗产代码的重用性,并使得软件系统的质量保障能力下降。

发明内容
要解决的技术问题为了避免现有技术的不足之处,本发明提出一种从嵌入式软件代码中自动抽象软 件架构的方法。技术方案一种从嵌入式软件代码中自动抽象软件架构的方法,其特征在于步骤如下步骤 1 从源代码的第一个字进行逐个查检,当查检到的字为数据定义类,将当前数据定义类字和下一个字保存;当查检到的字为运算符号类,跳过当前运算符号类字;
当查检到的字为控制语句类,记录下该控制语句类模块的起始查检点,并继续查 检,直至找到该控制语句类模块的结束点,跳出该控制语句类模块;当查检到的字为函数创建类,保存当前函数创建类字,并在当前函数创建类字中 继续查检出函数名称、函数传递的参数类型和函数传递的参数名称,并保存;
所述数据定义类为define ;static ;typedef ;struct ;int ;float ;char ;double ;bool ;void ;auto ;所述运算符号类为〈;〉;/;*;”;(;);{;}; ! ;+;-;%;=; ;& 空格;所述控制语句类为for;while ;if ;do ;else ;return ;所述函数创建类为:taskSpawn ;semBCreate ;msgQCreate ;sizeof ;semTake ;semGive ;msgQSend ;msgQReceive ;intConnect ;步骤2 按照数据定义类的特征定义与数据定义类相应的DTD文档;步骤3 按照函数创建类的特征定义与函数创建类相应的DTD文档;步骤4:遵循DTD文档,按如下方式描述步骤1中保存的查检结果对于数据定义类,描述数据的类型和数据的名称;对于函数创建类中的taskSpawn,描述任务函数名称和任务函数的ID号;对于函数创建类中的semBCreate,描述进程名称、进程发送的信号量类型和名称、 进程接收的信号量的类型和名称、进程发送和接收的信号量的ID号;对于函数创建类中的msgQCreate,描述线程名称、线程发送的消息类型和名称、线 程接收的消息类型和名称、线程发送和接收的消息ID号;步骤5 将步骤4的描述结果作为待解析的文档对象,确定文档对象的根结点为解 析的起始结点;步骤6 沿着起始起点,依次解析文档对象的全部结点;步骤7 根据结点的解析结果,依次在AADL的模型空间中得到与解析结果相对应 的模型构件,并用AADL文本对模型构件进行描述,将这些构件的描述结果按照解析次序显 示在同一 AADL文本中,形成软件源代码的架构模型。有益效果本发明提出的一种从嵌入式软件代码中自动抽象软件架构的方法,解决了遗产代 码的架构抽象和构件间交互关系的描述,有利于系统非功能属性的分析,提高了遗产代码 的重用性和软件系统的质量。


图1为方法实施流程图;图2为方法中查检软件源代码的过程;图3为方法中使用XML语言描述源代码查检结果的过程;图4为方法中解析XML文本的过程;图5为方法中结点解析结果与软件架构模型相互对应的关系图;
具体实施例方式现结合实施例、附图对本发明作进一步描述
例如抽象如下VxWorks系统下的源代码段的架构#include "vxWorks. h,,#include "msgQLib. h”#define MAX_MSGS(10)#define MAX_MSG_LEN(100)#define MESSAGE "Greetings from Task 1”MSG_Q_ID myMsgQId ;taskl (void){if ((myMsgQId = msgQCreate (MAX_MSGS, MAX_MSG_LEN, MSG_Q_PRI0RITY))== NULL)return (ERROR);if(msgQSend(myMsgQId, MESSAGE, sizeof(MESSAGE), WAIT_F0REVER, MSG_PRI_ NORMAL)== ERROR)return (ERROR);}task2 (void){char msgBuf[MAX_MSG_LEN];if (msgQReceive (myMsgQId, msgBuf, MAX_MSG_LEN, WAIT_F0REVER) = = ERROR)return (ERROR);printf ( "Message from task l:\n% s\n,,,msgBuf);}按步骤1,从源代码的第一个字开始查检,查检得到的结果数据定义类有charmsgBuf [MAX_MSG_LEN];函数创建类有msgQCreate (MAX_MSGS, MAX_MSG_LEN, MSG_Q_PRI0RITY);msgQSend(myMsgQId, MESSAGE, sizeof (MESSAGE), WAIT_F0REVER, MSG_PRI_ NORMAL)msgQReceive (myMsgQId, msgBuf, MAX_MSG_LEN, WAIT_F0REVER)按步骤2,根据数据定义类的特征,定义DTD文档< ! D0CTYPE Data[< ! ELEMENT Data (name+, type+, size+)>< ! ELEMENT name(#PCDATA)>< ! ELEMENT type (#PCDATA)>< ! ELEMENT size (#PCDATA)>] >按步骤3 根据函数创建类的特征,定义DTD文档< ! D0CTYPE MsgQ [
< ! ELEMENT MsgQ(parameter+, send+, receive+))< ! ELEMENT send(send_msgQId+, send_paramater+)>< ! ELEMENT msgQId(#PCDATA)>< ! ELEMENT send_paramater(#PCDATA)>< ! ELEMENT receive(receive_msgQId+, receive_paramater+)>< ! ELEMENT msgQId(#PCDATA)>< ! ELEMENT receive_paramater(#PCDATA)>] >按步骤4,遵循DTD文档,描述查检结果<Data><name>msgBuf</name><type>char</type><size>MAX_MSG_LEN</size></Data><MsgQ><paramater>MAX_MSGS</paramater><paramater>MAX_MSG_LEN</paramater><paramater>MSG_Q_PRIORITY</paramater><send><send_msgQId>myMsgQId</send_msgQId><send_paramater>MESSAGE</send_paramater><send_paramater>WAIT_FOREVER</send_paramater><send_paramater>MSG_PRI_NORMAL</send_paramater></send><receive><receive_msgQId>myMsgQId</receive_msgQId><receive_paramater>msgBuf</receive_paramater><receive_paramater>MAX_MSG_LEN</receive_paramater><receive_paramater>WAIT_FOREVER</receive_paramater></receive></MsgQ>按步骤5,确定<Data>为文档对象的起始结点;按步骤 6,依次解析 <Data>、<name>、<type>、<size>、<MsgQ>、<paramater>、 <paramater>、 <paramater>、 <send>、 <send_msgQId>、 <send_paramater>、 <send_ paramater>、 <send_paramater>、 <receive>、 <receive_msgQId>、 <receive_paramater>、 <receive_paramater>、<receive_paramater> 结点,得至丨J角军析结果 msgBuf > char、MAX_MSG_ LEN、MAX_MSGS、MAX_MSG_LEN、MSG_Q_PRI0RITY、myMsgQId、MESSAGE、WAIT_F0REVER、MSG_ PRI_N0RMAL、myMsgQId、msgBuf、MAX_MSG_LEN、WAIT_F0REVER ;按步骤7,根据步骤6中解析结果,在AADL的模型空间中得到data、process.connections, data port构件,用AADL文本对构件描述,形成软件源代码的架构模型package basic_data—typepublicdata IntegerpropertiesSource—Data—Size = >32b ;end Integer ;data FloatpropertiesSource—Data—Size = >32b ;end Float ;end basic_data—type ;system sysend sys ;system implementation sys. impl
subcomponentspro_ins :process pro. impl ;end sys. impl ;process proend pro ;process implementation pro. implconnectionsdata port taskl_ins. MESSAGE_>task2_ins. msgBuf ;end pro. impl ;至此,方法已经完成对软件源代码架构的抽象。
权利要求
一种从嵌入式软件代码中自动抽象软件架构的方法,其特征在于步骤如下步骤1从源代码的第一个字进行逐个查检,当查检到的字为数据定义类,将当前数据定义类字和下一个字保存;当查检到的字为运算符号类,跳过当前运算符号类字;当查检到的字为控制语句类,记录下该控制语句类模块的起始查检点,并继续查检,直至找到该控制语句类模块的结束点,跳出该控制语句类模块;当查检到的字为函数创建类,保存当前函数创建类字,并在当前函数创建类字中继续查检出函数名称、函数传递的参数类型和函数传递的参数名称,并保存;所述数据定义类为define;static;typedef;struct;int;float;char;double;bool;void;auto;所述运算符号类为<;>;/;*;”;(;);{;};!;+;-;%;=;;&;#;空格;所述控制语句类为for;while;if;do;else;return;所述函数创建类为taskSpawn;semBCreate;msgQCreate;sizeof;semTake;semGive;msgQSend;msgQReceive;intConnect;步骤2按照数据定义类的特征定义与数据定义类相应的DTD文档;步骤3按照函数创建类的特征定义与函数创建类相应的DTD文档;步骤4遵循DTD文档,按如下方式描述步骤1中保存的查检结果对于数据定义类,描述数据的类型和数据的名称;对于函数创建类中的taskSpawn,描述任务函数名称和任务函数的ID号;对于函数创建类中的semBCreate,描述进程名称、进程发送的信号量类型和名称、进程接收的信号量的类型和名称、进程发送和接收的信号量的ID号;对于函数创建类中的msgQCreate,描述线程名称、线程发送的消息类型和名称、线程接收的消息类型和名称、线程发送和接收的消息ID号;步骤5将步骤4的描述结果作为待解析的文档对象,确定文档对象的根结点为解析的起始结点;步骤6沿着起始起点,依次解析文档对象的全部结点;步骤7根据结点的解析结果,依次在AADL的模型空间中得到与解析结果相对应的模型构件,并用AADL文本对模型构件进行描述,将这些构件的描述结果按照解析次序显示在同一AADL文本中,形成软件源代码的架构模型。
全文摘要
一种从嵌入式软件代码中自动抽象软件架构的方法,技术特征在于自动查检嵌入式软件系统的源代码,将源代码中的字分为数据定义类、运算符号类、控制语句类和函数创建类。查检结束后,该方法根据数据定义类和函数创建类的特征定义相应的DTD文档,用XML语言描述查检结果,并对描述的结果进行解析。该方法根据解析结果,在AADL模型空间中得到对应的模型构件,用AADL文本描述模型构件,形成软件源代码的架构模型。解决了遗产代码的架构抽象和构件间交互关系的描述,有利于系统非功能属性的分析,提高了遗产代码的重用性和软件系统的质量。
文档编号G06F9/44GK101807147SQ20101014714
公开日2010年8月18日 申请日期2010年4月15日 优先权日2010年4月15日
发明者周兴社, 张凡, 王庚, 董云卫, 覃杨森 申请人:西北工业大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1