主要内容

SIL和PIL模拟

什么是SIL和PIL模拟?

使用嵌入式编码器®,您可以运行模型的软件在环(SIL)和处理器在环(PIL)模拟。这些模拟生成顶层模型或部分模型的源代码。SIL模拟在开发计算机上编译并运行生成的代码。PIL模拟在开发计算机上交叉编译源代码,然后下载目标代码并在目标处理器或等效的指令集模拟器上运行。

使用SIL和PIL模拟,您可以:

  • 测试您的模型和生成的代码在数值上是否相等。

  • 观察代码覆盖率。

  • 执行代码执行分析。

为什么使用SIL和PIL

通过SIL和PIL,您可以在早期进行测试并修复缺陷。例如,您可以在正常模式下建模和测试系统组件。然后,您可以在运行已编译生成代码的SIL或PIL模拟中重用您的测试套件。为了检查数值等价性,您可以比较正常和SIL或PIL模拟结果。你不必离开Simulink金宝app®环境在单独的基础设施上测试生成的代码。

该表描述了可以使用SIL和PIL的情况。

情况 使用
通过重用为正常模式模拟开发的测试向量来测试模型和生成代码之间的数值等效性,以验证生成(或遗留)代码的数值输出。看到SIL/PIL经理验证流程而且测试两个模拟是否等价(金宝app仿真软件测试) SIL和PIL

为生成的代码收集度量:

SIL和PIL

(需要一个IEC认证套件许可证)。

根据ISO 26262-6、IEC 61508-3、IEC 62304、EN 50128和EN 50657功能安全标准所定义的整个软件安全生命周期的要求,对生成的C/ c++代码执行验证和验证活动。有关SIL和PIL验证活动的详细信息,请参阅IEC认证套件基于模型的设计工作流,请参见嵌入式C/ c++应用程序参考工作流certkitiec_ecoder_workflow.docx / pdf)工件资源管理器。

SIL和PIL

(需要一个DO资格套件许可证)。

测试集成过程的输出,以满足DO-178C和DO-333安全标准中的相关目标。有关其他信息,请参见集成过程输出的测试(民政事务处资历套件).此信息也可在基于模型的DO-178C设计工作流qualkitdo_do178_workflow.pdf)工件资源管理器。

SIL和PIL
没有目标硬件,获得一个方便的PIL替代方案。

对于目标硬件,例如评估板或指令集模拟器:

  • 验证特定目标代码的行为,例如,代码替换优化和遗留代码。看到什么是代码替换?而且什么是代码替换定制?

  • 优化代码的执行速度和内存占用。在此表中,请参阅有关收集执行概要分析和堆栈概要分析指标的信息。

  • 调查编译器设置和优化的影响,例如,偏离ANSI®C溢出的行为。

普通的模拟技术不考虑硬件施加的限制和要求,例如有限的内存资源或特定于目标的优化代码的行为。


有关在特定目标上运行PIL模拟的信息,请参见自定义目标示例

公益诉讼

请注意

SIL和PIL仿真模式并不是为了减少模型仿真时间而设计的。如果您想加快模型的模拟速度,请使用快速加速模式。有关更多信息,请参见什么是加速度?

SIL和PIL模拟如何工作

在SIL或PIL模拟中,为顶部模型或模型的一部分生成代码。使用SIL,这些代码将在开发计算机上编译和执行。使用PIL,代码针对目标硬件进行交叉编译,并在目标处理器上运行。

通过通信通道,Simulink为模拟的每个采样间隔向计算机或目标处金宝app理器上的代码发送刺激信号。

  • 对于顶级模型,Simulink使用金宝app来自基础或模型工作空间的刺激信号。

  • 如果您只指定了模型的一部分以SIL或PIL模式进行模拟,那么模型的一部分将保留在Simulink中,并且不会为模型的这一部分生成代码。金宝app通常,您配置模型的这一部分,为在硬件上执行的软件提供测试向量。模型的这一部分可以表示算法的其他部分或算法运行的环境。

当您的计算机或目标处理器接收到来自Simulink的信号时,处理器对一个示例步骤执行SIL或PIL算法。金宝appSIL或PIL算法将在此步骤中计算的输出信号通过通信通道返回给Simulink。金宝app模拟完成一个采样周期,Simulink继续进行下一个采样间隔。金宝app这个过程不断重复,模拟继续进行。SIL和PIL模拟不能实时运行。在每个采样周期中,Simulink与目标代码交金宝app换I/O数据。

SIL和PIL模拟的比较

SIL或PIL模拟的类型 SIL模拟中发生了什么 PIL模拟中发生了什么

指定通过:

  • 顶模仿真模式

  • 模型模拟模式参数

  • 在开发计算机上测试生成的源代码的行为。模拟不会测试为目标硬件编译的代码,因为代码是为开发计算机(与目标计算机不同的编译器和不同的处理器体系结构)编译的。

  • 在开发计算机上编译和执行的生产代码是独立于MATLAB的单独过程®的过程。

  • 执行是主机/主机和非实时的。

  • 在实际目标硬件或指令集模拟器上测试打算部署到生产环境中的目标代码。

  • 在开发计算机上,为目标生成交叉编译的生产代码。目标代码下载并在目标处理器或指令集模拟器上执行。

  • 执行是主机/目标和非实时的。

使用从子系统创建的SIL或PIL块。
  • 模拟通过s函数运行已编译的目标代码。S-function与在开发计算机上作为独立应用程序执行的目标代码通信。SIL块的执行是独立于MATLAB过程的。

  • 执行是主机/主机和非实时的。

  • 仿真在开发计算机上通过s函数运行交叉编译的目标代码。函数与在目标处理器或指令集模拟器上作为独立应用程序执行的目标代码通信。

  • 执行是主机/目标和非实时的。

SIL和PIL的代码接口

例如,当您为单个可部署组件执行顶层模型或右键单击子系统构建时,您将生成独立代码。您可以编译独立代码并将其链接到独立可执行文件中,或者将其与其他代码集成。有关独立代码接口的详细信息,请参见为模型入口点函数配置生成的C函数接口

当您为引用的模型层次结构生成代码时,软件将为顶层模型和称为的库模块生成独立的可执行代码模型参考目标对于每个引用的模型。当代码执行时,独立的可执行文件调用适用的模型引用目标来计算引用的模型输出。有关更多信息,请参见构建模型参考目标

要将生成的代码与遗留代码集成,请使用独立代码,因为独立代码接口有文档。

请注意

SIL和PIL模拟不提供对定制代码接口的直接支持。金宝app您可以将这些接口作为s函数合并到Simulink中,例如,使用遗留代码工具,金宝apps函数生成器,或手写代码。然后,您可以使用SIL和PIL模拟来验证定制代码。

该表提供了SIL和PIL模拟生成的接口。

银/公益诉讼模拟 代码接口
顶级模特

SIL/PIL模拟生成独立的代码接口。如果该代码存在,则模拟调用该模型的独立代码。如果该代码不存在,模拟将生成独立代码。

模型

如果你设置代码接口块参数到顶级模特, SIL/PIL仿真生成独立代码接口。如果模型存在,则模拟调用该模型的独立代码。方法生成独立代码slbuild ('模型”)命令。

如果你设置代码接口块参数到模型参考, SIL/PIL仿真生成模型参考代码接口。控件的模型参考目标调用模型如果存在,则阻塞。方法生成模型参考目标slbuild ('模型”、“ModelReferenceCoderTarget”)命令。

SIL或PIL块 该块使用独立代码接口。

调度的考虑

信息
代数循环

在SIL和PIL模拟中出现了代数循环,但在普通模式模拟中没有:

  • 单输出/更新功能在代码生成优化中可以引入代数循环,因为该选项通过组合输出和更新函数引入了直接馈通。

    单输出/更新功能不兼容尽量减少代数循环的出现(在“子系统参数”对话框中)配置参数>模型参考窗格)。尽量减少代数循环的出现允许代码生成通过在输出和更新函数之间划分生成的代码来删除代数循环,以避免直接馈通。

  • 如果您为虚拟子系统生成代码,那么代码生成将子系统视为原子,并相应地生成代码。结果代码可以改变模型的执行行为,例如,通过应用代数循环,并在模拟行为中引入不一致。

    要为您的模型启用一致的模拟和执行行为,请将虚拟子系统声明为原子子系统。

有关更多信息,请参见:

反馈循环中的导出函数

如果您的模型具有函数调用子系统,而您导出的子系统具有上下文依赖的输入(例如,反馈信号),那么使用生成的代码进行SIL/PIL模拟的结果与模型的正常模式模拟的结果可能不同。使SIL/PIL和正常模式模拟产生相同结果的一种方法是使用函数调用反馈锁存器模型中的块。您可以使依赖于上下文的输入变得与上下文无关。

如果你设置上下文相关的输入配置参数为警告, Embedded Coder生成一个警告,用于标识导出函数调用子系统的上下文依赖的输入。

有关更多信息,请参见:

导入的数据和额外生成的代码

SIL或PIL模拟不修改从模型生成的代码。如果使用导入的数据,SIL或PIL模拟将生成支持编译和链接SIL或PIL目标应用程序所需的额外代码。金宝app额外生成的代码对应于您在模型中指定的接口。

本节介绍:

  • 对于导入的数据,当SIL或PIL模拟定义存储时以及当您必须定义存储时。

  • SIL或PIL模拟为其生成附加代码的接口

SIL或PIL模拟中导入的数据

在SIL和PIL模拟中,您可以使用信号、参数和数据存储,它们用导入的数据定义指定存储类。模拟定义了与以下相关的导入数据的存储:

  • 组件根级的信号(在I/O边界上)。

  • 基本工作区或数据字典中的参数。对于模型工作区中的参数:

    • 顶级模型SIL/PIL和SIL/PIL块模拟定义存储。

    • 模型block SIL/PIL模拟不定义存储。必须定义存储并指定与MATLAB值匹配的初始值。

  • 全局数据存储。

SIL和PIL模拟不定义其他导入数据的存储。例如,模拟没有定义导入数据的存储,与以下相关:

  • 内部信号(不在I/O边界上)。请注意,如果内部信号的数据位于通过使用指针导入的结构中,则模拟定义存储。

  • 本地数据存储。

在这些情况下,通过被测试组件所包含的自定义代码或通过PIL定义存储rtw.pil.RtIOStreamApplicationFrameworkAPI。

另请参阅可调参数和SIL/PIL

产生额外生成代码的接口

该表描述了SIL或PIL模拟为接口生成额外代码的场景。

场景 细节
GetSet自定义存储类

SIL和PIL模拟支持金宝appGetSet自定义存储类。SIL/PIL测试套件提供了得到而且模拟过程中使用的函数。有关更多信息,请参见通过存储类为GetSet的函数访问数据

类型的自定义存储类其他

为其中的自定义存储类启用SIL和PIL支持金宝app类型设置为其他,为自定义存储类创建一个自定义属性类,并将自定义属性类与一个布尔属性关联,金宝appSupportSILPIL,设置为真正的

Simulink. classdef CSCOtherAtt金宝appributesCustomStorageClassAttributes properties(PropertyType = 'logical scalar') SupportSILPIL = true; end end

有关自定义属性的详细信息,请参见通过编写TLC代码进一步定制生成的代码而且通过编写TLC代码对存储类的数据表示进行精细控制

要构建SIL或PIL应用程序接口,代码生成器将调用DataAccess而且ClassAccess函数在相关的自定义TLC文件中获取所需信息。代码生成器将提取的信息存储在构建文件夹中的构建构件中。

对于未分组的自定义存储类:

  • 代码生成器调用DataAccess请求参数的值为定义声明布局内容地址,或

  • 代码生成器使用返回的字符串数据访问(记录,“定义”,“定义”,“定义”)在SIL或PIL应用程序中定义变量,如果其中一个为真:

    • 信号或参数有一个进口数据范围。

    • 该模型使用模型参考代码接口。

    • 该模型使用顶级模型代码界面,EnableDataOwnership,以及老板属性不为空,且不等于当前模型的名称

  • 代码生成器使用返回的字符串DataAccess(record, "declare", "declare", "declare")在SIL或PIL应用程序中声明变量,如果以下情况为真:

    • 该模型使用顶层模型代码接口。

    • 信号或参数使用出口存储类。

    • EnableDataOwnership,或EnableDataOwnership老板属性为空或等于模型名称。

    • 代码打包已配置,因此变量不会在中声明模型.h或包含的头文件模型.h

对于分组的自定义存储类:

  • 代码生成器调用DataAccess请求参数的值为布局地址,或

  • 代码生成器调用ClassAccess请求参数取的值groupTypeDeclDefn

  • 必须提供分组类型(结构体)定义及走读生如果其中一个为真,则声明分组变量:

    • 信号或参数有一个进口数据范围。

    • 该模型使用模型参考代码接口。

    • 该模型使用顶级模型代码界面,EnableDataOwnership,以及老板属性不为空,且不等于当前模型的名称

    类在与自定义存储类关联的头文件中提供定义和声明HeaderFile属性中包含的自定义代码模型.h文件。为了在SIL或PIL应用程序中定义变量,代码生成器使用返回的字符串ClassAccess(记录,“groupTypeDeclDefn”)

  • 静态初始化可以假定为结构体元素,该元素与数据作用域为时生成的顺序不同出口.当代码生成器查询时ClassAccess(记录,“groupTypeDeclDefn”),它会临时用值覆盖自定义存储类的数据初始化属性没有一个

为确定SIL或PIL应用程序是否可以按地址访问代码中的变量,代码生成器使用返回的元素数据访问(记录,“布局”,“”,“”).为了在应用程序中创建在开发计算机和目标硬件之间传输输入或输出端口、可调参数或全局数据存储内存值的功能,代码生成器使用以下输出:

  • 数据访问(记录,“地址”,idx, reim)如果第一个返回元素为标量向量row-mat,或col-mat

  • 数据访问(记录,“内容”,idx, reim)(或数据访问(记录,“set”,idx, reim))如果第一个返回的元素是其他

代码生成器假设forrow-mat而且col-mat,矩阵分别以行主格式存储。该假设与模型其余部分的数组布局无关。代码生成器假定,如果自定义存储类实现的存储的数组布局与模型的其余部分不同,那么与自定义存储文件关联的TLC文件将执行所需的转换。

您可以构造与类型的自定义存储类关联的自定义TLC文件其他执行其他功能(除了返回请求的代码片段之外)。例如,直接写入自定义文件或调用更改基本工作空间状态的MATLAB函数。如果您不总是希望执行这些函数时DataAccessClassAccess都调用,使用LibIsAccessingCustomDataForSILPIL(记录)TLC功能区分目标代码生成和SIL或PIL应用程序构造的代码片段请求。例如:

...LibIsAccessingCustomDataForSILPIL(record) %matlab functionWithSideEffects() %endif %return LibDefaultCustomStorageContents(record, idx, reim)…

另请参阅其他自定义存储类限制

AUTOSAR运行时环境

你可以用顶级模特和模型块SIL/PIL和SIL/PIL块模拟执行基于模型的AUTOSAR软件组件测试。软件将为AUTOSAR软件组件生成的代码与特定于基本组件的AUTOSAR运行时环境(RTE)链接起来,以创建测试应用程序。此应用程序测试由AUTOSAR软件组件发出的AUTOSAR API调用。

对于包含引用模型的顶级AUTOSAR软件组件,可以运行top-model或模型块(代码接口设置为顶级模特) SIL或PIL模拟。在模拟中,软件:

  • 在编译引用模型之前,生成AUTOSAR RTE头文件。

  • 提供用于引用模型编译的RTE包含路径。

你也可以跑模型块(代码接口设置为模型参考)顶级AUTOSAR SWC中引用模型的SIL或PIL模拟。在这种情况下,在运行模拟之前,必须构建父组件以生成RTE头文件。如果不构建父组件,SIL或PIL模拟将失败。

相关的话题