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