Main Content

配置工具链 (ToolchainInfo) 或模板联编文件编译过程

指定工具链 (ToolchainInfo) 或模板联编文件方法来编译从模型生成的代码。

如果将 系统目标文件 配置参数设置为 grt.tlcert.tlcert_shrlib.tlc 或另一个符合工具链的系统目标文件,则编译过程会使用工具链方法。如果您将参数设置为不符合工具链的系统目标文件,编译过程将使用模板联编文件方法

您可以使用以下命令从工具链方法切换到模板联编文件方法:

set_param(model, 'MakeCommand', 'make_rtw TMF=1')

工具链方法

当您将系统目标文件设置为以下项时,工具链设置将出现在编译过程下:

  • grt.tlc — 一般实时目标

  • ert.tlc — Embedded Coder

  • ert_shrlib.tlc — Embedded Coder (基于主机的共享库目标)

  • 符合工具链的系统目标文件

有关与工具链兼容的系统目标文件的详细信息,请参阅Support Toolchain Approach with Custom Target

工具链设置包括以下配置参数:

  • 工具链 - 指定一组第三方软件工具,用来编译生成的代码。工具链可以包括编译器、链接器和存档器以及其他预编译或编译后工具。

    工具链的默认值为自动定位已安装的工具链工具链参数显示自动定位已安装的工具链下方的工具链的名称。

    要检查工具链是否存在,并验证代码生成器是否具有使用工具链所需的信息,请在高级参数部分中,点击验证工具链。生成的验证报告将指出所选工具链的通过/失败值,并显示需要解决的问题。

  • Build configuration - 指定优化设置。默认情况下,编译配置设置为快速编译。您还可以选择快速运行调试指定。如果选择指定,您可以自定义工具链的选项。当您点击应用时,自定义工具链设置将应用于当前模型。

注意

使用模板联编文件方法的以下系统目标文件与使用工具链方法的系统目标文件名称相同但描述不同:

  • ert.tlc — 为 Embedded Coder 创建 Visual C/C++ 解决方案文件

  • grt.tlc — 为 Simulink Coder 创建 Visual C/C++ 解决方案文件

为了避免混淆,请点击浏览选择系统目标文件,并查看每个文件的描述。

升级模型以使用工具链方法

当您打开在 R2013b 之前创建的、使用以下系统目标文件的模型时,软件会尝试升级模型。升级将配置从使用模板联编文件设置更改为使用工具链设置:

  • ert.tlc — Embedded Coder

  • ert_shrlib.tlc — Embedded Coder (基于主机的共享库目标)

  • grt.tlc — 一般实时目标

注意

要将使用自定义系统目标文件的模型升级为使用工具链方法,请参阅Support Toolchain Approach with Custom Target

某些模型配置参数值会阻止软件将模型升级为使用工具链设置。以下说明指导您如何完成升级过程。

假设您要升级模型并使用工具链编译方法。这么做并不是必须的,您仍然可以从未升级的模型中生成代码。

注意

软件不会升级使用以下系统目标文件的模型:

  • ert.tlc — 为 Embedded Coder 创建 Visual C/C++ 解决方案文件

  • grt.tlc — 为 Simulink Coder 创建 Visual C/C++ 解决方案文件

要判断模型是否已升级,有如下方法:

  1. 如果指定了工具链编译配置配置参数,则该模型已升级。

    如果指定了联编文件配置参数,如生成联编文件Make 命令模板联编文件,则该模型尚未升级。

首先,使用文件 > 另存为为模型创建一个工作副本。此操作将保留原始模型和配置参数以供参考。

尝试使用升级顾问升级模型:

  1. 建模选项卡的评估和管理部分中,选择升级顾问

  2. 在升级顾问中,选择检查并更新模型,以使用工具链方法编译生成的代码,然后点击运行此检查

  3. 执行建议的操作和/或点击更新模型

如果您不能使用升级顾问升级模型,则以下一个或多个参数未设置为如下默认值:

  • 编译器优化级别 - 关闭优化(编译速度更快)

  • 生成联编文件 - 启用

  • 模板联编文件 - 系统目标文件特定的模板联编文件

  • Make 命令 - make_rtw(不带参量)

有时,模型确实不能升级。请尝试以下步骤:

  • 如果生成联编文件被禁用,这种情况下则不能升级。但是,您可以尝试启用它,然后尝试使用升级顾问升级模型。

  • 如果编译器优化级别设置为打开优化(运行速度更快)

    1. 编译器优化级别设置为关闭优化(编译速度更快)

    2. 使用升级顾问升级模型。

    3. 编译配置设置为快速运行

  • 如果编译器优化级别设置为自定义

    1. 自定义编译器优化标志复制到文本文件中。

    2. 编译器优化级别设置为关闭优化(编译速度更快)

    3. 使用升级顾问升级模型。

    4. 编译配置设置为指定

    5. 要执行相同的优化,请编辑编译器选项。

  • 如果模板联编文件使用自定义模板联编文件,这种情况下则不能升级。但是,您可以尝试以下步骤:

    1. 更新模板联编文件以使用系统目标文件的默认联编文件。

      注意

      要获取默认的联编文件名称,请更改系统目标文件,点击应用,再更改回原来的名称,然后再次点击应用

    2. 使用升级顾问升级模型。

    3. 如果模板联编文件包含编译工具选项(如编译器优化标志),请将编译配置设置为指定并更新选项。

    4. 如果模板联编文件使用自定义编译工具,请创建并注册自定义工具链,如Custom Toolchain Registration 中所述。然后将工具链参数设置为使用自定义工具链。

      注意

      注册自定义工具链后,更新工具链以使用自定义工具链。

    5. 如果模板联编文件包含自定义规则和逻辑,则这些自定义不能应用于已升级的模型。

模板联编文件方法

系统目标文件设置为使用模板联编文件方法的 tlc 文件时,软件显示编译器优化级别生成联编文件Make 命令模板联编文件参数。

指定是否生成联编文件

生成联编文件选项指定编译过程是否为模型生成联编文件。默认情况下,编译过程会生成联编文件。但是,举例来说,如果要支持不是基于联编文件的自定义编译处理,则可以取消选择生成联编文件,禁止生成联编文件。如果取消选择此参数:

指定 Make 命令

每个基于模板联编文件的系统目标文件都有一个关联的 make 命令。代码生成器使用此内部 MATLAB® 命令来控制编译过程。当您启动编译过程时,此命令将出现在 Make 命令字段中并开始运行。

大多数系统目标文件使用默认命令 make_rtw。第三方系统目标文件可能提供了其他 make 命令。请参阅供应商提供的文档。

除了 make 命令的名称外,还可以在 Make 命令字段中提供联编文件选项。这些选项可能包括编译器特定的选项,包括路径和其他参数。当编译过程调用 make 工具函数时,会通过 make 命令行来传递这些选项,将它们添加到传递给编译器的全部标志中。

Template Makefiles and Make Options列出了每个支持的编译器可以使用的 Make 命令选项。

指定模板联编文件

模板联编文件字段具有以下功能:

  • 如果您使用系统目标文件浏览器选择了系统目标文件,此字段将显示 MATLAB 语言文件的名称,为您的开发环境选择一个模板联编文件。例如,在模型配置参数:代码生成中,模板联编文件字段显示 grt_default_tmf,指示编译过程调用 grt_default_tmf.m

    Template Makefiles and Make Options详细介绍了编译过程选择模板联编文件所依据的逻辑。

  • 您也可以在此字段中显式输入特定模板联编文件的名称(包括扩展名),或者输入用于返回模板联编文件的 MATLAB 语言文件的名称。如果您要使用系统目标文件浏览器中没有出现的系统目标文件,请使用此方法。例如,如果您为自定义系统目标文件编写了自己的模板联编文件,请使用此方法。

如果您指定自己的模板联编文件,请确保包含文件扩展名。如果您省略扩展名,编译过程将尝试查找并执行具有 .m 扩展名的文件(即 MATLAB 语言文件)。模板联编文件(或返回模板联编文件的 MATLAB 语言文件)必须位于 MATLAB 路径中。要确定该文件是否在 MATLAB 路径中,请在 MATLAB 命令行窗口输入以下命令:

which tmf_filename

将模板联编文件与工具链相关联

为模板联编文件编译过程指定工具链。以下示例提供最小工具链的定义,并说明如何将工具链与作为 ert_unix.tmfert_vcx64.tmf 副本的模板联编文件相关联。

  1. 使用 ert_unix.tmfert_vcx64.tmf 的副本作为模板联编文件。

    copyfile(fullfile(matlabroot, 'toolbox', 'coder', ...
                      'compile', 'tmf', 'ert_vcx64.tmf'), ...
                      'ert_copy.tmf')

  2. 在模板联编文件(即 ert_copy.tmf)中,编辑 TOOLCHAIN_NAME 宏。

    TOOLCHAIN_NAME = "Minimal Toolchain for TMF Build"

    注意

    与 R2018a 之前版本的对应文件相比,当前版本的 ert_unix.tmfert_vcx64.tmf 文件已简化。软件通过检查变量 TOOLCHAIN_NAME 是否存在来确定模板联编文件是否使用了此简化方法。如果模板联编文件是基于 R2018a 之前版本的 ert_unix.tmfert_vcx64.tmf 文件,则没有指定 TOOLCHAIN_NAME 变量。

    此简化方法通过 |>MODEL_MODULES<| 标记来指定 mainmodel 和其他需要编译的源文件。如果模板联编文件是基于 R2018a 之前版本的 ert_unix.tmfert_vcx64.tmf 文件,则会将 mainmodel 源文件显式添加到需要编译的源文件列表中。

    要更新源于 R2018a 之前版本的模板联编文件,请执行以下操作:

    1. 删除对 ert_main.cclassic_main.crt_main.c 的引用。例如,像 ert_main.c 这样的字面值引用或像 ert_main.$(TARGET_LANG_EXT) 这样的标记化引用。

    2. 删除对 $(MODEL).c$(MODEL).$(TARGET_LANG_EXT) 的引用。

  3. 将工具链与模板联编文件相关联。

    1. 创建一个工具链定义文件。对于此示例,请使用以下代码:

       工具链定义文件

    2. 运行工具链定义文件,这将生成 ToolchainInfo 对象 tc

      tc = minimalToolchainForTMF;

    3. ToolchainInfo 对象保存到 MAT 文件中。

      save('tcMinimal','tc')

    4. RTW.TargetRegistry 中注册工具链。

      1. 将以下代码放在 rtwTargetInfo.m 文件中。

        function rtwTargetInfo(tr)
        tr.registerTargetInfo(@loc_createToolchain);
        end
        
        function config = loc_createToolchain
        config(1) = coder.make.ToolchainInfoRegistry;
        config(1).Name = 'Minimal Toolchain for TMF Build';
        config(1).FileName = fullfile(fileparts(mfilename('fullpath')),...
            'tcMinimal.mat');
        config(1).TargetHWDeviceType = {'*'};
        config(1).Platform =  {computer('arch')};
        end

      2. 将该文件保存在当前工作文件夹中或保存在 MATLAB 搜索路径上的文件夹中。

      3. 重置 TargetRegistry

        RTW.TargetRegistry.getInstance('reset');

  4. 将模板联编文件与您的模型相关联并编译模型。

    set_param(model, 'TemplateMakefile', 'ert_copy.tmf');
    slbuild(model);

指定 TLC 以用于代码生成

目标语言编译器 (TLC) 是代码生成器的重要组成部分。它使您能够自定义生成的代码。通过自定义,您可以生成特定于平台的代码,也可以融入您自己的算法更改,以改善执行速度、代码大小或保留与现有方法的兼容。有关详细信息,请参阅目标语言编译器概述

您为代码生成指定的 TLC 选项显示在生成的 HTML 代码生成报告的摘要部分。

注意

指定 TLC 命令行选项不会在 make 命令行中添加标志。

您可以在 set_param 函数调用中使用模型参数 TLCOptions 指定进行代码生成的目标语言编译器 (TLC) 命令行选项和参量。例如,

>> set_param(gcs,'TLCOptions','-p0 -aWarnNonSaturatedBlocks=0')

TLC 选项的一些常见用法包括:

  • -aVarName=1 用于声明 TLC 变量和/或为其赋值

  • -IC:\Work 用于指定包含路径

  • -v 用于获取 TLC 处理的详尽输出(例如,在进行调试时)

在生成代码的重新编译中使用校验和

当您在 GenerateMakefile 设置为 'on'GenCodeOnly 设置为 'off' 的状态下编译模型时,软件会生成一个联编文件,并运行该联编文件来编译生成的代码。编译完成后,软件会创建并保存源文件和配置数据的校验和。

如果在编译模型时可以使用上一个版本的校验和,则:

  1. 软件使用校验和来确定源文件和配置数据是否与之前的编译不同。

  2. 如果软件检测到差异,则软件会:

    • 重新生成联编文件。

    • 重新编译生成的代码。

如果编译过程使用模板联编文件,您可以通过将以下文本添加到模板联编文件来禁用校验和:

DO_NOT_USE_CHECKSUMS=1
在这种情况下,软件使用文件时间戳来确定是否应重新编译生成的代码。

相关主题