一种精确分析任务WCET的自动化方法.docx
- 文档编号:30033443
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:16
- 大小:165.69KB
一种精确分析任务WCET的自动化方法.docx
《一种精确分析任务WCET的自动化方法.docx》由会员分享,可在线阅读,更多相关《一种精确分析任务WCET的自动化方法.docx(16页珍藏版)》请在冰豆网上搜索。
一种精确分析任务WCET的自动化方法
(一)发明名称
一种精确分析任务WCET的自动化方法
(二)技术领域
本发明涉及一种精确估算实时系统任务最差情况执行时间(WCET:
Worst-CaseExecutionTime)的自动化方法,属于实时嵌入式系统领域。
(三)背景技术
与通用计算机系统不同,实时系统的结果只有在规定的时间范围内完成时才是有效的,如果没有在规定的时间范围内完成时,轻则降低系统的性能,重则引起灾难性的后果,比如飞机投弹、核泄漏。
因此,对于实时系统,事先获取系统中每个任务的WCET和最好情况的执行时间(BCET:
Best-CaseExecutionTime)有着特别重要的意义。
鉴于BECT分析与WCET分析技术相同,人们只涉及WCET分析。
事实上,WCET分析是实时系统任务调度及可调度性检测的前提,也是系统性能瓶颈分析的基础。
WCET分析通常包括三个组成部分:
①程序流事实分析;②执行时间模型的建立;③基于前两项信息的WCET计算。
流事实信息就是程序的执行流信息,比如循环的最大迭代次数、不可行路径(infeasiblepath)等,其中不可行路径是指对任意输入数据都不可能执行的程序路径。
要获取程序的WCET,还需要对程序的目标代码进行分析以获得实际的时间,即建立执行时间模型。
举例来说,对于不带cache、没有流水线的传统CISC指令,其指令的执行时间是固定的,其执行时间模型就是:
一个代码段的执行时间就是其所对应的每条指令执行时间的累加。
计算是在给定程序流事实和执行时间模型的情况下,为程序计算WCET估值。
比如对于常见的基于树的(tree-based)计算方法,使用为每种类型的复合程序语句定义的规则确定语句的WCET,然后通过自底向上遍历程序的语法分析树产生整个程序的WCET估值。
具体来说,对于复合语句S1;S2,WCET(S1;S2)=WCET(S1)+WCET(S2);对于条件语句if(E)thenS1elseS2,WCET(if(E)thenS1elseS2)=WCET(E)+max(WCET(S1),WCET(S2));对于循环语句while(E)doS,WCET(while(E)doS)=(n+1)*WCET(E)+n*WCET(S),这里n为循环迭代次数。
有很多实时程序,其执行轨迹由程序的输入变量值或者范围确定的,在该条件下程序按照此轨迹执行。
举例来说,如表1所示的C程序:
表1例程Pow程序
floatPow(floatbase,intexponent){
1.inttimes;
2.BOOLexchange;
3.if(exponent<0)
4.times=-exponent;
5.else
6.times=exponent;
7.floatresult=1.0;
8.for(i:
=0;i 9.result=result*base; 10.if(exponent<0) 11.result=1/result; 12.returnresult; 13.} 假定exponent的范围为[-10,10],则依据基于树的方法和相应的指令代码,其WCET为: Wpow=50+111+max(301,283)+270+117+10(117+317)+111+max(560,0)+244=6040 其中,假定第3~6行程序对应的if语句的条件部分代码指令执行时间为111,两个分支的执行时间分别为301和283,第7行程序对应的赋值语句的代码指令执行时间为270,第8~9行程序对应的for语句的条件部分代码指令执行时间为117,第9行程序对应的赋值语句的代码指令执行时间为317,第10~11行程序对应的if语句的条件部分代码指令执行时间为111,第11行程序对应的赋值语句的代码指令执行时间为560,第12行程序对应的赋值语句的代码指令执行时间为244。 假定有如表2所示代码: 表2例程Pow调用程序 1.result=0; 2.for(i=-3;i<7;i++) 3.result=result+Pow(3,i); 则其中Pow部分的WCET为: 10*6040=60400 (四)发明内容(包括发明目的、技术方案和有益效果) 【发明目的】 本发明提出了一种自动产生任务WCET情况表达式的方法,利用该方法能够精确估算任务的WCET。 【技术方案】 本发明提出了一种自动产生任务的分情况WCET表达式的方法,利用该表达式能够精确估算任务的WCET。 本发明提出的自动化精确产生程序WCET的方法包括6个步骤,具体步骤如下: 步骤1: 产生程序的无循环控制流图NLCFG 程序控制流图(CFG,ControlFlowGraph),是对程序的图形化表示,它既表示了程序的控制结构信息,也表示了程序语句执行的流向。 一个结构化程序由三种基本语句构成: 复合语句、条件语句和循环语句。 控制流程图由节点和有向边组成。 与基本语句相对应,一个程序的控制流程图也由三种基本结构组成: 顺序、分支、循环。 控制流图节点分为赋值节点、分支点和汇聚点,赋值节点对应程序的赋值语句,分支节点对应条件语句或循环语句中的条件判断,此条件也称为分支谓词。 控制流图的边表示程序的执行流向,分支节点的边称作分支,对应于程序中一段要顺序执行的语句序列。 无循环控制流图(NLCFG,NoLoopControlFlowGraph)是一种特殊的控制流图,其与CFG的区别在于其循环语句产生的CFG节点只包括循环体节点而不包括分支谓词节点及相应的回边。 只所以产生NLCFG是因为本发明还没有为经过循环迭代的依赖输入情况提供解决方案,而循环的回边使后续的分析变得复杂。 通过分析源程序,按照程序的三种基本语句进行分析,能够产生程序的NLCFG。 程序NLCFG的节点可以使用数字进行标识,边可以用二元组(m,n)表示,其表示从节点m到节点n的有向边。 建立NLCFG之后,也建立起NLCFG节点与源程序语句的对应关系,同时循环体节点也得到标识。 步骤2: 利用NLCFG确定依赖输入变量及其对应节点 针对NLCFG,从入口节点开始,依照深度优先策略,确定每一个变量是否是依赖输入变量。 由输入变量定义的变量是依赖输入变量,由输入变量和依赖输入变量定义的变量也是依赖输入变量。 为了确定依赖输入变量及其对应的NLCFG节点,为每个节点设置节点执行前与执行后两个状态。 节点的状态定义了在该位置每个变量是否是依赖输入变量的。 节点后的状态是由该节点执行后对节点前状态改变后的状态,而节点前状态则由所有流向该节点的节点后状态确定。 在确定节点前状态时,对于所有流向该节点的节点,如果在这些节点的节点后状态中,该变量是依赖输入变量,那么可以确定,该变量的状态是依赖输入变量的。 所谓深度优先策略是指,在处理一个节点后,把该节点的所有后续节点的排队依次处理。 排队之后,对队列中的第一个节点仍然按照同样方法处理,这样只有在第一个节点及其后续节点处理完毕或者无法处理之后,才开始处理第二个节点。 一个节点是无法处理的,如果该节点有一个前任节点的执行后状态是不确定的,也就是说是没有定义的。 对于无法处理的节点,将该节点重新排在队列末尾。 一个节点m的前任节点是指该节点有一条边指向节点m。 同理,一个节点m的后续节点是指节点m有一条边指向该节点。 对于结构化程序,由于NLCFG没有循环结构,所以NLCFG有向图是单向的。 因此,NLCFG中的节点是有序的。 也因此,本发明所述的处理策略能够保证快速确定每个节点的状态。 所有引用依赖输入变量的节点为依赖输入节点。 步骤3: 确定依赖循环变量、依赖非输入分支变量及其节点 在循环体中定义的变量为依赖循环变量,一个变量如果在定义中引用了依赖循环变量,则该变量同样为依赖循环变量。 同样,在非依赖输入分支谓词的分支中定义的变量为依赖非输入分支变量,一个变量如果在定义中引用了依赖非输入分支变量,则该变量同样为依赖非输入分支变量。 这两类变量统称为非依赖输入变量NOINPUT。 针对一个循环体节点或者非依赖输入分支节点,通过确定一个变量在节点后状态为NOINPUT,从该节点开始,通过向后传递,可以确定所有的NOINPUT。 步骤4: 删除非依赖输入节点产生ICFG 针对NLCFG,删除图中非依赖输入节点。 删除的方法仍然按照节点的基本结构进行删除,所不同的是,如果一个分支节点或者汇合节点不包括任何节点,可以使用空节点表示。 所谓空节点就是不执行任何操作的节点。 空节点对应的语句为空语句。 最终形成的NLCFG为输入变量相关的,标记为ICFG。 步骤5: 产生ICFG的所有路径 对于ICFG,可产生其所有路径。 由于ICFG是单向图,可按照深度优先策略产生所有路径。 步骤6: 针对每条路径产生其输入条件 针对ICFG的每一条路径,在这个路径上只有两类节点,一类是对应于赋值语句的节点,另一类是对应于条件语句的分支节点。 对于分支节点,如果其分支谓词表达式是输入变量的线性表示,则可以构造出该分支谓词针对输入变量的线性表达式。 假定输入表示为X= dj= ,j=1,2,…,m 其中I0=(i1,..,ij,..,im)为任一输入,∆ij为任一不为0的增量。 I0最常见的值为(0,0,…,0)。 对于ICFG路径来说,该路径上每个分支节点分支取向已经确定,因而,可以根据路径上的所有分支节点构造输入变量的约束。 如果定义目标函数为所有输入变量累加的最小化,则构成典型的线性规划求解问题。 利用线性规划解析器,即可确定该ICFG路径的输入条件,此条件即为该情况的输入条件,如果线性规划解析器求得该目标函数无解,则说明该路径为不可行路径,则应排除该路径。 步骤7: 产生该路径对应的WCET 对于上述路径的WCET,其对应程序的WCET计算则应当只计算属于该路径的WCET。 具体而言,对于基于树的计算方法,差异体现在条件语句。 如果一个条件语句的分支谓词节点属于该路径,假定该条件语句为if(E)thenS1elseS2,如果在S1该路径上,则WCET(if(E)thenS1elseS2)=WCET(E)+WCET(S1),如果在S2该路径上,则WCET(if(E)thenS1elseS2)=WCET(E)+WCET(S2)。 【有益效果】 该方法能够明显提高具有不同情况执行路径程序的WCET估算精度。 还以表1所示的pow程序为例,该例程的WCET条件表达式为: 利用该条件表达式,表2所示程序中的Pow部分的WCET为: =(1714*3+434*(3+2+1))+(1136*7+434*(0+1+2+3+4+5+6)) =24812 该WCET的原估值为60400,现在估值只有原估算值的41.1%,精度提高58.9%。 (五)附图说明 图1是本发明的执行步骤流程图 图2程序基本语句与程序控制流程图基本结构的对应关系 BOOLDepenRelation(startNodeNode,endNodeNode,inputVarsVars){ 1.Initialize(); 2.InitializePre(startNode); 3.SetNodePreRelWith(startNode,vars,INPUT); 4.QUEUE.AddTail(startNode); 5.NodeiNode; 6.While(TRUE){ 7.iNode=QUEUE.GetHeadAndRemove(); 8.if(IsPreInitialize(iNode)==FALSE){ 9.QUEUE.AddTail(iNode);//后续再处理 10.continue; 11.}//if 12.InitializePro(iNode); 13.Pro(iNode)=Pre(iNode)); 14.if( x∈ref(iNode)∧Pre(iNode)(x)==INPUT){ 15.MarkNodeWith(iNode,INPUT);//标记此节点为INPUT节点 16.if(def(iNode)≠Φ) 17.SetNodeProRelWith(iNode,def(iNode),INPUT); 18.} 19.elseSetNodeProRelWith(iNode,def(iNode),INIT); 20.if(iNode==endNode)break; 21.NodesafterNodes=GetNodesAfter(iNode);//获取iNode的所有后续节点 22.for( jNode∈afterNodes) 23.if(for kNode∈getNodesBefore(jNode)IsProInitialize(kNode)){ 24.InitializePre(jNode); 25.For( x∈VAR) 26.if(for kNode∈getNodesBefore(jNode)Pro(kNode)(x)==INPUT) 27.Pre(jNode)(x)=INPUT; 28.ElsePre(jNode)(x)=INIT; 29.}//if 30.QUEUE.AddTail(afterNodes); 31.}//while 32.} 图3确定依赖输入的核心算法 图4表1程序的NLCFG 图5实例程序GetMode及其NLCFG (六)实施例 下面结合附图对本发明进行进一步的详细说明。 通过足够详细的描述这些实施示例,使得本领域技术人员能够实践本发明。 本发明提出了一种精确产生程序WCET的自动化方法,该方法利用程序控制流图(CFG,ControlFlowGraph)类似的图自动产生任务WCET情况表达式,从而达到精确估算任务WCET的目的。 本发明提出的自动化精确产生程序WCET的方法包括6个步骤,具体步骤如下: 步骤1: 产生程序的无循环控制流图NLCFG 与产生程序的CFG类似,同样通过对程序的三种基本语句构成: 复合语句、条件语句和循环语句,生成相应的三种基本结构组成: 顺序、分支和循环体,生成的对应关系如附图2所示。 对于条件语句,附图2中只表示了ifthenelse条件语句,对于ifthen语句和case语句可以类似处理。 对循环语句也同样如此。 通过对源程序进行分析,按照程序基本语句与NLCFG基本结构的对应关系,利用递归,能够产生程序的NLCFG。 程序NLCFG的节点可以使用从小到大数字1、2、3、…进行标识,边可以用二元组表示,比如(m,n)表示从节点m到节点n的有向边。 控制流图节点分为赋值节点、分支点和汇聚点。 赋值节点对应于程序的赋值语句,分支节点对应于条件语句的分支谓词。 建立NLCFG之后,也建立起每个CFG节点与源程序语句的对应关系。 对表1程序,其NLCFG如附图4所示,其共有8个节点,其中1、6为分支节点,2、3、4、5、7、8为赋值节点,返回语句也认为是赋值节点。 同时,节点5还为循环体节点。 对另一个实例程序GetMode,其源程序及其NLCFG如附图5所示。 步骤2: 根据CFG中产生依赖输入变量节点 对于一个节点m,定义其执行前状态为Pre(n),节点后状态为Pro(n)。 所谓状态是指每个变量都有一个取值,或者说每个变量对对特定值有一个映射。 为方便区分,定义三个特定值: INIT、INPUT和UNDEF,分布表示初始化、依赖输入和没有定义。 一个变量是依赖输入变量如果该变量能够完全被输入变量或者依赖输入变量定义。 对于被分析程序的入口节点I0,定义其执行前状态Pre(I0)为: 所有输入变量映射为INPUT,其余变量映射为INIT。 针对NLCFG,从入口节点开始,依照深度优先策略,确定每一个变量是否是依赖输入变量。 分析包括两步: (1)对节点的执行效果的分析; (2)对汇合节点的分析。 一个节点执行后的状态是由该节点执行前状态以及节点执行对状态的影响两部分决定的。 对于节点n,假定其定义的变量集合使用def(n)表示,其引用的变量集合使用ref(n)表示。 如果ref(n)中变量在Pre(n)中都是依赖输入变量,那么,在Pro(n)中,在保留Pre(n)中变量状态的基础上,定义def(n)中变量为依赖输入变量。 一个节点n的执行前状态是由所有该节点的前任节点状态确定。 节点m是节点n的前任节点,如果NLCFG中存在一条边(m,n)。 同时,节点n称为节点m的后续节点。 对于节点n的所有前任节点,如果所有这些节点执行后状态中,一个变量的所有状态是依赖输入变量,则节点n的执行前状态中该变量的状态为依赖输入变量INPUT,否则为INIT。 所谓深度优先策略是指,在处理一个节点后,把该节点的所有后续节点的排队依次处理。 排队之后,对队列中的第一个节点仍然按照同样方法处理,这样只有在第一个节点及其后续节点处理完毕或者无法处理之后,才开始处理第二个节点。 一个节点是无法处理的,如果该节点有一个前任节点的执行后状态是不确定的,即对于该前任节点的执行后状态,其所有变量的定义为UNDEF。 对于无法处理的节点,将该节点重新排在队列末尾。 具体的实现算法可参考图3。 在图3中,初始化函数Initialize用来将所有节点的执行前及执行后状态都设置为UNDEF。 与此不同的是,函数InitializePre(n)则用来初始化节点n的执行前变量状态,即将其变量状态设置为INIT。 同样,函数InitializePro(n)则用来初始化节点n的执行后变量状态,即将其变量状态设置为INIT。 根据变量状态,函数IsPreInitialize(n)和IsProInitialize(n)可以分别用来判断节点n执行前及执行后状态是否已经初始化。 函数SetNodePreRelWith(n,Vars,INPUT)把节点n执行前状态集合中Vars所指的变量的状态设置为值INPUT。 与此类似,函数SetNodeProRelWith(n,Vars,INPUT)是把节点执行后状态集合中Vars所指的变量状态设置为值INPUT。 而函数MarkNodeWith则把节点n标记为INPUT节点或者初始化节点。 为了便于有序遍历所要处理的NLCFG节点,设置一个队列用来安排遍历的顺序,在图3中使用QUEQU来表示该节点队列。 通过队列函数GetHeadAndRemove来获取队列的第一个节点并从队列中移除该节点。 通过函数AddTail把一个或者多个节点添加到队列尾部。 一个节点n可能会定义或者引用变量。 假定节点n对应语句U=(X-Y)*2,则def(n)={U}而ref(n)={X,Y}。 图4代码行21~27根据引用变量是否是依赖输入变量确定该节点是否是依赖输入节点,如果不是则设置该节点为初始化节点。 函数GetNodesAfter(n)得到的是节点n的所有后续节点集合,即如果有节点m,满足(n,m)是NLCFG的一条边,则有m∈GetNodesAfter(n)。 同样类似,GetNodesBefore(n)得到节点n的所有前任节点集合。 图4代码行21~27对被处理节点的所有后续节点进行处理。 其处理逻辑为,对任一后续节点,如果该节点所有前任节点都已经初始化过,则将该节点的执行前状态初始化,同时,设置该节点执行前的变量状态进行如下设置为: 对于一个变量x,如果该节点所有前任节点的执行后状态中变量x的状态都为INPUT,则该x的状态为INPUT,否则为INIT。 对表1程序及其附图4所示的NLCFG,其中1、2、3、6为依赖输入节点,其余节点为初始化节点。 对于附图5GetMode实例及其NLCFG,除节点13外,其余节点都为依赖输入节点。 步骤3: 确定依赖循环变量、依赖非输入分支变量及其节点 一个变量为依赖循环变量,如果该变量在循环体中定义,或者在该变量的定义中引用了依赖循环变量。 一个变量为依赖非输入分支变量,如果该变量在非依赖输入分支谓词的分支中定义,或者在该变量的定义中引用了非输入分支变量。 这两类变量统称为非依赖输入变量NOINPUT。 针对一个循环体节点或者非依赖输入分支节点,通过确定一个变量在节点后状态为NOINPUT,从该节点开始,通过向后传递,可以确定所有的NOINPUT。 针对一个循环体节点或者非依赖输入分支节点,,通过确定一个变量在节点后状态为NOINPUT,从该节点开始,通过向后传递分析,可以确定所有的NOINPUT变量。 向后传递分析方法和步骤2输入依赖分析类似,也包括两步: (1)对节点的执行效果的分析; (2)对汇合节点的分析。 此时,对于节点n,其分析与步骤2的分析有所不同: 如果ref(n)中有一个变量在Pre(n)中是NOINPUT,那么,在Pro(n)中,def(n)中变量为NOINPUT。 同样,节点n的所有前任节点中,如果有一个节点执行后状态中,变量x的状态是NOINPUT变量,则节点n的执行前状态中该变量的状态为NOINPUT。 同时,引用变量或定义变量中有NOINPUT变量的节点为NOINPUT节点。 对表1程序及其附图4所示的NLCFG,节点5和节点7为依赖循环节点。 对于附图5GetMode实例及其NLCFG,节点11、12、13为依赖循环节点。 步骤4: 删除非依赖输入节点产生ICFG 针对NLCFG,删除图中非依赖输入节点。 删除的方法仍然按照节点的基本结构进行删除,所不同的是,如果一个分支节点或者汇合节点不包括任何节点,可以使用空节点表示。 所谓空节点就是不执行任何操作的节点。 空节点对应的语句为空语句。 对表1程序及其附图4所示的NLCFG,将删除非依赖输入节点4、5、7、8,其中节点7、8将设置为空节点。 对于附图5GetMode实例及其NLCFG,将删除非依赖输入节点11、12、13,节点11、12、13也将设置为空节点。 最终形成的NLCFG为输入变量相关的,标记为ICFG。 步骤5: 产生ICFG的所有路径 对于ICFG,可产生其所有路径。 由于ICFG是单向图,可按照深度优先策略产生所有路径。 对表1程序的ICFG,其路径共有四条: (1,2,6,7,8)、(1,2,6,8)、(1,3,6,7,8)、(1,3,6,8)。 对于图5实例程序的ICFG,其路径共有12条,包括(1,2,3,5,6,7,10,11,13)、(1,2,3,5,8,10,12,13)、(1,2,4,5,8,9,10,12,13)等。 步骤6: 针对每条路径产生其输入条件 假定对于路径(1,2,3,5,6,7,10,11,13),对于其中节点5,假定其谓词针对输入的线性表达式为F5(X,Y,Z)=aX+bY+cZ+d。 令X=2,Y=1,Z=100,沿着该路径,可以计算出F5(2,1,100)=2,F5(3,1,100)=4,所以可以求得a为: a=(F5(3,1,100)-F5(2,1,100))/(3-2)=2 同样,可以求
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 一种 精确 分析 任务 WCET 自动化 方法