S-Function 的覆盖率
此示例说明如何将使用代码继承工具生成的 S-Function 配置为与覆盖率兼容。模型覆盖率工具支持符合以下条件的 S-Function:
使用代码继承工具生成,并且
def.Options.supportCoverage设置为true,使用 SFunctionBuilder 生成,并且在 SFunctionBuilder 对话框的编译信息选项卡上选择了启用对覆盖率的支持,或者
使用
slcovmex函数编译。
打开示例模型
示例模型 slcoverage_lct_bus 包含使用代码继承工具生成的 S-Function。该 S-Function 具有可以接收决策、条件和 MCDC 覆盖率的结构。
将 S-Function 配置为与模型覆盖率兼容
文件 counterbus.h 和 counterbus.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/Bdoc25b_2988451_557347/tp30e09482/slcoverage-ex71096464 -c /tmp/Bdoc25b_2988451_557347/tp5a15bf34_9de9_42d9_a0bc_22f41969cd09/counterbus.c -outdir /tmp/Bdoc25b_2988451_557347/tpb0b0b928_5a03_4d3a_a955_3c17663d84e3 Building with 'gcc'. MEX completed successfully. mex -I/tmp/Bdoc25b_2988451_557347/tp30e09482/slcoverage-ex71096464 /tmp/Bdoc25b_2988451_557347/tp5a15bf34_9de9_42d9_a0bc_22f41969cd09/tp2e4ab83d_40d3_4bb0_b9f4_a59c40a296d4.c /tmp/Bdoc25b_2988451_557347/tpb0b0b928_5a03_4d3a_a955_3c17663d84e3/counterbus.o -L/mathworks/devel/bat/filer/batfs2566-0/Bdoc25b.2988451/build/runnable/matlab/bin/glnxa64 -lmwsl_sfcn_cov_bridge -output slcoverage_sfun_counterbus Building with 'gcc'. MEX completed successfully. mex -I/tmp/Bdoc25b_2988451_557347/tp30e09482/slcoverage-ex71096464 -c /tmp/Bdoc25b_2988451_557347/tp30e09482/slcoverage-ex71096464/counterbus.c -outdir /tmp/Bdoc25b_2988451_557347/tpb0b0b928_5a03_4d3a_a955_3c17663d84e3 Building with 'gcc'. MEX completed successfully. mex -I/tmp/Bdoc25b_2988451_557347/tp30e09482/slcoverage-ex71096464 /tmp/Bdoc25b_2988451_557347/tp5a15bf34_9de9_42d9_a0bc_22f41969cd09/slcoverage_sfun_counterbus.c /tmp/Bdoc25b_2988451_557347/tp5a15bf34_9de9_42d9_a0bc_22f41969cd09/tp2f94c41e_dc12_4d8d_835b_1300ac415a83.c /tmp/Bdoc25b_2988451_557347/tp5a15bf34_9de9_42d9_a0bc_22f41969cd09/tpcc915840_b374_431c_9291_d107c9c235a7.c /tmp/Bdoc25b_2988451_557347/tpb0b0b928_5a03_4d3a_a955_3c17663d84e3/counterbus.o -L/mathworks/devel/bat/filer/batfs2566-0/Bdoc25b.2988451/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 覆盖率完全兼容模型覆盖率相关命令,例如 decisioninfo、conditioninfo 和 mcdcinfo。