主要内容

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

分析代码并执行软件在环测试

您可以分析代码以检测错误、检查是否符合标准以及评估长度和圈复杂度等关键度量。当您创建自己的代码时,通常会使用静态代码分析来检查运行时错误,并运行测试用例来根据需求评估代码并评估代码覆盖率。根据结果,您可以改进代码并添加测试。

在此示例中,您将生成代码并证明代码执行通过使用相同的测试用例和基线结果产生与模型等效的结果。然后将代码覆盖率与模型覆盖率进行比较。根据测试结果,添加测试并修改模型以重新生成代码。

The code analysis and software-in-the-loop testing process. You generate code, analyze your code, perform testing to verify equivalence with your model. Then, you analyze code coverage and report result if they meet your requirements. Otherwise, you refine your code, tests and model.

分析代码缺陷、指标和 MISRA C:2012

首先,检查模型是否生成符合 MISRA™ C:2012 的代码,并分析生成的代码的代码度量和缺陷。要生成符合 MISRA 的代码,您可以使用代码生成顾问和模型顾问。要检查代码是否符合 MISRA 标准,您可以使用 Polyspace® MISRA C:2012 检查器。

  1. 打开示例工程。

    openExample("shared_vnv/CruiseControlVerificationProjectExample");
    pr = openProject("SimulinkVerificationCruise");

  2. 打开 simulinkCruiseErrorAndStandardsExample 模型。

    open_system("simulinkCruiseErrorAndStandardsExample");

    The simulinkCruiseErrorAndStandardsExample model includes the Compute target speed subsystem, which has 5 inputs and 2 outputs.

运行代码生成器检查

使用代码生成顾问检查您的模型。配置代码生成参数,以生成更符合 MISRA C 且更兼容 Polyspace 的代码。

  1. 右键点击 Compute target speed 子系统并选择 C/C++ 代码 > 代码生成顾问

  2. 在左侧窗格中,选择代码生成顾问文件夹。在右侧窗格中,在可用目标下选择 Polyspace,然后点击向右箭头。MISRA C:2012 规范目标已被选定。

    Code Generation Objectives dialog box

  3. 点击运行所选检查

    代码生成顾问会检查模型是否包含不推荐用于 MISRA C:2012 合规性和 Polyspace 代码分析的模块或配置设置。对于此模型,不兼容模块的检查通过,但某些配置设置与 MISRA 合规性和 Polyspace 检查不兼容。

    Code Generation Advisor results

  4. 点击对照代码生成目标检查模型配置设置。通过选择修改参数来接受参数更改。

  5. 要重新运行检查,点击运行此检查

运行模型顾问检查

在从模型生成代码之前,请使用模型顾问检查模型是否符合 MISRA C 和 Polyspace 标准。

  1. 在代码生成顾问窗口的底部,点击模型顾问

  2. 在 Model Advisor 中,在按任务文件夹下,选择 MISRA C:2012 建模标准

  3. 点击运行检查并查看结果。

  4. 如果任何任务失败,请进行建议的修改并重新运行检查,直到通过 MISRA 建模指南。

生成和分析代码

检查模型是否合规后,即可生成代码。生成代码后,您可以使用 Polyspace 检查代码是否符合 MISRA C:2012,并生成报告以证明符合 MISRA C:2012。

  1. 在 Simulink® 模型中,右键点击 Compute target speed 子系统,然后点击C/C++ 代码 > 编译此子系统

  2. 代码生成后,在 Simulink 编辑器中,右键点击 Compute target speed 子系统并选择 Polyspace > 选项

  3. 点击配置以选择更高级的 Polyspace 分析选项。Polyspace 窗口打开。

  4. 在左侧窗格中,点击编码标准和代码度量,然后选择计算代码度量以为您生成的代码启用代码度量计算。选择检查 MISRA C:2012

  5. 保存并关闭 Polyspace 窗口。

    Polyspace configuration dialog box

  6. 在模型中,右键点击 Compute target speed 子系统并选择Polyspace > 验证 > 为所选子系统生成的代码

    Polyspace Bug Finder™ 分析生成的代码以进行 MISRA 检查的子集。您可以在 MATLAB® 命令行窗口中查看分析的进度。分析完成后,Polyspace 环境打开。

查看结果

Polyspace 环境向您展示静态代码分析的结果。例如,展开规则 8.7 的树并点击查看结果。规则 8.7 规定,如果函数或对象是本地的,则函数和对象不应该是全局的。这些结果涉及其他组件也使用的变量,例如 CruiseOnOff。您可以注释您的代码或模型来申述每个结果。

Polyspace Bug Finder dialog box

要配置分析以仅检查 MISRA 规则的子集:

  1. 在您的模型中,右键点击 Compute target speed 子系统并选择Polyspace > 选项

  2. 在配置参数对话框中,将设置来源设置为工程配置

  3. 点击应用

  4. 点击配置

  5. 在 Polyspace 窗口的左侧窗格中,点击编码标准和代码度量。然后选择检查 MISRA C:2012,并从下拉列表中选择 single-unit-rules。现在 Polyspace 只检查适用于单个单元的 MISRA C:2012 规则。

  6. 保存并关闭 Polyspace 窗口。

  7. 使用新配置重新运行分析。当将 Polyspace 检查的规则限制为单元子集时,Polyspace 只会发现两次违规。

    Code coverage analysis dashboard

生成报告

为了证明符合 MISRA C:2012 并报告您生成的代码度量,您必须导出结果。如果您想要每次运行分析时生成报告,请参阅 生成报告 (Polyspace Bug Finder)

  1. 如果它们尚未打开,请在 Polyspace 环境中打开您的结果。

  2. 从工具栏中选择 报告 > 运行报告

  3. 选择 BugFinderSummary 作为您的报告类型。

  4. 点击运行报告。该报告与您的结果保存在同一文件夹中。

  5. 要打开报告,请选择报告 > 打开报告

使用软件在环测试针对模型测试代码

接下来,在生成的代码上运行相同的测试用例,以表明代码产生与原始模型等效的结果并满足需求。然后将代码覆盖率与模型覆盖率进行比较,以查看测试对生成的代码的执行程度。

  1. 在 MATLAB 的工程窗格中,在 tests 文件夹中,打开 SILTests.mldatx。该文件在测试管理器中打开。

  2. 审查测试用例。在测试浏览器窗格中,点击 SIL Equivalence Test Case。该等效性测试用例使用测试框架对 simulinkCruiseErrorAndStandardsExample 模型运行两次仿真:

    • 仿真 1 是正常模式下的模型仿真。

    • 仿真 2 是软件在环(SIL)仿真。对于 SIL 仿真,测试用例运行从模型生成的代码而不是运行模型。

    等效性测试记录一个输出信号并与仿真结果进行比较。测试用例还收集两次仿真的覆盖率测量。

  3. 要运行等效性测试,请选择测试用例并点击运行

  4. 在测试管理器中查看结果。在结果和工件窗格中,选择 SIL 等效性测试用例。测试用例通过,并且代码产生与该测试用例的模型相同的结果。

    Test Manager showing passed test cases and model and code coverage results.

  5. 在右侧窗格中,展开覆盖率结果部分。覆盖率测量显示测试用例对模型和代码的执行程度。

当您运行多个测试用例时,您可以在结果中查看整个运行的聚合覆盖率测量。使用覆盖率结果添加测试并满足覆盖率需求,如执行功能测试并分析测试覆盖率 (Simulink Check)所示。

您还可以通过运行处理器在环 (PIL) 仿真在目标硬件上测试生成的代码。通过在测试用例中添加 PIL 仿真,您可以将模型的测试结果和覆盖率结果与在目标硬件上运行时生成的代码的结果进行比较。有关更多信息,请参阅Code Verification Through Software-in-the-Loop and Processor-in-the-Loop Execution (Embedded Coder)

另请参阅

主题