一种对嵌入式软件架构进行重构的方法

文档序号:6602816阅读:550来源:国知局
专利名称:一种对嵌入式软件架构进行重构的方法
技术领域
本发明涉及一种对嵌入式软件架构进行重构的方法。
背景技术
目前,对于VxWorks、Acore等实时嵌入式系统下开发的软件,多使用到 AADL (Architecure Analysis and Design LiingU£ige))t^:#_iSi+itif i$。AADLi2004 年由AADL在国际汽车工程师协会(SAE)发布的工业标准AS5506,又叫架构分析设计语言, 主要是对嵌入式软件的实时性、容错、安全分区和动态认证等属性进行规约,它可用于软件 任务和通讯结构的描述和分布式多处理器硬件结构的描述。AADL可以使用三种模式进行描 述文本、图形和XML,且这三种模式之间可以相互转化。AADL是一种模型驱动的嵌入式软 件架构描述与分析语言,它可以描述构件之间的交互接口,比如数据的输入和输出,以及构 件的其他行为特性,如实时性、安全性等。此外,AADL的构件还具有扩展功能,用户可以在 新的扩展中定义新的属性。重构技术首先在硬件计算平台提出,是指通过改变硬件结构以适应具体应用的计 算平台。在FPGA领域,1986年Xilinx公司第一款基于SRAM的FPGA的问世,标志着硬件可 重构计算的开端。基于SRAM的FPGA具有重新配置电路功能和动态重构电路逻辑的能力。 随着软件的规模增大以及在计算系统中的重要性增强,软件领域开展动态重构变得十分必 要。在底层的操作系统级别,风河公司提出的VxWorks AE653操作系统,支持空间分区和时 间分区技术,使每个分区都有自己独立的栈空间和本地堆,本地的栈和堆不能被运行在其 它分区的程序抢占。这种隔离分区技术保证了程序运行的独立性,对软件可重构提供必要 的支持。在应用软件级别,多态软件是指在多态计算环境中完成指定计算使命的载体。多 态软件能够在不同计算模态下定制运行资源,进行软件重建与资源重构。模型驱动开发方式把嵌入式软件的开发从代码层次提高到模型层次,使得软件架 构模型能够对软件的设计和开发起指导作用。然而,现有的软件重构技术更多的是在软件 代码上实现软件重构,没有软件架构层次的分析和规划,缺乏对架构层次的性能分析,通用 性差且不能通过性能分析规划重构。

发明内容
要解决的技术问题为了避免现有技术的不足之处,本发明提出一种对嵌入式软件架构进行重构的方 法,解决了以往软件重构方法只从代码级别关注软件重构的问题。本发明的思想在于技术方案一种对嵌入式软件架构进行重构的方法,其特征在于步骤如下步骤1 从描述软件架构的AADL文本中第一个字符开始查检,当查检到out event port字符组,保存out event port字符组前面的一个字符;
当查检到in event port字符组,保存in event port字符组前面的一个字符;当查检到out data port字符组,保存out data port字符组前面的一个字符;当查检到in data port字符组,保存in data port字符组前面的一个字符;当查检到initial mode字符组,保存initial mode字符组前面的一个字符;当查检到mode字符,保存mode字符前面的一个字符;当查检到形如“字符1-[字符2]_>字符3”的字符组,保存字符组中的字符1、字 符2和字符3 ;当查检到形如“字符1 process字符2in modes (字符3,字符4) ”的字符组,保存 字符组中的字符2、字符3和字符4 ;当查检到形如“port字符1_>字符2 in modes (字符3,字符4),,的字符组,保存 字符组中的字符1、字符2、字符3和字符4 ;步骤2 在软件系统的程序中查找出调用步骤1中保存下来的字符程序模块,然后 在模块中加入监测字符值变化情况的语句,所述的语句能够把字符的值输出到指定的文件 中;步骤3 把经过步骤2处理后的软件系统加载到装有Tornado平台的PC主机上, 并在该PC主机上运行软件系统的程序,生成一个可以在VxWorks系统下运行的镜像文件;步骤4 把步骤3中的镜像文件通过网线下载到PC目标机上;所述的PC目标机为 装有VxWorks系统的PC目标机,且通过RJ-45接头网线与PC主机连接;步骤5 在目标机的VxWorks系统环境下运行镜像文件,将输出值返回PC主机;步骤6 =PC主机将从PC目标机返回的值与步骤2需要监测的字符值的值进行比 较,当字符的值有变化,使得引起调用该字符的功能模块失效,并且该功能模块没有冗余模 块时,将停止运行失效的功能模块,启动能完成同样功能的备用功能模块替代失效的功能 模块完成系统的运行任务;同时将步骤1中形如“字符1-[字符2]->字符3”字符组中的 字符1修改为备用功能模块的名称,将字符3修改为失效的功能模块名称,将形如“字符1 : process字符2 in modes (字符3,字符4) ”字符组中的字符2修改为备用功能模块的名 称;当字符的值有变化,使得引起调用该字符的功能模块失效,并且该功能模块有冗 余模块时,系统将停止运行失效的模块,启动冗余模块;同时将步骤1中形如“字符1-[字符 2]->字 符3”字符组中的字符1修改为冗余模块的名称,将字符3修改为失效模块的名称, 将步骤1中形如“字符1 :pr0cess字符2 in modes (字符3,字符4) ”字符组中的字符2修 改为冗余模块的名称,将步骤1中形如“port字符1->字符2inmodes (字符3,字符4) ”字 符组中的字符1修改为冗余模块的输出端口名称,将字符2修改为从冗余模块输出端口输 出的变量名称;当字符的值有变化,但没有引起调用该字符的功能模块失效,则不需要修改步骤1 中的软件架构;当字符的值没有变化维持原有软件架构。有益效果本发明提出的一种对嵌入式软件架构进行重构的方法,解决了以往软件重构方法 只从代码级别关注软件重构的问题,能够在软件架构层次建立软件重构蓝图用于分析和规划重构,并通过对软件运行状态的动态侦测,即时分析软件动态属性,根据重构蓝图和软件 运行的动态属性如可靠性、安全性等确定软件重构策略。


图1 为方法的原理流程2 为查检描述软件架构文本的流程3 为方法实施过程中确定软件架构重构方案的过程
具体实施例方式现结合实施例、附图对本发明作进一步描述例如对如下文本所描述的软件架构进行重构system Sysend Sys ;system implementation Sys. impsubcomponentscontroller :process Pcontroller ;Missionl :system Missionl. imp in modes (SMl);Mission2 :system Mission2. imp in modes(SM2);modesSMl :initial mode ;SM2 :mode ;SMl-[controller. switch_to_SM2]->SM2 ;SM2-[controller. switch_to_SMl]->SM1 ;end Sys. imp ;system Missionlend Missionl ;system Mission2end Mission2 ;system implementation Missionl. impsubcomponentscontroller :process Pcontroller ;Funcl :process Fund, imp in modes (MMl);Func2 :process Func2. impl in modes(MM2);modesMMl :initial mode ;MM2 :mode ;MMl-[controller. switch_to_MM2]->MM2 ;MM2-[controller. switch_to_MMl]->MM1 ; end Missionl. imp ;
system implementation Mission2. impsubcomponentscontroller :process Pcontroller ;Func2 :process Func2. impl in modes(MM3);Func3 :process Func2. imp2 in modes(MM3, MM4);Func4 :process Func3. imp in modes(MM4);modes MM3 :initial mode ;MM4 :mode ;MM3-[controller. switch_to_MM4]->MM4 ;MM4-[controller. switch_to_MM3]->MM3 ;end Mission2. imp ;process Pcontrollerfeaturesswitch_to_SMl :out event port ;switch_to_SM2 :out event port ;switch_to_MMl :out event port ;switch_to_MM2 :out event port ;switch_to_MM3 :out event port ;switch_to_MM4 :out event port ;end Pcontroller ;按步骤1,从文本的第一个字符开始查检,依次查检到字符组Missionl :system Missionl. imp in modes (SMl);Mission2 :system Mission2. imp in modes(SM2);SMl :initial mode ;SM2 :mode ;SMl-[controller. switch_to_SM2]->SM2 ;SM2-[controller. switch_to_SMl]->SM1 ;Funcl :process Fund, imp in modes (MMl);Func2 :process Func2. impl in modes(MM2);MMl :initial mode ;MM2 :mode ;MMl-[controller. switch_to_MM2]->MM2 ;MM2-[controller. switch_to_MMl]->MM1 ;Func2 :process Func2. impl in modes(MM3);Func3 :process Func2. imp2 in modes(MM3, MM4);Func4 :process Func3. imp in modes(MM4);MM3 :initial mode ;MM4 :mode ;
MM3-[controller. switch_to_MM4]->MM4 ;MM4-[controller. switch_to_MM3]->MM3 ;switch__to__SM1:OUteventport
switch__to__SM2:OUteventport
switch__to__MM1:OUteventport
switch__to__MM2:OUteventport
switch__to__MM3:OUteventport
switch__to__MM4:OUteventport保存的字符结果依次为Missionl. imp, SMI ;Mission2. imp, SM2 ;SMI ;SM2 ;SMI, controller. switch_to_ SM2, SM2 ;SM2, controller. switch_to_SMl, SMI ;Fund, imp, MM1 ;Func2. impl, MM2 ;MM1 ; MM2 ;MM1, controller. switch_to_MM2, MM2 ;MM2, controller. switch_to_MMl, MM1 ;Func2. impl, MM3 ;Func2. imp2, MM3, MM4 ;Func3. imp, MM4 ;MM3 ;MM4 ;MM3, controller. switch_to_ MM4,MM4 ;MM4, controller. switch_to_MM3, MM3 ;switch_to_SMl ;switch_to_SM2 ;switch_ to_MMl ; switch_to_MM2 ; switch_to_MM3 ; switch_to_MM4 ;按步骤2,从具有如上文本描述的软件架构的软件系统中找出与步骤1中保存下 来的字符相对应的程序模块,并加入监测字符变量的语句,如下所示
0113]#include"stdafx. h〃0114]#include"ServerUDP. h"0115]#include"ServerUDPDlg. h"0116]#ifdef_DEBUG0117]#define new DEBUG_NEff0118]#undef THIS_FILE0119]static char THIS_FILE[] = _FILE_ ;0120]#endif0121]class CAboutDlg:public CDialog0122]{0123]public 0124]CAboutDlgO ;0125]enum{IDD = IDD_AB0UTB0X};0126]protected 0127]virtual void DoDataExchange(CDataExchange氺pDX)0128]protected0129]DECLARE_MESSAGE_MAP()0130]};0131]CAboutDlg::CAboutDlgO:CDialog(CAboutDlg::IDD)0132]{0133]}0134]void CAboutDlg::DoDataExchange(CDataExchange^pDX)0135]{
0136]CDialog::DoDataExchange(pDX);
0137]}
0138]BEGIN_MESSAGE_MAP (CAboutDlg, CDialog)
0139]END_MESSAGE_MAP ()
0140]CServerUDPDlg::CServerUDPDlg(Cffnd^pParent/* = NULL*/)
0141]:CDialog(CServerUDPDlg::IDD, pParent)
0142]{
0143]m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
0144]i = 100 ;
0145]m_ServerSock = INVALID_SOCKET ;
0146]}
0147]void CServerUDPDlg::DoDataExchange(CDataExchange氺pDX)
0148]{
0149]CDialog::DoDataExchange (pDX);
0150]DDX_Control(pDX, IDC_EDIT2, m_edit2);
0151]DDX_Control(pDX, IDC_EDIT1,m_editl);
0152]}
0153]BEGIN_MESSAGE_MAP(CServerUDPDlg, CDialog)
0154]0N_WM_SYSC0MMAND ()
0155]0N_WM_PAINT ()
0156]0N_WM_QUERYDRAGIC0N ()
0157]0N_BN_CLICKED(IDC_BUTT0N1, OnButtonl)
0158]0N_MESSAGE(NETW0RK_EVENT, OnNetEvent)END_MESSAGE_MAP ()BOOL CServerUDPDlg::OnlnitDialog(){
8
CDialog::OnlnitDialog();
ASSERT((IDM_AB0UTB0X&0xFFF0) == IDM_AB0UTB0X);
ASSERT(IDM_AB0UTB0X < OxFOOO);
CMenu氺pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu ! = NULL)
{
CString strAboutMenu ;
strAboutMenu. LoadString(IDS—ABOUTBOX);
if ( ! strAboutMenu. IsEmpty ())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING,IDM.AB0UTB0X,strAboutMenu);}}SetIcon(m_hIcon, TRUE) ;Setlcon(m_hIcon, FALSE);return TRUE ;}void CServerUDPDlg::OnSysCommand(UINT nID, LPARAM 1Param){if ((nID&0xFFF0) = = IDM_AB0UTB0X){CAboutDlg dlgAbout ;dlgAbout. DoModal ();}else{CDialog: : OnSysCommand (nID, lParam);}}void CServerUDPDlg: :0nPaint(){if (IsIconicO){CPaintDC dc(this) ; SendMessage(WM_IC0NERASEBKGND,(WPARAM) dc. GetSaf eHdc (), 0);int cxlcon = GetSystemMetrics(SM_CXIC0N);int cylcon = GetSystemMetrics(SM_CYIC0N);CRect rect ;GetClientRect(&rect);int x = (rect. Width ()-cxIcon+l)/2 ;int y = (rect. Height ()-cylcon+l)/2 ;dc. Drawlcon (x, y, m_hIcon);}else{CDialog: :0nPaint();}} HCURS0R CServerUDPD1g::OnQueryDragIcon()
9
{return (HCURSOR) m_hIcon ;}void CServerUDPDlg: : InitSocket (){struct sockaddr_in server_addr ;WORD wVersion = MAKEffORD(2,0);WSADATA wsData ;WSAStartup (wVersion, &wsData);m_ServerSock = socket(AF_INET,SOCK_DGRAM,0);server_addr. sin_family = AF_INET ;server_addr. sin_port = htons(1000);server_addr. sin_addr. s_addr = htonl(INADDR_ANY);bind (m_ServerSock, (sockaddr*) &server_addr, sizeof(server_addr));WSAAsyncSelect(m_ServerSock,(HWND) (* (AfxGetApp () ->m_pMainffnd)),NETWORK_EVENT, FD_READ);}void CServerUDPDlg: : OnNetEvent (WPARAM wParam, LPARAM IParam){struct sockaddr_in client_addr ;int client_addr_size = sizeof(client_addr);int iEvent = WSAGETSELECTEVENT(IParam);switch (iEvent){case FD_CL0SE break ;case FD_READ m_editl. SetffindowText (“进入 FD_READ〃 );char pstrl[200];int i ;FILE*fp ;i = recvfrom(m_ServerSock, pstrl, 200,0, (sockaddr*) (&client_addr), &client_addr_size);if ( i = = S0CKET_ERR0R){ m_editl. SetffindowText (" ServerSock 接受数据失 败");i = WSAGetLastError ();
}m_edit2. SetffindowText(LPCTSTR(pstr1));if ((fp = fopenC test, txt",“ w+〃 )) = = NULL){printf(" cannot open file ! \n〃 );exit(O);}fputs (pstr 1, fp) ;//写入串fcl0Se(fp) ;//关闭文件m_edit2. SetffindowText(LPCTSTR(pstrx));break ;default :break ;}
}void CServerUDPDlg::OnButtonl(){InitSocketO ;m_editl. SetWindowText (〃 服务器端已启动〃 )·’}按步骤3,把以上步骤2中经过处理后的软件系统加载到PC主机上的Tornado平 台运行,生成Vxworks系统环境下的镜像文件;按步骤4,把步骤3中的镜像文件通过网线下载到PC目标机上;按步骤5,在PC目标机上运行镜像文件,运行结果被返回给PC主机;按步骤6,PC 主机端得到如下运行结果Missionl. imp, SM2 ;Mission2. imp, SM2 ;SMl ;SM2 ;SMl,controller. switch_to_SM2, SM2 ;SM2, controller. switch_to_SMl, SMl ;Fund, imp, MMl ;Func2. impl, MMl ;MMl ;MM2 ;MMl,controller. switch_to_MM2, MM2 ;MM2, controller. switch_to_MMl, MMl ;Func2. impl, MM4 ;Func2. imp2, MM3, MM4 ; Func3. imp, MM4 ;
MM3 ;
MM4 ;MM3, controller. switch_to_MM4, MM4 ;MM4, controller. switch_to_MM3, MM3 ;switch_to_SMl ;switch_to_SM2 ;switch_to_MMl ;switch_to_MM2 ;switch_to_MM3 ;switch_to_MM4 ;将以上结果与之前的字符进行比较,发生变化的有Missionl. imp, SM2 ;Func2. impl, MMl ;Func2. impl, MM4 ;根据变化情况,对软件的架构进行重构以后得到如下结果system Sysend Sys ;system implementation Sys. impsubcomponentscontroller :process Pcontroller ;Missionl :system Missionl. imp in modes (SM2);Mission2 :system Mission2. imp in modes(SM2);modesSMl :initial mode ;SM2 :mode ;SMl-[control ler. switch_to_SM2]->SM2 ;SM2-[controller. switch_to_SMl]->SMl ;end Sys. imp ;system Missionlend Missionl ;system Mission2end Mission2 ;system implementation Missionl. impsubcomponentscontroller :process Pcontroller ;Funcl -.process FuncL imp in modes (MMl);Func2 :process Func2. impl in modes (MMl);modesMMl :initial mode ;
MM2 :mode ;MMl-[controller. switch_to_MM2]->MM2 ;MM2-[controller. switch_to_MMl]->MMl ;end Missionl. imp ;system implementation Mission2. impsubcomponentscontroller :process Pcontroller ;Func2 :process Func2. impl in modes(MM4);Func3 :process Func2. imp2 in modes(MM3, MM4);Func4 :process Func3. imp in modes(MM4);modesMM3 :initial mode ;MM4 :mode ;MM3-[controller. switch_to_MM4]->MM4 ;MM4-[controller. switch_to_MM3]->MM3 ;end Mission2. imp ;process Pcontrollerfeaturesswitch_to_SMl :out event port ;switch_to_SM2 :out event port ;switch_to_MMl :out event port ;switch_to_MM2 :out event port ;switcn_to_MM3 :out event port ;switch_to_MM4 :out event port ;end Pcontroller ;
至此,已完成对当前软件系统架构重构。
权利要求
一种对嵌入式软件架构进行重构的方法,其特征在于步骤如下步骤1从描述软件架构的AADL文本中第一个字符开始查检,当查检到out event port字符组,保存out event port字符组前面的一个字符;当查检到in event port字符组,保存in event port字符组前面的一个字符;当查检到out data port字符组,保存out data port字符组前面的一个字符;当查检到in data port字符组,保存in data port字符组前面的一个字符;当查检到initial mode字符组,保存initial mode字符组前面的一个字符;当查检到mode字符,保存mode字符前面的一个字符;当查检到形如“字符1-[字符2]->字符3”的字符组,保存字符组中的字符1、字符2和字符3;当查检到形如“字符1process字符2 in modes (字符3,字符4)”的字符组,保存字符组中的字符2、字符3和字符4;当查检到形如“port字符1->字符2 in modes(字符3,字符4)”的字符组,保存字符组中的字符1、字符2、字符3和字符4;步骤2在软件系统的程序中查找出调用步骤1中保存下来的字符程序模块,然后在模块中加入监测字符值变化情况的语句,所述的语句能够把字符的值输出到指定的文件中;步骤3把经过步骤2处理后的软件系统加载到装有Tornado平台的PC主机上,并在该PC主机上运行软件系统的程序,生成一个可以在VxWorks系统下运行的镜像文件;步骤4把步骤3中的镜像文件通过网线下载到PC目标机上;所述的PC目标机为装有VxWorks系统的PC目标机,且通过RJ-45接头网线与PC主机连接;步骤5在目标机的VxWorks系统环境下运行镜像文件,将输出值返回PC主机;步骤6PC主机将从PC目标机返回的值与步骤2需要监测的字符值的值进行比较,当字符的值有变化,使得引起调用该字符的功能模块失效,并且该功能模块没有冗余模块时,将停止运行失效的功能模块,启动能完成同样功能的备用功能模块替代失效的功能模块完成系统的运行任务;同时将步骤1中形如“字符1-[字符2]->字符3”字符组中的字符1修改为备用功能模块的名称,将字符3修改为失效的功能模块名称,将形如“字符1process字符2 in modes (字符3,字符4)”字符组中的字符2修改为备用功能模块的名称;当字符的值有变化,使得引起调用该字符的功能模块失效,并且该功能模块有冗余模块时,系统将停止运行失效的模块,启动冗余模块;同时将步骤1中形如“字符1-[字符2]->字符3”字符组中的字符1修改为冗余模块的名称,将字符3修改为失效模块的名称,将步骤1中形如“字符1process字符2 in modes(字符3,字符4)”字符组中的字符2修改为冗余模块的名称,将步骤1中形如“port字符1->字符2 inmodes(字符3,字符4)”字符组中的字符1修改为冗余模块的输出端口名称,将字符2修改为从冗余模块输出端口输出的变量名称;当字符的值有变化,但没有引起调用该字符的功能模块失效,则不需要修改步骤1中的软件架构;当字符的值没有变化维持原有软件架构。
全文摘要
一种对嵌入式软件架构进行重构的方法。该方法从现有的软件架构中查检出软件架构的子构件,并在软件系统的源程序中找到对应的代码模块,向代码模块中植入侦测软件运行情况的程序语句,形成可实时侦测的软件系统。将可实时侦测的软件系统在PC主机的Tornado平台下生成新的系统镜像,将镜像下载到PC目标机的Vxworks系统环境下运行,侦测子构件的运行状况,运行结果返回主机端,与运行前的结果相比较,确定出软件架构的重构方案,实现对软件架构的重构。
文档编号G06F9/44GK101853159SQ201010178818
公开日2010年10月6日 申请日期2010年5月20日 优先权日2010年5月20日
发明者周兴社, 张凡, 李龙, 董云卫, 覃杨森 申请人:西北工业大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1