排查 Stateflow 图表中条件转换的模型覆盖率问题
如果为包含 Stateflow® 图的模型生成覆盖率结果,并且该图包含具有条件转换的连接点,则模型覆盖率结果可能不包含有关所有执行路径的完整覆盖率数据。因此,如果您生成代码覆盖率报告,模型覆盖率报告和代码覆盖率报告可能不匹配。要收集图中条件转换的完整覆盖率数据,您可以使用 in 运算符删除连接点或保护条件转换。
问题
考虑一个包含三个状态和一个连接点的 Stateflow 图。状态 A 和 B 过渡到一个交汇点,离开该交汇点的过渡有一个条件 c,该条件过渡到状态 C。

分析此图的模型覆盖率时,转换条件 c 会报告决策覆盖率。转换的决策覆盖率没有提供关于转换是源自状态 A 还是状态 B 的信息。该报告仅包含有关决策 c 是否为真或假的模型覆盖率数据。

当您在软件在环 (SIL) 模式下仿真同一图时,Embedded Coder® 会创建一个 switch case 模块来定义当前处于活动状态,并在 case 块内创建两个 if 语句来捕获转换逻辑。在这个示例中,代码生成器为该连接点生成以下代码:
case junct_cov_discrep_IN_A:
if (junct_cov_discrep_U.In1 != 0) case junct_cov_discrep_IN_B:
if (junct_cov_discrep_U.In1 != 0)if 语句位于定义活动状态的 case 块内,所以生成的代码的代码覆盖率包含了有关转换的完整信息。当您分析生成的代码的代码覆盖率时,Simulink® Coverage™ 会针对每个 if 语句报告一个决策,总共有四个决策结果。
可能的解决方案
要收集包含条件转换的连接点的 Stateflow 图表的完整模型覆盖率数据,您可以删除连接点,或者使用 in 运算符保护条件转换。
对于简单的图,去掉结点。如果删除连接点难以实现,或者会使图更难阅读,请改用 in 运算符。
移除具有多个源状态的条件连接
为确保模型覆盖率能够捕获所有条件覆盖率信息,请避免使用可从多个源状态到达且出口连接点有条件的连接点。在这个示例中,将连接点替换为从状态 A 和 B 到状态 C 的转换,并在到状态 C 的两次转换上添加条件 c。

由于存在两个独立的条件转换,因此覆盖率结果现在提供了有关完整执行路径的信息。

使用 in 运算符保护转换逻辑
或者,可以使用 in (Stateflow) 运算符来复制转换条件中的逻辑。在这个示例中,将转换条件 c 替换为 in(A) && c || in(B) && c。

现在,覆盖率结果提供了有关连接点之前和之后转换的完整执行路径的信息。

在这种情况下,转换还会报告修改后的条件决策覆盖率 (MCDC)。
另请参阅
in (Stateflow)