主要内容

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

complexityinfo

cvdata 对象中检索圈复杂度覆盖率信息

    说明

    complexity = complexityinfo(cvdo,modelObject)cvdata 对象 cvdo 返回模型组件 modelObject 的复杂度覆盖率结果。

    complexity = complexityinfo(cvdo,modelObject,simMode)cvdata 对象 cvdo 返回针对仿真模式 modelObject 的模型组件 simMode 的复杂性覆盖率结果。

    示例

    全部折叠

    此示例显示如何检索 slvnvdemo_cv_small_controller 模型的增益子系统的圈复杂度信息。

    加载 slvnvdemo_cv_small_controller 模型。

    modelName = 'slvnvdemo_cv_small_controller';
    load_system(modelName);
    

    创建测试规范对象并启用决策、条件和 MCDC 覆盖率。然后,使用 cvsim 仿真模型。

    testObj = cvtest(modelName);
    testObj.settings.decision = 1;
    testObj.settings.condition = 1;
    testObj.settings.mcdc = 1;
    covData = cvsim(testObj);
    

    检索增益子系统的圈复杂度信息。

    gainPath = [modelName,'/Gain'];
    gainComplexity = complexityinfo(covData,gainPath)
    
    gainComplexity =
    
         1     0
    
    

    Gain 子系统本身并不记录圈复杂度,但子系统的内容记录了。从结果中可以看出这一点,因为总复杂度为 1,其中包括子系统及其所有后代。相比之下,局部复杂度为 0,表明复杂性的一个点来自其中一个后代,在本例中是 Switch 模块。

    switchPath = [modelName,'/Gain/Switch'];
    switchComplexity = complexityinfo(covData,switchPath)
    
    switchComplexity =
    
         1     1
    
    
    1. 打开示例并加载模型。

      openExample("slcoverage/RetrieveCodeCoverageResultsExample");
    2. 使用 setupSILCoverage 函数配置模型以进行代码覆盖率分析。输出是一个 Simulink.SimulationInput 对象。

      simIn = setupSILCoverage("slvnvdemo_counter_harness");

    3. 仿真模型。

      simOut = sim(simIn);

    4. 要检索生成的代码中某个函数的圈复杂度,请使用一个包含所生成源文件的文件名和函数名的元胞数组。例如,检索位于源文件 slvnvdemo_counter.c 中函数 slvnvdemo_counter 的圈复杂度。

      complexitySILFunction = complexityinfo(covDataSIL,...
                              {"slvnvdemo_counter.c","slvnvdemo_counter"})
          complexitySILFunction =
          
               3     3
      函数 slvnvdemo_counter 的圈复杂度为 3。

    5. 同样地,仅使用生成的主文件 slvnvdemo_counter.c 检索整个系统的圈复杂度。在这种情况下,您无需使用元胞数组。

      complexitySILSystem = complexityinfo(covDataSIL,...
                              "slvnvdemo_counter.c")
          complexitySILSystem =
          
               4     0
      第一个数值表示对象及其所有子对象的圈复杂度,因此该系统的圈复杂度为 4。第二个数值表示仅输入参量所指定的对象或文件的圈复杂度,因此文件 slvnvdemo_counter.c 不会为系统增加复杂度。这很有道理,因为源文件是由函数构成的,而这些函数会作为报告器,报告各自的圈复杂度。

    1. 打开示例并加载数据到工作区。

      openExample("slcoverage/RetrieveSFunCoverageResultsExample");
      load slcoverage_lct_data.mat
    2. 使用 setupSFcnCoverage 函数配置模型以进行覆盖率分析。输出是一个 Simulink.SimulationInput 对象。

      simIn = setupSFcnCoverage("slcoverage_lct_bus");

    3. 仿真模型。

      simOut = sim(simIn);

    4. 要检索 S-Function 的圈复杂度,请使用 complexityinfo 函数,并指定一个包含模块句柄或完整路径的元胞数组,后跟 S-Function 源文件的文件名。根据选项,您还可以指定该源文件中的特定函数。对于此示例,检索 S-Function 文件 counterbus.c 中名为 counterbusFcn 的函数的圈复杂度,该函数被 S-Function 模块 slcoverage_sfun_counterbus 调用。S-Function 模块位于模型 slcoverage_lct_bus 中的 TestCounter 子系统内。

      covDataSFcn = simOut.covdata;
      complexitySFun = complexityinfo(covDataSFcn,...
          {"slcoverage_lct_bus/TestCounter/slcoverage_sfun_counterbus",...
          "counterbus.c","counterbusFcn"})
          
          complexitySFun =
          
               3     3
      

    输入参数

    全部折叠

    覆盖率数据,指定为 cvdata 对象。

    数据类型: cvdata

    模型对象,指定为字符数组、字符串数组、Simulink 句柄、Stateflow ID 或元胞数组。

    要指定模型对象(例如模块或 Stateflow 图),请使用以下格式之一:

    对象设定描述

    BlockPath

    模型或模块的完整路径

    BlockHandle

    模型或模块

    slObj

    Simulink API 对象的句柄

    sfID

    Stateflow ID

    sfObj

    来自单独实例化的 Stateflow 图的 Stateflow API 对象的句柄

    {BlockPath,sfID}

    包含 Stateflow 图或原子子图的路径以及该图或子图中包含的对象的 ID 的元胞数组

    {BlockPath,sfObj}

    包含 Stateflow 图或子图的路径以及该图或子图中包含的 Stateflow 对象 API 句柄的元胞数组

    {BlockHandle,sfID}

    带有 Stateflow 图或原子子图句柄的元胞数组以及该图或子图中包含的对象的 ID

    要指定 S-Function 模块或其内容,请使用以下格式之一:

    对象设定描述

    {BlockPath,fileName}

    包含 S-Function 模块路径和源文件名称的元胞数组

    {BlockHandle,fileName}

    具有 S-Function 模块句柄和源文件名称的元胞数组

    {BlockPath,fileName,functionName}

    包含 S-Function 模块的路径、源文件的名称和函数名称的元胞数组

    {BlockHandle,fileName,functionName}

    带有 S-Function 模块句柄、源文件的名称和函数名称的元胞数组

    要指定代码覆盖率结果,例如在软件在环 (SIL) 或处理器在环 (PIL) 分析期间收集的覆盖率数据,请使用以下格式之一:

    对象设定描述

    {fileName,functionName}

    包含源文件名称和函数名称的元胞数组

    {Model,fileName}

    具有模型名称或模型句柄和源文件名称的元胞数组

    {Model,fileName,functionName}

    具有模型名称或模型句柄、源文件的名称和函数名称的元胞数组

    数据类型: char | string | cell | Stateflow.State | Stateflow.Transition

    覆盖率分析期间的仿真模式,指定为以下选项之一:

    对象设定描述

    "Normal"

    普通仿真模式下的模型。

    "SIL" or "PIL"

    软件在环 (SIL) 或处理器在环 (PIL) 仿真模式下的模型。

    "ModelRefSIL" or "ModelRefPIL"

    SIL 或 PIL 仿真模式下的模型参考。

    "ModelRefTopSIL" or "ModelRefTopPIL"

    在 SIL 或 PIL 仿真模式下的模型引用,代码接口设置为顶层模型。

    数据类型: char | string

    输出参量

    全部折叠

    循环复杂度,如果 cvdo 包含圈复杂度覆盖率结果,则返回为 [total_complexity,local_complexity] 形式的双元素数组,如果不包含,则返回空数组。

    total_complexitymodelObject 及其后代(如果有)的循环复杂度覆盖率
    local_complexitymodelObject 的循环复杂度覆盖率

    如果 modelObject 具有可变大小的信号,则 complexity 也包含可变复杂度。

    数据类型: double

    备选方法

    使用覆盖率设置来收集并显示覆盖率报告中的圈复杂度覆盖率结果:

    1. 打开模型。

    2. 在 Simulink 编辑器中,选择建模选项卡上的模型设置

    3. 在配置参数对话框的覆盖率窗格中,选择启用覆盖率分析

    4. 覆盖率度量下,选择 MCDC 作为结构覆盖率级别。

    5. 点击确定关闭配置参数对话框并保存更改。

    6. 仿真模型。

    7. 在停靠的覆盖率详细信息窗格中,覆盖率报告显示模型以及每个模型对象的圈复杂度。

    版本历史记录

    在 R2011a 中推出