Main Content

模型接口元素的 C 代码生成配置

代码生成器为您提供工具来控制在生成代码中数据的表示,以及入口函数的表示(如果您有 Embedded Coder®)。例如,您可以针对代码生成配置数据和函数以符合代码标准和规范,将生成的代码与外部代码集成,或满足内存要求。

代码生成器为模型数据元素和函数生成代码:

  • 应用程序代码可以读写的数据,如输入端口、信号、状态和参数。

  • 入口函数,如 model_step,您的应用程序代码调用这些函数来执行模型算法。

您可以使用代码映射编辑器 - C 或代码映射编程接口 (coder.mapping.api.CodeMapping) 为代码生成配置模型数据元素和函数。需要有 Embedded Coder 才可配置函数。对于数据元素,请使用 Code Mappings 编辑器或代码映射 API,而不是创建和配置 Simulink 数据对象;或者将二者相结合。编辑器和 API 使您能够配置:

  • 应用于整个模型中某类数据元素或函数的默认代码生成设置

  • 应用于单个数据元素或函数的配置设置

下图显示整个工作流:

Iterative flow diagram that shows steps of configuring default mappings, overriding default mappings for individual model elements, and creating code definitions for model elements.

迁移

当您打开在 R2020b 之前的版本中创建的模型时,Simulink® 会将在模型中指定的代码定义迁移到模型代码映射。

如果需要,在迁移过程中,Simulink 会配置模型使用的 Embedded Coder 字典。保存模型时,代码映射作为模型的一部分保存。

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

代码定义

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

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

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

您使用 Embedded Coder 字典创建的代码定义会出现在代码映射编辑器 - C 中,并且可以使用代码映射 API 进行访问。对于使用 Custom Storage Class Designer 创建的一些定义,您可以通过配置 Embedded Coder 字典来引用它们,以使这些定义出现在 Code Mappings 编辑器中。

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

有关详细信息,请参阅Define Service Interfaces, Storage Classes, Memory Sections, and Function Templates for Software ArchitectureCreate Storage Classes by Using the Custom Storage Class Designer

数据默认配置

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

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

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

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

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

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

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

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

模型数据类别

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

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

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

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

  • 代码中需要值地址。

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

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

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

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

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

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

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

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

  • Model parameters

  • Model parameter arguments

  • External parameters

  • Internal data

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

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

共享字典数据默认值

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

函数默认配置

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

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

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

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

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

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

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

模型函数类别

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

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

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

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

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

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

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

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

共享字典函数默认值

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

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

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

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

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

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

  • 要避免优化并强制代码生成器使用默认配置,请将存储类设置为 “Model default”。

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

如果模型中的一个数据元素未命名(例如,信号没有标签或状态没有名称),则在为 C 代码生成配置该数据元素时,必须为其指定代码标识符。通过为存储类属性 Identifier 指定值来设置代码标识符。

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

配置数据

  1. 打开 Embedded Coder

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

    如果您需要定义存储类,请使用 Embedded Coder 字典。选择 Code Interface > Embedded Coder Dictionary

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

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

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

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

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

  6. 配置单个数据元素。在 Code Mappings 编辑器中,点击一个类别选项卡,选择数据元素,然后设置存储类。在属性检查器中,设置存储类属性值。要更改模型配置参数 Default parameter behavior 的设置,请点击指示存储类设置为 “Auto” 时的行为的链接。在 Model Configuration Parameters 对话框中,将参数设置更改为 “Tunable” 或 “Inline”。

    有关配置数据元素的特定类型的信息,请参阅:

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

  8. 生成和查看代码。

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

配置函数

  1. 打开 Embedded Coder。

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

    您可能需要定义一个函数自定义模板。默认情况下,模板不可用。要定义函数自定义模板,请使用 Embedded Coder 字典。选择 Code Interface > Embedded Coder Dictionary

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

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

  5. 生成和查看代码。

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

另请参阅

| |

相关主题