一种通过静态分析测算代码指令最长运行时间的方法

文档序号:6632511阅读:649来源:国知局
一种通过静态分析测算代码指令最长运行时间的方法
【专利摘要】一种通过静态分析测算代码指令最长运行时间的方法,首先解析待分析源代码对应的机器码指令序列,识别指令序列中分支指令的源地址和目标地址,得到指令的执行周期数。然后建立指令序列对应的有向无环图,按照有向无环图计算最长路径的方法,计算最长执行周期数,进而得到最长运行时间。如果建立有向无环图遍历过程中有向后跳转指令,则建立的是有向有环图,而且环还是有次数的,次数就是源代码中对应的循环次数,通过确定循环对应的循环体和循环次数,能够消除循环把有向有环图变成有向无环图,进而得到代码指令的最长运行时间。
【专利说明】一种通过静态分析测算代码指令最长运行时间的方法

【技术领域】
[0001] 本发明涉及一种基于静态分析代码对应的机器码指令序列来测算软件代码最长 运行时间的方法,特别是一种航天嵌入式软件的最长执运行时间测算方法,属于技术嵌入 式软件可靠性分析验证领域。

【背景技术】
[0002] 实时系统要求的确定性决定了软件运行时间是实时系统的核心指标,尤其对于航 天嵌入式实时软件而言,软件运行时间影响到整星(器、船)的系统时序,是系统及软件时 序设计的关键,尤其在一些通讯、数据交换和中断服务程序等场合,软件运行时间有严格的 约束要求,软件设计如何满足时间要求有时是一件比较困难的工作。
[0003] 目前软件代码的运行时间测量主要依赖动态执行代码来获得,一般有两种方式, 一种是通过修改软件,插入特定代码,比如输出硬件信号在示波器上捕捉软件中输出的信 号来测试得到,或者记录处理器的地址线和数据线上插入标志的时标来统计得到。另一种 是在虚拟仿真硬件环境中,通过统计执行过的指令来获取运行时间。
[0004] 这些依赖动态执行代码来获得运行时间的方法,都需要外部的工具,修改代码改 变了原有时序特性,记录总线时标或依赖虚拟仿真硬件环境的方式成本比较高。通过测量 发现性能不满设计要求时,需要调整算法或者优化软件,并再次测试,效率比较低。
[0005] 通过不执行软件代码也可以很好的解决这个问题。比如《软件学报》第14卷第1 期发表的"程序执行时间的静态预估与可视化分析方法"中,提到基于源代码的程序运行时 间的可视化分析方法,通过分析源代码的控制流程图,建立源代码与对应机器码之间的关 联从而得到源代码执行的指令周期数,基于源代码程序结构建立二叉树结构,依此来计算 源代码的运行时间。
[0006] 然而,这种方法存在一个问题,源代码编译有优化选项时,源代码的程序结构与机 器码的程序结构并不是一一对应的,这种方法不适用于航天嵌入式软件。


【发明内容】

[0007] 本发明解决的技术问题是:针对航天器上用的SPARC体系结构处理器和ANSI C编 程语言的问题,提供了一种不需要动态执行代码,通过静态分析指令序列的控制结构,来建 立有向无环图,用指令的执行周期数作为权值,从而计算出最长运行时间的方法。
[0008] 本发明的技术解决方案是:一种通过静态分析测算代码指令最长运行时间的方 法,包括如下步骤:
[0009] (1)设置SPARC体系结构中源代码对应的指令序列中每条指令的初始信息;所述 指令的内容包括序号、执行周期数、源地址和目标地址,序号代表每条指令在指令序列中从 〇开始的整数编号,执行周期数代表指令执行需要的计算机处理器周期数、源地址代表跳转 到本指令的指令的序号集合、目标地址代表本指令将要跳转执行的指令的序号,其中执行 周期数初始值为0,源地址和目标地址初始值为-1;
[0010] (2)逐条解析指令序列中的每条指令,如果是分支指令,则将本条指令的目标地址 记为本分支指令将要跳转执行的指令序号,同时本分支指令将要跳转执行的指令的源地址 添加本分支指令序号;如果不是分支指令,则本条指令的目标地址和源地址不变;
[0011] (3)从指令序列的第一条指令开始逐条判断指令的序号与本指令目标地址的大 小,如果某条指令的目标地址不为-1且序号大于目标地址,则判定该指令是向后跳转指 令,将该指令作为起始指令,以该指令目标地址指令为终点截取的一段指令序列作为待分 析指令序列,并转到步骤(4);如果某条指令的序号小于目标地址,则判定该指令是顺序或 向前跳转指令,继续解析指令序列中的下一条指令;
[0012] (4)分析待分析指令序列,提取其没有向后跳转指令的指令序列子集,查询 SPARCV8指令集手册获得指令序列子集中各指令对应的执行周期数数值,将指令序列子集 中的每条指令作为有向图中的一个点,在有顺序关系的前后指令之间,以及向前跳转指令 的源地址和目标地址之间建立有向线,权值为有向线起始点指令的执行周期数,建立有向 无环图,根据有向无环图计算最长执行周期数,最长执行周期数与每个指令执行周期对应 的绝对时间相乘得到最长运行时间;所述每个指令执行周期对应的绝对时间由计算机处理 器的频率确定;
[0013] (5)以当前向后跳转指令为起点,以原指令序列第一条指令为终点,逆序分析原指 令序列,解析第一个出现的产生SPARC体系结构条件码的指令,得到两个操作数,将在后续 的逆序分析中有自加、自减运算的操作数作为循环变量,将在后续的逆序分析中只有赋值 操作的操作数作为代表循环次数的操作数,当代表循环次数的操作数是常值时,该常值记 为循环次数,当代表循环次数的操作数是操作地址或者从寄存器得到的值时,则分析当前 向后跳转指令对应的调用函数,分析调用函数的循环变量,循环变量对应物理参数的取值 范围的最大值作为循环次数;获得循环次数后,与步骤(4)得到的指令序列子集的最长运 行时间相乘得到待分析指令序列的最长运行时间,并将待分析指令序列的最长运行时间赋 值给当前向后跳转指令的执行周期数,将待分析指令序列与指令序列中其余指令的跳转关 系赋予当前向后跳转指令据此更新当前向后跳转指令的源地址和目标地址;
[0014] (6)用赋值后的当前向后跳转指令替代原指令序列中的待分析指令序列;
[0015] (7)将替代后的指令序列作为新的原指令序列,重复步骤⑶?步骤(6)直至新的 原指令序列没有向后跳转指令后转入步骤(8);
[0016] (8)查询SPARCV8指令集手册获得新的原指令序列中各指令对应的执行周期数数 值,并分别赋予各个指令,将指令序列中的每条指令作为有向图中的一个点,在有顺序关系 的前后指令之间,以及向前跳转指令的源地址和目标地址之间建立有向线,权值为有向线 起始点指令的执行周期数,建立有向无环图,根据有向无环图计算最长执行周期数,最长执 行周期数与每个指令周期对应的绝对时间相乘得到代码指令最长运行时间;所述每个指令 执行周期对应的绝对时间由计算机处理器的频率确定。
[0017] 本发明与现有技术相比的优点在于:
[0018] (1)与依靠动态执行的方法相比,本方法不需要执行代码,通过静态分析指令序 列,就可以计算出最长路径上指令的周期数,使星载嵌入式软件时序验证可以提前开展,而 且性能测定的方法相比现有的动态测试的方法更有效、更高效;
[0019] (2)与"程序执行时间的静态预估与可视化分析方法"相比,本方法直接对二进制 机器码进行静态分析,不依赖于源代码和编译优化选项,适用性更强。

【专利附图】

【附图说明】
[0020] 图1为本发明方法向前和向后跳转示意图;
[0021] 图2为本发明方法指令序列结构图;
[0022] 图3为本发明方法一次消除循环示意图。

【具体实施方式】
[0023] 结构化编程语言如C语言的源代码,语句结构有顺序、分支和循环三种,SPARC体 系结构语言编译后,指令序列有以下几个特点:
[0024] (1)指令序列只有顺序和分支两种语句结构,分支包括向前跳转和向后跳转,如图 1 ;向前跳转对应C语言中的if-else和switch两种分支结构,向后跳转对应C语言中的 for、while和do-while三种循环结构,一次循环的机器码指令序列如图2 ;
[0025] (2)向前跳转和向后跳转这两种语句结构可以有包含关系,但不会有交叉。也就是 说,向前跳转和向后跳转这两种指令的跳转开始(源地址)和跳转结束(目标地址)这个 范围内可以包含其他的跳转指令,但不允许跳转到其他跳转语句的开始和结束范围内。也 就是说,先开始的跳转后结束,而后开始的跳转先结束;其中,跳转指令本身的地址称为源 地址,跳转指令中解析出的待跳转去的地址称为目标地址。
[0026] (3)向后跳转对应的是源代码中的循环结构,会执行多次,对一个具体函数来说循 环次数是个常数或是个变量。常数就是常值或全局常量,变量就是全局变量、虚参或者函数 内的临时计算值,考虑航天器软件可靠性设计措施,对于循环次数不确定的情况,比如临时 计算值作为循环次数,要求增加最大循环次数的保护,避免异常情况下不确定的循环次数 或死循环,因此循环次数的上限一般都是可预先确定的;
[0027] (4) -条分支指令只有一个目标地址,但任意一条指令可能会有多条源地址,也就 是说一条分支指令只能去一个地址,但任意一条指令可能会有多条分支指令的目标地址指 过来;
[0028] (5) -个函数的指令序列一般只有一个入口,一个出口,但有jmpl指令时,会提前 退出。
[0029] 基于上述SPARC体系结构处理器上C语言编译后指令序列的特点,通过静态分析 机器码指令序列的控制结构,建立起有向图,指令的执行周期数作为权值,如果没有向后跳 转指令,有向图就是无环图,有向无环图的最长路径解算有成熟的方法。
[0030] 如果有向后跳转指令,有向图就是有环图,为了简化计算,就要消除环,把有向有 环图变成有向无环图。有环的地方就是循环,其实就是循环体执行了多次而已。循环体本身 可能还包含循环体,但采用递归的方法,最里面的循环体就是简单的顺序和向前跳转两种 语句结构,因此只要确定了循环体和循环次数,就可以实现把有向有环图变成有向无环图。
[0031] 1、指令序列预处理
[0032] 对待分析的SPARC体系结构源代码对应的机器码指令序列进行指令格式解析,识 别分支指令的源地址和目标地址,获取每条指令的相关信息。
[0033] (I. 1)设置每条指令的初始信息
[0034] 整个指令序列称为IS,其中每条指令具有以下信息:序号offset、执行周期数 cycle、一组源地址addrFrom,一个目标地址addrTo。如下所示为一次循环的源代码和对应 的机器码指令序列,图2为指令序列结构图。

【权利要求】
1. 一种通过静态分析测算代码指令最长运行时间的方法,其特征在于包括如下步骤: (1) 设置SPARC体系结构中源代码对应的指令序列中每条指令的初始信息;所述指令 的内容包括序号、执行周期数、源地址和目标地址,序号代表每条指令在指令序列中从〇开 始的整数编号,执行周期数代表指令执行需要的计算机处理器周期数、源地址代表跳转到 本指令的指令的序号集合、目标地址代表本指令将要跳转执行的指令的序号,其中执行周 期数初始值为〇,源地址和目标地址初始值为-1 ; (2) 逐条解析指令序列中的每条指令,如果是分支指令,则将本条指令的目标地址记为 本分支指令将要跳转执行的指令序号,同时本分支指令将要跳转执行的指令的源地址添加 本分支指令序号;如果不是分支指令,则本条指令的目标地址和源地址不变; (3) 从指令序列的第一条指令开始逐条判断指令的序号与本指令目标地址的大小,如 果某条指令的目标地址不为-1且序号大于目标地址,则判定该指令是向后跳转指令,将该 指令作为起始指令,以该指令目标地址指令为终点截取的一段指令序列作为待分析指令序 列,并转到步骤(4);如果某条指令的序号小于目标地址,则判定该指令是顺序或向前跳转 指令,继续解析指令序列中的下一条指令; (4) 分析待分析指令序列,提取其没有向后跳转指令的指令序列子集,查询SPARCV8指 令集手册获得指令序列子集中各指令对应的执行周期数数值,将指令序列子集中的每条指 令作为有向图中的一个点,在有顺序关系的前后指令之间,以及向前跳转指令的源地址和 目标地址之间建立有向线,权值为有向线起始点指令的执行周期数,建立有向无环图,根据 有向无环图计算最长执行周期数,最长执行周期数与每个指令执行周期对应的绝对时间相 乘得到最长运行时间;所述每个指令执行周期对应的绝对时间由计算机处理器的频率确 定; (5) 以当前向后跳转指令为起点,以原指令序列第一条指令为终点,逆序分析原指令序 列,解析第一个出现的产生SPARC体系结构条件码的指令,得到两个操作数,将在后续的逆 序分析中有自加、自减运算的操作数作为循环变量,将在后续的逆序分析中只有赋值操作 的操作数作为代表循环次数的操作数,当代表循环次数的操作数是常值时,该常值记为循 环次数,当代表循环次数的操作数是操作地址或者从寄存器得到的值时,则分析当前向后 跳转指令对应的调用函数,分析调用函数的循环变量,循环变量对应物理参数的取值范围 的最大值作为循环次数;获得循环次数后,与步骤(4)得到的指令序列子集的最长运行时 间相乘得到待分析指令序列的最长运行时间,并将待分析指令序列的最长运行时间赋值给 当前向后跳转指令的执行周期数,将待分析指令序列与指令序列中其余指令的跳转关系赋 予当前向后跳转指令据此更新当前向后跳转指令的源地址和目标地址; (6) 用赋值后的当前向后跳转指令替代原指令序列中的待分析指令序列; (7) 将替代后的指令序列作为新的原指令序列,重复步骤(3)?步骤(6)直至新的原指 令序列没有向后跳转指令后转入步骤(8); (8) 查询SPARCV8指令集手册获得新的原指令序列中各指令对应的执行周期数数值, 并分别赋予各个指令,将指令序列中的每条指令作为有向图中的一个点,在有顺序关系的 前后指令之间,以及向前跳转指令的源地址和目标地址之间建立有向线,权值为有向线起 始点指令的执行周期数,建立有向无环图,根据有向无环图计算最长执行周期数,最长执行 周期数与每个指令周期对应的绝对时间相乘得到代码指令最长运行时间;所述每个指令执 行周期对应的绝对时间由计算机处理器的频率确定。
【文档编号】G06F11/36GK104407968SQ201410601684
【公开日】2015年3月11日 申请日期:2014年10月30日 优先权日:2014年10月30日
【发明者】党纪红, 陈朝晖, 尚葳蕤, 杨彬, 李经松, 关小川 申请人:北京控制工程研究所
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1