Page 85 - 《软件学报》2021年第6期
P. 85

苏卓  等:基于分支标记的数据流模型的代码生成方法                                                        1659


             根据本文提出的基于分支调度标记的数据流模型的代码生成方法,图 4 中的模型生成的代码如代码片段 3
         所示.
             代码片段 3.  由图 4 中模型生成的代码.
             1:   Sin_output=sin((Sin_t++)*0.01);
             2:   Expression1_output=Sin_output>0.5;
             3:   Expression2_output=Sin_output>−0.5;
             4:   if (Expression1_output){
             5:      Expression3_output=0.5+(Sin_output−0.5)*−3;
             6:      Expression4_output=Expression3_output>0;
             7:      Scale1_output=Expression3_output*2;
             8:      Expression5_output=Scale1_output+1;
             9:      if (Expression4_output){
             10:        printf(“SequencePlotter1:%f\n”,Expression3_output);
             11:    } else {
             12:        Scale2_output=Expression3_output*0.1;
             13:        printf(“SequencePlotter1:%f\n”,Scale2_output);
             14:    }
             15: } else {
             16:     if (Expression2_output){
             17:        Expression4_output=Sin_output>0;
             18:        Scale1_output=Sin_output*2;
             19:        Expression5_output=Scale1_output+1;
             20:        if (Expression4_output){
             21:           printf(“SequencePlotter1:%f\n”,Sin_output);
             22:       } else {
             23:           Scale2_output=Sin_output*0.1;
             24:           printf(“SequencePlotter1:%f\n”,Scale2_output);
             25:       }
             26:    } else {
             27:        Const_output=−1;
             28:        Expression5_output=Const_output+1;
             29:    }
             30: }
             31: printf(“SequencePlotter2:%f\n”,Expression5_output);
             可以看出,整体的代码逻辑为嵌套的两个 if-else 语句(第 4 行、第 15 行、第 16 行和第 26 行),这两个 if-else
         将控制逻辑分成了和图 4 中模型完全一致的 3 部分.模型中的 Expression4 和 BooleanSwitch3 组件及它们所有
         后继组件和 Scale1 组件都同时位于 BooleanSwitch1 的 True 分支和 BooleanSwitch2 的 True 分支下,所以它们会
         同时在两个 if-else 控制的语句块下出现(第 7 行、第 9 行~第 14 行、第 18 行、第 20 行~第 25 行).最后,
         SequencePlotter2 组件会在 if-else 的控制逻辑之后生成代码,并且由于该模型有两个输出组件,所以在生成的
         printf 代码中会标识出来是由哪个输出组件输出的数据(第 10 行、第 13 行、第 21 行、第 24 行和第 31 行).
             最后,我们基于上述带有各种分支情况的 4 个模型对 Simulink,PtolemyII 以及我们的代码生成器进行对比,
         对比指标包括代码行数、代码文件数和代码运行时间.由于 Simulink 不支持数据流的分支表达,所以我们将 4
   80   81   82   83   84   85   86   87   88   89   90