S-Function 的覆盖率
此示例显示如何配置使用 Legacy Code Tool 生成的 S-Function 以与覆盖率兼容。模型覆盖率工具支持以下 S-Function:
使用 Legacy Code Tool 生成,将
def.Options.supportCoverage
设置为true
,使用 SFunctionBuilder 生成,并在 SFunctionBuilder 对话框的编译信息选项卡上选择启用对覆盖率的支持,或者
使用
slcovmex
函数进行编译。
打开示例模型
示例模型 slcoverage_lct_bus 包含使用 Legacy Code Tool 生成的 S-Function。S-Function 具有接收决策、条件和 MCDC 覆盖率的构造。
配置 S-Function 以与模型覆盖率兼容
文件 counterbus.h 和 counterbus.c 中的旧源代码实现了与 slcoverage_lct_bus/slCounter 中相同的算法。Legacy Code Tool 数据结构体定义如下:
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/Bdoc24a_2589924_2082858/tp4a572a81/slcoverage-ex71096464 -c /tmp/Bdoc24a_2589924_2082858/tpaa4d77d6_eb45_453a_b34f_b392a1432ced/counterbus.c -outdir /tmp/Bdoc24a_2589924_2082858/tp7a24bde8_f49f_47a1_aaa9_170a1819cfcb Building with 'gcc'. MEX completed successfully. mex -I/tmp/Bdoc24a_2589924_2082858/tp4a572a81/slcoverage-ex71096464 /tmp/Bdoc24a_2589924_2082858/tpaa4d77d6_eb45_453a_b34f_b392a1432ced/tpac027e03_7454_4fd9_94ee_90ecf66a9f38.c /tmp/Bdoc24a_2589924_2082858/tp7a24bde8_f49f_47a1_aaa9_170a1819cfcb/counterbus.o -L/mathworks/devel/bat/filer/batfs1904-0/Bdoc24a.2589924/build/matlab/bin/glnxa64 -lmwsl_sfcn_cov_bridge -output slcoverage_sfun_counterbus Building with 'gcc'. MEX completed successfully. mex -I/tmp/Bdoc24a_2589924_2082858/tp4a572a81/slcoverage-ex71096464 -c /tmp/Bdoc24a_2589924_2082858/tp4a572a81/slcoverage-ex71096464/counterbus.c -outdir /tmp/Bdoc24a_2589924_2082858/tp7a24bde8_f49f_47a1_aaa9_170a1819cfcb Building with 'gcc'. MEX completed successfully. mex -I/tmp/Bdoc24a_2589924_2082858/tp4a572a81/slcoverage-ex71096464 /tmp/Bdoc24a_2589924_2082858/tpaa4d77d6_eb45_453a_b34f_b392a1432ced/slcoverage_sfun_counterbus.c /tmp/Bdoc24a_2589924_2082858/tpaa4d77d6_eb45_453a_b34f_b392a1432ced/tp536e2d3b_9535_49c7_a600_82fe38a87a80.c /tmp/Bdoc24a_2589924_2082858/tpaa4d77d6_eb45_453a_b34f_b392a1432ced/tp7d6ac277_6a86_4d72_955e_61b1479464a7.c /tmp/Bdoc24a_2589924_2082858/tp7a24bde8_f49f_47a1_aaa9_170a1819cfcb/counterbus.o -L/mathworks/devel/bat/filer/batfs1904-0/Bdoc24a.2589924/build/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'... );
运行仿真并生成覆盖率报告
一旦启用覆盖率数据收集,在仿真模型时会自动记录覆盖率信息。在仿真结束时,您可以生成覆盖率信息的 HTML 报告,该报告显示在内置的 MATLAB® 网络浏览器中。
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
。