主要内容

模型接口元素的 C 数据代码接口配置

如果您将 C 代码作为应用程序进行部署,请将模型配置为使用数据代码接口。根据您的模型配置,为应用程序部署生成的代码针对特定调度器(单任务、速率单调或并发)进行优化。

模型代码接口列出了可用于表示与目标环境资源交互的接口的建模元素。要在代码映射编辑器中或通过使用代码映射编程接口 (coder.mapping.api.CodeMapping) 为代码生成配置建模元素,请将模型接口元素映射到代码定义。

配置数据代码接口时,您可以:

  • 为数据元素类别或函数配置应用于整个模型的默认代码接口设置。例如,输入端口是一个数据元素类别,周期函数是一个函数类别。

  • 配置应用于单个数据元素或函数的代码接口设置。

迁移

当您打开在 R2020b 之前的版本中创建的模型时,Simulink® 会将代码定义(如模型工作区中嵌入的信号和参数对象)迁移到模型代码映射。

对于配置为使用基于 ERT 的系统目标文件进行代码生成的模型,如有必要,在迁移过程中,Simulink 会配置模型使用的 Embedded Coder 字典。保存模型时,代码映射作为模型的一部分保存。

有关详细信息,例如迁移的影响以及迁移前的注意事项,请参阅Migration of Model Data Configurations to Code Mappings

代码定义

对于数据代码接口配置,代码定义包括存储类、函数自定义模板和内存段。存储类定义代码生成器在为关联的数据生成代码时使用的属性,如形式和位置。函数自定义模板定义代码生成器如何为函数生成代码。对于函数类别,您可以定义函数命名规则和函数定义在内存中的位置(内存段)。

内存段控制数据和函数定义在内存中的位置。在某些情况下,您可以在配置数据元素和函数时选择所需的特定内存段。

代码生成器为数据元素提供预定义的代码定义。如果您有 Embedded Coder®,您可以使用 Embedded Coder 字典来创建和共享代码定义,例如,用于标准化您从多个模型生成的代码或为不同应用程序运行时环境创建定义。创建自定义定义使您能够实现预定义的定义无法满足的代码生成目标。对于数据元素,您还可以选择使用 Embedded Coder 自定义存储类设计器创建在包中创建的代码定义。

代码定义出现在代码映射编辑器中,可通过使用代码映射编程接口进行访问。对于使用自定义存储类设计器创建的一些定义,您可以通过配置 Embedded Coder 字典来引用它们,以使这些定义出现在代码映射编辑器中。

默认情况下,使用 Embedded Coder 字典为模型创建的代码定义存储在模型文件中。通过将代码定义存储在共享的 Embedded Coder 字典中,可以在模型和工程之间共享代码定义。要修改共享字典中的定义,您只需在一个位置更改定义 - 即在 Embedded Coder 字典中。

有关详细信息,请参阅Define Service Interfaces, Storage Classes, Memory Sections, and Function Templates for Software Architecture使用自定义存储类设计器创建存储类

数据接口代码映射选项

通过使用代码映射编辑器或代码映射编程接口,将表示接口的模型元素与代码定义相关联。代码生成器使用映射的代码定义来确定生成的接口代码应该是什么样子,以及应该如何打包代码。

通过为代码生成器指定默认配置,简化代码接口的配置工作。对于数据接口配置,您可以在代码映射编辑器的数据默认值函数默认值选项卡上指定默认配置,或通过调用 setDataDefaultsetFunctionDefault 函数来指定。您可以通过将存储类或函数自定义模板设置为默认值来让代码生成器建立默认配置,也可以指定命名的存储类或函数自定义模板。当您指定默认值时,代码生成器将确定数据元素和函数原型在生成的代码中的显示方式。当您指定命名存储类或函数自定义模板时,代码生成器会应用为该代码定义指定的设置。

对于单个模型元素,可以覆盖默认类别代码配置设置。选择与元素类别对应的选项卡,或调用对应的元素类别 setElementCategory 函数(例如,setInportsetState)。对于单个元素,有三种配置选项:

  • 让代码生成器处理配置。

    • 对于数据元素,选择或指定自动。对于自动,数据元素要经过代码生成优化,该过程可以从代码中删除该元素或更改该元素的表示形式。如果优化没有消除数据元素,该元素将获得对应数据类别的默认配置。如果没有为类别配置默认值(在数据默认值选项卡上,类别设置为默认),则该元素在生成的代码中显示为标准数据结构体的一个字段。

    • 对于函数,选择或指定默认

  • 将数据或函数元素映射到代码定义,该代码定义配置为此模型的相关数据或函数元素类别的默认值。指定模型默认: storage class模型默认: function-template

  • 将数据或函数元素映射到未标注为模型默认值的命名存储类或函数自定义模板。

下图总结了默认设置和单个配置设置与可用选项之间的关系。

Set default code definition for category of model elements by selecting Data Defaults and Function Defaults tabs. Then, Specify Default or a named storage class or function template. Override default definition for individual model element by selecting the element category tab. Then, specify Model default: category, Auto, or a named storage class or function template.

数据默认配置

通过为整个模型中的数据元素的类别指定默认配置(例如,输入端口或模型工作区参数),减少为 C 代码生成准备模型的工作量。应用默认配置可以节省时间并降低在代码中引入错误的风险,尤其是对于大型模型和要从中生成多实例代码的模型更是如此。

默认配置应用于整个模型,但不包括引用模型。Simulink 将一组单独的代码映射保存为模型引用层次结构中每个模型的一部分。

如果一个模型包含某给定类别的大量元素(例如,超过 10 个),则更高效的方式是使用默认设置配置类别,然后在特殊情况下覆盖该设置。

默认设置可以帮助您减少手动数据输入。

  • 向模型中添加模块时,新数据元素会继承默认设置。

  • 要一次性更改许多数据元素的代码生成设置,请在一个位置进行更改,即在默认设置中。

  • 为了提高效率,在模型的其他位置进行更改时,请使用命名规则。

您可以使用代码映射编辑器 - C数据默认值选项卡或 setDataDefault 函数来配置数据默认值。

模型数据类别

您可以使用代码映射编辑器 - C数据默认值选项卡或 setDataDefault 函数来配置数据默认值。在数据默认值选项卡或函数调用中,您可以选择或指定这些数据元素类别。

模型元素类别描述
输入端口模型的根级输入端口,如 InportIn Bus Element 模块。
输出端口模型的根级输出端口,如 OutportOut Bus Element 模块。
信号、状态和内部数据模型内部的数据元素,如模块输出信号、离散模块状态、数据存储和过零信号。
共享局部数据存储设置了跨模型实例共享模块参数的 Data Store Memory 模块。这些数据存储只在定义它们的模型中可访问。数据存储值在模型的实例之间共享。
全局数据存储由基础工作区或数据字典中的信号对象定义的数据存储。一个应用程序中的多个模型可以使用这些数据存储。要在代码映射编辑器中查看和配置这些数据存储,请点击类别名称右侧的 Refresh 链接。点击此链接可更新模型图。
模型参数参量模型工作区中配置为模型参量的参数。这些参数在模型模块上公开,以使每个模型实例能够设置它自己的值。要将一个参数指定为模型参量,请选中模型数据编辑器 > 参数 > 参量复选框。
模型参数在模型中定义的参数,例如模型工作区中的参数。不包括模型参量。
外部参数在基础工作区或数据字典中定义为对象的参数。一个应用程序中的多个模型可以使用这些参数。要在代码映射编辑器中查看和配置这些参数,请点击类别名称右侧的 Refresh 链接。点击此链接可更新模型图。
常量

常量值模块输出和无法内嵌的常量参数。出于以下原因之一,这些值存储在变量中。

  • 该值是大于循环展开阈值的数组。

  • 代码中需要值地址。

如果您将某数据元素类别的默认存储设置为默认值,您可以选择指定内存段。

为数据配置默认代码生成设置的注意事项

在为数据元素配置默认代码生成设置之前,请考虑下表中列出的注意事项。

注意事项更多信息
哪些类别与您的模型相关?上表中的数据元素类别
该模型是否使用一个类别中的多个数据实例?如果答案是肯定的,则应用默认映射是有好处的。否则,请考虑为每个数据元素单独配置代码生成。
哪个存储类符合您对每个类别的代码生成要求? Choose Storage Class for Controlling Data Representation in Generated Code
是否希望模型数据结构化?例如,如果您为多实例代码生成配置模型,则结构化可以提高代码效率和可读性。Organize Data into Structures in Generated Code
是否需要代码生成器将数据存储在内存的特定区域?例如,考虑是否将初始化数据存储在慢速内存中,将算法或计算数据存储在快速内存中。
是否阻止优化从代码中消除特定数据? 通过优化消除某些类别的数据
您是否需要定义可在代码映射编辑器中选择的新存储类?

在配置一个或多个模型元素类别后,设置内存段和共享实用工具标识符格式模型配置参数对模型配置不起作用。在打开代码生成器工具时,Simulink 会将模型配置参数设置迁移到代码映射编辑器。在迁移过程中,Simulink 会配置模型使用的 Embedded Coder 字典,如Migration of Memory Section and Shared Utility Settings from Configuration Parameters to Code Mappings中所述。

通过优化消除某些类别的数据

代码生成优化可以从代码中消除数据,这意味着您的应用程序代码无法与数据交互。有关通过优化消除数据的一般信息,请参阅生成的代码如何存储内部信号、状态和参数数据

优化只能消除下列类别的数据:

  • 模型参数

  • 模型参数参量

  • 外部参数

  • 内部数据

在通过优化消除数据后,代码生成器会将代码映射中的默认代码生成设置应用于其余数据。对于参数和信号线,优化可以消除整个类别的数据。如果发生此类消除,则您为该类别指定的默认设置将不应用于数据。

为了防止优化消除单个数据元素,请将存储类显式应用于单个元素。存储类控制生成代码中数据的外观。要强制数据元素使用您指定的默认存储类,请显式应用存储类模型默认值。请参阅Choose Storage Class for Controlling Data Representation in Generated Code

共享字典数据默认值

如果您将模型链接到 Simulink 数据字典,其中包括为数据类别配置默认代码定义的代码生成器字典,则可以使用代码映射编辑器应用字典默认值。在代码映射编辑器的数据默认值选项卡上,选择一个类别,并将存储类设置为字典默认值。如果有人更改共享代码生成器字典中的默认设置,代码生成器会在为您的模型生成代码时应用更新后的默认设置。请参阅Configure Default Code Mapping in a Shared Dictionary

函数默认配置

通过为整个模型中的类别和函数(如初始化/终止和执行函数)指定默认配置,减少为 C 代码生成准备模型的工作量。应用默认配置可以节省时间并降低在代码中引入错误的风险,尤其是对于大型模型和要从中生成多实例代码的模型更是如此。

默认配置应用于整个模型,但不包括引用模型。Simulink 将一组单独的代码映射保存为模型引用层次结构中每个模型的一部分。

如果一个模型包含某给定类别的大量函数(例如,超过 10 个),则更高效的方式是使用默认设置配置类别,然后在特殊情况下覆盖该设置。

默认设置可以帮助您减少手动数据输入。

  • 向模型中添加模块和信号时,新函数会继承默认设置。

  • 要一次性更改许多函数的代码生成设置,请在一个位置进行更改,即在默认设置中。

  • 为了提高效率,在模型的其他位置进行更改时,请使用命名规则。

模型函数类别

您可以使用代码映射编辑器 - C函数默认值选项卡或 setDataDefault 函数来配置函数默认值。在函数默认值选项卡或函数调用中,您可以选择或指定这些函数类别。

模型函数类别描述
初始化/终止用于初始化和终止的入口函数
执行用于启动执行和重置的入口函数
共享实用工具共享工具函数

代码生成器使用默认命名规则来命名入口函数。为了将生成代码与现有外部代码集成,或为了符合命名标准或规范,您可以调整默认命名规则。调整默认命名规则可以节省时间,特别是对于多速率模型,在其中代码生成器为每个速率生成唯一 step 函数。

您可能需要在 Embedded Coder 字典中定义一个函数自定义模板。除非有人为模型定义了函数自定义模板,否则代码映射编辑器会将 Default 作为唯一模板选项。

为函数配置默认代码生成设置的注意事项

在配置函数的默认代码生成设置之前,请考虑下表中列出的注意事项。

注意事项更多信息
哪些类别与您的模型相关?上表中的函数类别
模型是否使用一个类别中的几个函数实例?如果答案是肯定的,则应用默认映射是有好处的。否则,请考虑为每个函数单独配置代码生成。为模型入口函数配置生成的 C 函数接口
哪个函数自定义模板符合您对每个类别的代码生成要求? Define Service Interfaces, Storage Classes, Memory Sections, and Function Templates for Software Architecture
类别是否要求代码生成器将函数代码存储在内存的特定区域?例如,考虑是否将初始化数据存储在慢速内存中,将算法或计算数据存储在快速内存中。
您是否需要定义可在代码映射编辑器中选择的新函数自定义模板?
您是否有函数命名要求?如果答案是肯定的,这些要求是什么?这些要求适用于哪些类别?

在配置一个或多个模型元素类别后,设置内存段和共享实用工具标识符格式模型配置参数对模型配置不起作用。在打开代码生成器工具时,Simulink 会将模型配置参数设置迁移到代码映射编辑器。在迁移过程中,Simulink 会配置模型使用的 Embedded Coder 字典,如Migration of Memory Section and Shared Utility Settings from Configuration Parameters to Code Mappings中所述。

共享字典函数默认值

如果您将模型链接到 Simulink 数据字典,其中包括为各类函数配置默认代码定义的代码生成器字典,则可以使用代码映射编辑器应用字典默认值。在代码映射编辑器中,在函数默认值选项卡上,选择一个类别,并将函数自定义模板设置为字典默认值。如果有人更改共享代码生成器字典中的默认设置,代码生成器会在为您的模型生成代码时应用更新后的默认设置。请参阅Configure Default Code Mapping in a Shared Dictionary

单个数据元素和函数的配置

在配置了应用于整个模型的默认设置后,您可以覆盖单个数据元素和函数的该默认值。单个数据元素或函数配置应用于模型中的一个特定数据元素或函数。在以下情况下,可单独配置数据元素和函数

  • 模型包括给定类别的一些元素,这些元素具有不同源、命名或位置要求。

  • 您配置了默认设置,并希望覆盖单个元素的默认设置。

对于单个数据元素,最初存储类设置为自动,这意味着代码生成器可能出于优化目的而消除或更改相关代码的表示。如果无法进行优化,代码生成器将应用模型默认配置。

  • 要避免优化并强制代码生成器使用默认配置,请将存储类设置为模型默认值

  • 要覆盖默认配置,请指定满足该数据元素的代码生成要求的存储类。

对于单个函数,您可以自定义函数名称。对于执行函数,例如模型的单步函数和 Simulink 函数,您可以配置函数参量。

配置数据

  1. 打开 Embedded Coder

  2. 为数据元素的类别配置默认映射。选择代码接口 > 默认代码映射。在代码映射编辑器的数据默认值选项卡上,选择一个模型元素类别并设置存储类。在属性检查器中,设置存储类属性以符合模型要求。

    如果您需要定义存储类,请使用 Embedded Coder 字典。选择代码接口 > Embedded Coder 字典

  3. 决定是否覆盖单个数据元素的默认配置设置。如果您选择不覆盖设置,请转至步骤 8。

  4. 确定要单独配置的 MATLAB 变量,并将配置存储在模型文件中。在模型资源管理器中,将变量转换为 Simulink.Parameter 对象。生成的数据对象作为模型参数出现在代码映射编辑器中。

  5. 标识那些表示在生成代码执行时要监控的算法数据的信号,并单独配置那些信号。对于您标识的每个信号,请执行以下操作之一:

    • 对于特定于某模型(非共享)的信号数据,将信号添加到代码映射编辑器中。

    • 对于共享信号数据,创建和配置 Simulink.Signal 对象。

  6. 配置单个数据元素。在代码映射编辑器中,点击一个类别选项卡,选择数据元素,然后设置存储类。在属性检查器中,设置存储类属性值。要更改模型配置参数默认参数行为的设置,请点击指示存储类设置为自动时的行为的链接。在“模型配置参数”对话框中,将参数设置更改为可调内联

  7. 要查看和配置存储在基础工作区或数据字典中的外部数据对象,请在代码映射编辑器的数据默认值选项卡上,点击类别名称右侧的 Refresh 链接。

  8. 生成和查看代码。

有关详细信息和示例,请参阅:

配置函数

  1. 打开 Embedded Coder。

  2. 为函数类别配置默认映射。选择 Code Interface > Default Code Mappings。在代码映射编辑器中,在函数默认值选项卡上,选择函数类别并设置函数自定义模板。

    您可能需要定义一个函数自定义模板。默认情况下,模板不可用。要定义函数自定义模板,请使用 Embedded Coder 字典。要打开 Embedded Coder 字典,请选择代码接口 > Embedded Coder 字典

  3. 决定是否覆盖单个函数的默认配置设置。如果您选择不覆盖设置,请转至步骤 5。

  4. 配置单个入口函数。在代码映射编辑器中,点击函数选项卡,选择一个函数,并设置函数自定义模板。您也可以指定函数名称。对于执行函数,如模型单步函数,您可以自定义函数参量。点击函数预览链接会打开一个对话框,您可以使用该对话框自定义整个函数接口。

  5. 生成和查看代码。

有关详细信息和示例,请参阅:

另请参阅

| |

主题