Main Content

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

分析代码并测试软件在环

代码分析和测试软件在环概述

您可以分析代码来检测错误、检查标准合规性以及评估长度和圈复杂度等关键度量。对于手写代码,通常使用静态代码分析检查运行时错误,并运行测试用例来根据需求评估代码并评估代码覆盖率。根据结果,您可以改进代码并添加测试。

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

Workflow for code analysis and software-in-the-loop testing

分析代码缺陷、度量和 MISRA C:2012

此工作流程描述了如何检查您的模型是否生成符合 MISRA™ C:2012 的代码以及如何检查生成的代码的代码度量和缺陷。要从您的模型中生成更多符合 MISRA 的代码,您可以使用代码生成和模型顾问。要检查代码是否符合 MISRA 标准,您可以使用 Polyspace® MISRA C:2012 检查器和报告生成功能。对于此示例,您使用模型 simulinkCruiseErrorAndStandardsExample。打开模型:

  1. 打开工程。

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

  2. 从工程中打开模型 simulinkCruiseErrorAndStandardsExample

    The simulinkCruiseErrorAndStandardsExample shows 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. 按任务文件夹下,选择 MISRA C:2012 建模标准顾问检查。

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

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

生成和分析代码

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

  1. 在 Simulink® 编辑器中,右键单击 Compute target speed 并选择 C/C++ 代码 > 编译此子系统

  2. 使用可调参数的默认设置并选择编译

  3. 代码生成后,在 Simulink 编辑器中,右键单击 Compute target speed 并选择 Polyspace > 选项

  4. 单击配置在 Polyspace 配置窗口中选择更多高级 Polyspace 分析选项。

    Polyspace configuration dialog box

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

  6. 保存并关闭 Polyspace 配置窗口。

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

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

审查结果

Polyspace 环境向您展示静态代码分析的结果。

  1. 展开规则 8.7 的树并点击查看不同的结果。

    规则 8.7 规定,如果函数或对象是本地的,则函数和对象不应该是全局的。当您点击 8.7 违规时,您会看到这些结果引用了其他组件也使用的变量,例如 CruiseOnOff。您可以注释您的代码或模型来对每个结果进行申述。因为这个模型是一个更大程序中的一个单元,所以您还可以更改分析的配置以仅检查 MISRA 规则的子集。

    Polyspace Bug Finder dialog box

  2. 在您的模型中,右键单击 Compute target speed 并选择Polyspace > 选项

  3. 设置来源选项设置为工程配置以选择 Polyspace 配置中的 MISRA 规则子集。

  4. 点击配置

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

  6. 保存并关闭 Polyspace 配置窗口。

  7. 使用新配置重新运行分析。

    前面 Polyspace 显示的规则是通过对模型本身进行分析而发现的。当您将 Polyspace 检查的规则限制为单元子集时,Polyspace 仅发现两条违规行为。

    Code coverage analysis dashboard

当您将此模型与其父模型集成时,您可以添加其余的 MISRA C:2012 规则。

生成报告

为了证明符合 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)

相关主题