主要内容

本页采用了机器翻译。点击此处可查看英文原文。

S-Function 的覆盖率

此示例说明如何将使用代码继承工具生成的 S-Function 配置为与覆盖率兼容。此示例需要您安装受支持的编译器。有关支持的编译器列表,请参阅 Embedded Coder® 支持的编译器,网址为支持和兼容的编译器

模型覆盖率工具支持符合以下条件的 S-Function:

  • 使用代码继承工具生成,并且 def.Options.supportCoverage 设置为 true

  • 使用 SFunctionBuilder 生成,并且在 SFunctionBuilder 对话框的编译信息选项卡上选择了启用对覆盖率的支持,或者

  • 使用 slcovmex 函数编译。

打开示例模型

示例模型 slcoverage_lct_bus 包含使用代码继承工具生成的 S-Function。该 S-Function 具有可以接收决策、条件和 MCDC 覆盖率的结构。

打开 slcoverage_lct_bus

将 S-Function 配置为与模型覆盖率兼容

文件 counterbus.hcounterbus.c 中的遗留源代码实现了与 slcoverage_lct_bus/slCounter 中相同的算法。代码继承工具数据结构定义如下:

load_system('slcoverage_lct_bus');
open_system('slcoverage_lct_bus/TestCounter');
load slcoverage_lct_data.mat

def = legacy_code('initialize');
def.SFunctionName = 'slcoverage_sfun_counterbus';
def.OutputFcnSpec = ...
    ['void counterbusFcn(COUNTERBUS u1[1], ' ...
    'int32 u2, COUNTERBUS y1[1], int32 y2[1])'];
def.HeaderFiles   = {'counterbus.h'};
def.SourceFiles   = {'counterbus.c'};

要使此 S-Function 兼容模型覆盖率,请启用以下选项:

def.Options.supportCoverage = true;

使用 legacy_code 函数生成和编译 S-Function:

legacy_code('generate_for_sim', def);
### Start Compiling slcoverage_sfun_counterbus
mex -I/tmp/Bdoc26a_3233028_3129086/tpcb9c9b67/slcoverage-ex71096464 -c /tmp/Bdoc26a_3233028_3129086/tp25ccda17_a4fc_480c_8efa_4b06bf557a98/counterbus.c -outdir /tmp/Bdoc26a_3233028_3129086/tpaac16a35_8759_41e6_a9ac_fd8d72681b0e
Building with 'gcc'.
MEX completed successfully.
mex -I/tmp/Bdoc26a_3233028_3129086/tpcb9c9b67/slcoverage-ex71096464 /tmp/Bdoc26a_3233028_3129086/tp25ccda17_a4fc_480c_8efa_4b06bf557a98/tpb2a61854_304c_4103_bc62_0ffb0d8d0154.c /tmp/Bdoc26a_3233028_3129086/tpaac16a35_8759_41e6_a9ac_fd8d72681b0e/counterbus.o -L/mathworks/devel/bat/filer/batfs2566-0/Bdoc26a.3233028/build/runnable/matlab/bin/glnxa64 -lmwsl_sfcn_cov_bridge -output slcoverage_sfun_counterbus
Building with 'gcc'.
MEX completed successfully.
mex -I/tmp/Bdoc26a_3233028_3129086/tpcb9c9b67/slcoverage-ex71096464 -c /tmp/Bdoc26a_3233028_3129086/tpcb9c9b67/slcoverage-ex71096464/counterbus.c -outdir /tmp/Bdoc26a_3233028_3129086/tpaac16a35_8759_41e6_a9ac_fd8d72681b0e
Building with 'gcc'.
MEX completed successfully.
mex -I/tmp/Bdoc26a_3233028_3129086/tpcb9c9b67/slcoverage-ex71096464 /tmp/Bdoc26a_3233028_3129086/tp25ccda17_a4fc_480c_8efa_4b06bf557a98/slcoverage_sfun_counterbus.c /tmp/Bdoc26a_3233028_3129086/tp25ccda17_a4fc_480c_8efa_4b06bf557a98/tp25a4ffad_d070_49f2_93fc_ac01942506b4.c /tmp/Bdoc26a_3233028_3129086/tp25ccda17_a4fc_480c_8efa_4b06bf557a98/tpe02888d5_80f4_4807_ab1b_83165923bf58.c /tmp/Bdoc26a_3233028_3129086/tpaac16a35_8759_41e6_a9ac_fd8d72681b0e/counterbus.o -L/mathworks/devel/bat/filer/batfs2566-0/Bdoc26a.3233028/build/runnable/matlab/bin/glnxa64 -lmwsl_sfcn_cov_bridge -output slcoverage_sfun_counterbus
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling slcoverage_sfun_counterbus
### Exit

启用 S-Function 覆盖率

要为 S-Function 启用覆盖率收集,请在配置参数的覆盖率窗格对话框中选择 C/C++ S-Function。或者,通过命令行设置该选项:

set_param('slcoverage_lct_bus',...
          'CovMetricStructuralLevel', 'MCDC',...
          'RecordCoverage', 'on',...
          'CovSFcnEnable', 'on',...
          'CovSaveSingleToWorkspaceVar','on'...
          );

运行仿真并生成覆盖率报告

对模型进行仿真以记录覆盖率数据。在仿真结束时,使用 cvhtml 生成覆盖率结果的 HTML 报告,并在 HTML 查看器中打开该报告。

sim('slcoverage_lct_bus', 'StopTime', '20');
cvhtml('coverageResults', covdata);

从覆盖率数据对象中提取信息

cvdata 对象可用于提取 S-Function 的覆盖率信息,就像对任何其他受支持的模型元素一样。例如,decisioninfo 命令可以从模块路径或模块句柄中提取覆盖率信息。输出是一个向量,包含单个模型对象的已满足结果数和总结果数。

cov = decisioninfo(covdata, ...
    'slcoverage_lct_bus/TestCounter/slcoverage_sfun_counterbus')
cov =

     3     4

然后,您可以使用这些覆盖率信息来计算已覆盖模型对象的百分比:

percentCov = 100 * (cov(1)/cov(2))
percentCov =

    75

S-Function 覆盖率完全兼容模型覆盖率相关命令,例如 decisioninfoconditioninfomcdcinfo