增强代码的可读性流程图
为流程图所生成的代码
如果你有嵌入式编码器®你为模型,包括Stateflow生成代码®对象,代码从一个流程图类似样品。
应用以下特征:
默认情况下,生成的代码使用
if-elseif-else
语句来表示开关
模式。把要使用的代码切换实例
语句,看到If-Elseif-Else代码转换为切换实例语句。默认情况下,变量出现在流程图不保留他们的名字在生成的代码中。确保没有修改标识符命名冲突发生。
可追溯性的评论出现在每组之间的转换
/ *
和* /
标记。了解更多关于可追溯性,明白了跟踪Stateflow元素生成的代码。
示例代码的决策逻辑模式
如果(modelname_U。In1 = = 1.0){/ *转型:“< S1 >: 11 * / / *转型:“< S1 >: 12”* / modelname_Y。着干活= 10.0;/ *过渡:“< S1 >: 15 ' * / / *转型:“< S1 >: 16”其他* /}{/ *转型:“< S1 >: 10”如果(modelname_U * /。In1 = = 2.0){/ *转型:“< S1 >: 13 * / / *转型:“< S1 >: 14 * / modelname_Y。着干活= 20.0;/ *转型:“< S1 >: 16 * /}{/ *转型:其他的< S1 >: 17 * / modelname_Y。着干活= 30.0;}}
一个迭代循环的示例代码模式
(sf_i = 0;sf_i < 10;sf_i + +){/ *转型:“< S1 >: 40 * / / *转型:“< S1 >: 41 * / modelname_B。y = modelname_B。y + modelname_U.In1;/ *转型:“< S1 >: 39”* /}
一个开关模式的示例代码
如果(modelname_U。In1 = = 1.0){/ *转型:“< S1 >: 149”* / / *转型:“< S1 >: 150 * / modelname_Y。着干活= 1.0;/ *转型:“< S1 >: 151”* / / *转型:“< S1 >: 152”* / / *转型:“< S1 >: 158”* / / *转型:“< S1 >: 159”其他* /}{/ *转型:“< S1 >: 156”如果(modelname_U * /。In1 = = 2.0){/ *转型:“< S1 >: 153”* / / *转型:“< S1 >: 154 * / modelname_Y。着干活= 2.0;/ *转型:“< S1 >: 155”* / / *转型:“< S1 >: 158”* / / *转型:“< S1 >: 159”其他* /}{/ *转型:“< S1 >: 161 * / modelname_Y。着干活= 3.0;}}
转换If-Elseif-Else
代码切换实例
语句
为嵌入式实时目标生成代码时,您可以选择转换if-elseif-else
代码切换实例
语句。这种转换可以提高代码的可读性。例如,当一个流程图包含一长串的条件,切换实例
结构:
减少使用括号和大括号
最大限度地减少重复生成的代码
如何将If-Elseif-Else
代码切换实例
语句
转换规则
转换发生,遵循这些指导方针。lh和RHS参考左边和右边的条件,分别。
构造 | 规则 |
---|---|
流程图 | 必须有一个默认的和两个或两个以上的独特的条件。 有关更多信息,请参见重复的条件。 |
每个条件 | 必须测试平等。 |
必须使用相同的变量或lh的表达式。你可以扭转lh和RHS。 |
|
每一个韩 | 必须是一个变量或表达式。 |
不能一个常数。 |
|
必须有一个整型或枚举数据类型。 |
|
不能有任何副作用模拟。 例如,lh可以读但不能写全局变量。 |
|
每一个园艺学会 | 必须是一个常数或一个参数。 |
必须有一个整型或枚举数据类型。 |
重复的条件
如果一个流程图有重复的情况下,转换只保留第一个条件。丢弃重复条件的其他实例的代码。
删除重复后,必须存在两个或两个以上的独特条件。如果不是,转换不发生和代码包含了所有重复的条件。
生成的代码的例子 | 代码转换后 |
---|---|
if (x = = 1) {block1} else if (x = = 2) {block2} else if (x = = 1){/ /复制block3} else if (x = = 3) {block4} else if (x = = 1){/ /复制block5} {block6}其他 |
开关(x){案例1:block1;打破;案例2:block2;打破;案例3:block4;打破;默认值:block6;打破;} |
if (x = = 1) {block1} else if (x = = 1){/ /复制block2} {block3}其他 |
没有变化,因为只有一个独特的条件存在 |
转换代码的例子切换实例
语句
假设你有这个模型包含一个图表。
图表包含一个流程图和四个MATLAB®功能。
图表的MATLAB函数包含在表中列出的代码。在每种情况下,内联函数的选择是汽车
。内联函数的更多信息,请参阅指定属性的图形功能(Stateflow)。
MATLAB函数 | 代码 |
---|---|
停止 |
函数停止% # codegen coder.extrinsic (disp);disp (“。”) traffic_speed = 0; |
经济放缓 |
函数放缓% # codegen coder.extrinsic (disp) disp(“慢下来”。)traffic_speed = 1; |
加速 |
功能加速% # codegen coder.extrinsic (disp);disp(“沿着”。)traffic_speed = 2; |
光 |
函数=光色(x) % # codegen if (x < 20)颜色= TrafficLights.GREEN;elseif (x > = 20 & & < 25)颜色= TrafficLights.YELLOW;其他颜色= TrafficLights.RED;结束 |
输出颜色
函数的光
使用枚举类型TrafficLights
。枚举类型定义TrafficLights.m
是:
classdef TrafficLights <仿金宝app真软件。IntEnumType枚举红(0)黄(5)绿(10)结束
有关更多信息,请参见定义枚举数据类型(Stateflow)。
验证流程图的内容
检查流程图Stateflow图表遵循规则转换规则。
构造 | 如何构建遵循规则 |
---|---|
流程图 | 一个默认的条件和两个独特的条件存在:
|
每个条件 | 每一个条件:
|
每一个韩 | 每个lh:
|
每一个园艺学会 | 每一个园艺学会:
|
使转换
打开模型配置参数对话框。
在代码生成窗格中,选择
ert.tlc
为系统目标文件ERT-based目标模型。在代码生成>代码风格窗格中,选择转换if-elseif-else模式切换实例语句复选框。
如果您选中此复选框后,转换适用于:
在所有图表模型的流程图
一个模型的MATLAB函数在所有图表
所有MATLAB函数在这种模式
在模型中,C代码选项卡上,单击构建从模型中生成源代码。
解决生成的代码
生成的代码流程图出现这样的代码:
如果(sf_color = =红色){/ *转型:“< S1 >: 11”* / / *转型:“< S1 >: 12”* / / * MATLAB函数“停止”:“< S1 >: 23”* / / *的< S1 >: 23:6 * / rtb_traffic_speed = 0;/ *过渡:“< S1 >: 15 ' * / / *转型:“< S1 >: 16”其他* /}{/ *转型:“< S1 >: 10 * / / * MATLAB函数“光”:“< S1 >: 19”如果(ifelse_using_enums_U * /。In1 < 20.0){/ *的< S1 >: 19:3 * / / * < S1 >:第4节的* / sf_color =绿色;如果(ifelse_using_enums_U}其他。In1 > = 20.0) & & (ifelse_using_enums_U。In1 < 25.0)){/ *的< S1 >:上19:5 * / / * < S1 >:十九章的* / sf_color =黄色;其他}{/ *的< S1 >: 19:8 * / sf_color =红;}如果(sf_color = =黄色){/ *转型:“< S1 >: 13 * / / *转型:“< S1 >: 14 * / / * MATLAB函数“放缓”:“< S1 >: 24 * / / *的< S1 >: 24:6 * / rtb_traffic_speed = 1;/ *转型:“< S1 >: 16”其他* /}{/ *转型:‘< S1 >: 17 * / / * MATLAB函数“加速”:“< S1 >: 25”* / / *的< S1 >: 25:6 * / rtb_traffic_speed = 2;}}
由于MATLAB函数光
出现内联,不等比较出现在这些行代码:
如果(ifelse_using_enums_U。In1 < 20.0) {....如果(ifelse_using_enums_U}其他。In1 > = 20.0) & & (ifelse_using_enums_U。In1 < 25.0)) {....
因为不平等出现在的主体if-elseif-else
转换为代码流程图切换实例
语句不发生。做下列之一:
指定的功能
光
没有出现内联。看到改变了内联函数的性质。修改流程图。看到确保切换实例语句修改流程图。
改变了内联函数的性质。如果您不想修改你的流程图,改变内联函数的性质光
:
右键单击函数框
光
并选择属性。在properties对话框中,内联函数的选择中,选择
函数
。点击好吧关闭对话框。
请注意
你不需要更改为其他三个内联属性图的MATLAB函数。因为流程图不调用这些函数在评价条件,这些函数可以保持内联属性汽车
。
当你为你的模型重新生成代码,代码流程图现在出现这样的代码:
开关(ifelse_using_enums_light (ifelse_using_enums_U.In1)){案例红:/ *转型:“< S1 >: 11 * / / *转型:“< S1 >: 12”* / / * MATLAB函数‘停止’:‘< S1 >: 23 * / / *的< S1 >: 23:6 * / ifelse_using_enums_Y。着干活= 0.0;/ *过渡:“< S1 >: 15 ' * / / *转型:“< S1 >: 16”* /休息;例黄色:/ *转型:‘< S1 >: 10 * / / *转型:‘< S1 >: 13 * / / *转型:‘< S1 >: 14 * / / * MATLAB函数“放缓”:“< S1 >: 24”* / / *的< S1 >: 24:6 * / ifelse_using_enums_Y。着干活= 1.0;/ *转型:“< S1 >: 16 * /休息;默认值:/ *转型:' < S1 >: 17 * / / * MATLAB函数“加速”:“< S1 >: 25”* / / *的< S1 >: 25:6 * / ifelse_using_enums_Y。着干活= 2.0;打破;}
由于MATLAB函数光
不再出现内联,转换切换实例
语句发生。增强可读性,切换实例
语句提供这些好处:
减少了使用括号及括号的代码。
lh表达式
ifelse_using_enums_light (ifelse_using_enums_U.In1)
只出现一次,减少重复的代码。
确保切换实例语句修改流程图。如果你不想改变内联函数的性质光
、修改你的流程图:
添加本地数据表
color_out
的枚举类型TrafficLights
。取代的每个实例
光(路口)
与color_out
。添加操作
{color_out =光(十字路口)}
的缺省转换流程图。
现在的图类似于这个图表:
当你为你的模型重新生成代码,代码流程图使用切换实例
语句。