主要内容

提高内联 S-Function 的代码效率和集成度

目标语言编译器 (TLC) 模块接口是 Simulink® 代码生成基础架构的关键组成部分。它是一组由 S-Function 模块的代码生成实现所使用的函数和记录。您可以使用 .tlc 文件为 S-Function 模块生成代码。此顶层图显示 TLC 模块接口在代码生成过程中的作用。有关将模块图转换为高质量代码的详细信息,请参考目标语言编译器基础知识

TLC 模块接口集成在 Simulink Coder™ 的后端。位于后端会延迟其执行,进而引入若干约束。其有效性也受到限制,因为许多 Simulink Coder 优化变换是在中端进行的。

增强 TLC 模块接口

增强 TLC 模块接口在 Simulink Coder 优化阶段引入 S-Function 模块 TLC 实现。这种基础架构更改使 S-Function 模块代码能够更高效地集成到模型的生成代码中,从而通过增强的优化和自定义能力提高代码效率。

此图示说明具有 (a) TLC 模块接口和 (b) 增强 TLC 模块接口的 Simulink Coder 架构。

The image illustrates the Simulink Coder architecture in the TLC block interface and the enhanced TLC block interface

S-Function 模块与 Simulink Coder 优化阶段的兼容性必须由 .tlc 文件指定。此增强 TLC 模块接口提供以下好处:

  • 改进了生成代码中 S-Function 模块输入和输出的缓冲区分配

  • 改进了为 S-Function 模块生成的代码的内联

  • 重用 for 循环迭代中使用的局部变量

  • 一组更显式的跨版本兼容 TLC 库函数

增强 TLC 模块接口使用优化,包括为在 Function-Call Subsystem 模块内部具有 TLC 实现的 S-Function 模块以及为 Stateflow® 内部的 Simulink 函数 模块提供更好的循环生成和改进的缓冲区分配。

启用增强 TLC 模块接口

要启用增强 TLC 模块接口,请对模块和目标 TLC 文件进行必要的更改。

模块 TLC 文件

BlockInstanceSetup 调用 LibEnableBlockFcnOptimizations(请参阅Block Target File Methods)以便为 S-Function 启用增强 TLC 模块接口。

%function BlockInstanceSetup(block, system) void
%<LibEnableBlockFcnOptimizations(block)>
%endfunction

目标 TLC 文件

在目标 TLC 文件中,请在系统目标文件开头的全局变量声明中定义 PreCodeGenExecCompliant 变量,并将其放在 %include 语句之前。此放置方式可确保 TLC 在初始化代码生成的编译设置之前读取和计算该变量。如果不在早期阶段定义 PreCodeGenExecCompliant,则系统会将其排除在 rtwgensettings 之外。有关 rtwgensettings 的信息,请参阅 rtwgensettings 结构体

接下来,确定目标是否包含 codegenentry.tlc

  • 情形 1 - 目标包含 codegenentry.tlc 并且不包含自定义 TLC 代码:

    定义全局变量 PreCodeGenExecCompliant,如 rtw/c/tlc/grt/grt.tlc 中的此示例中所示。

    %assign TargetRegistSynchroOp = 1
    %assign PreCodeGenExecCompliant = 1
    
    %include "codegenentry.tlc"

  • 情形 2 - 目标包含 codegenentry.tlc 并且包含自定义 TLC 代码:

    这显示自定义目标 TLC 文件的结构,该文件包含 codegenentry.tlc 和自定义 TLC 代码:

    %%% START global TLC variable declaration
    ...
    %%% END global TLC variable declaration
    %%% START custom TLC target code
    ...
    %include "codegenentry.tlc"
    ...
    %%% END custom TLC target code

    在以下代码中,您可以观察到支持在 Simulink Coder 优化阶段之前执行目标 TLC 文件所需的修改,如 matlab/rtw/c/raccel/raccel.tlc 中的示例所示。

    %%% START global TLC variable declaration
    %assign PreCodeGenExecCompliant = 1
    ...
    %%% END global TLC variable declaration
    %if EXISTS("::CompiledModel")
    %include "codegenentrylib.tlc"
    %if LibIsPreCodeGenPhase()
    %include "codegenentry.tlc"
    %else
    %%% START custom TLC target code
    ...
    %include "codegenentry.tlc"
    ...
    %%% END custom TLC target code
    %endif %% LibIsPreCodeGenPhase()
    %endif %% EXISTS("::CompiledModel")

  • 情形 3 - 目标不包含 codegenentry.tlc

    包含用于在 Simulink Coder 优化阶段之前和之后执行的 TLC 程序之间切换的代码。此示例说明不包含 codegenentry.tlc 的目标 TLC 文件的内容。

    %%% START global TLC variable declaration
    ...
    %%% END global TLC variable declaration
    %%% START custom TLC target code
    ...
    %%% END custom TLC target code

    在以下代码中,您可以观察到支持在 Simulink Coder 优化阶段之前执行目标 TLC 文件所需的修改,如 rtw/c/rsim/rsim.tlc 中的示例所示。

    %%% START global TLC variable declaration
    %assign PreCodeGenExecCompliant = 1
    ...
    %%% END global TLC variable declaration
    %if EXISTS("::CompiledModel")
    %include "codegenentrylib.tlc"
    %if LibIsPreCodeGenPhase()
    %include "codegenentry.tlc"
    %else
    %%% START custom TLC target code
    ...
    %%% END custom TLC target code
    %endif %% LibIsPreCodeGenPhase()
    %endif %% EXISTS("::CompiledModel")

注意

为避免编译错误,请更新系统目标文件以支持用于代码生成的增强 TLC 模块接口。

支持的函数

在自定义 TLC 代码中使用来自 rtw/c/tlc/public_api 的已公开 TLC 函数,以提供跨版本兼容性。避免在 rtw/c/tlc/private_api 中使用未公开的 API,因为这些 API 将来可能不受支持。

调试和错误处理

增强 TLC 模块接口包括对调试选项的支持,例如支持 TLC 调试器、TLC 覆盖率、TLC 断言和 TLC 探查器;支持 TLC 错误处理;以及支持通过使用保留 .rtw 文件配置参数支持保留生成的 model.rtw 文件。

Simulink Coder 优化阶段中的 TLC 模块分析阶段作为单独的 TLC 进程运行。通过启用指定的 TLC 调试选项,您可以独立调试在 TLC 模块分析阶段内执行的模块 TLC 代码。在“配置参数”对话框中,在代码生成窗格下的高级参数中启用以下参数:

  • 生成代码时启动 TLC 覆盖率报告 - 跟踪代码执行频率,并将来自 TLC 模块分析阶段的覆盖率数据与目标 TLC 的数据合并到一个报告中。通过此报告可全面了解代码测试覆盖率。

  • 保留 .rtw 文件 - 创建一个包含 TLC 模块分析阶段元数据的新文件 modelName_reduced.rtw,同时保留文件 modelName_reduced.rtw

  • 探查 TLC - 收集 TLC 代码的时间统计量,并为模块分析生成文件 modelName_frontend.html,为目标 TLC 生成文件 modelName.html

  • 生成代码时启动 TLC 调试器 - 设置断点、检查变量、导航 TLC 代码,并在不中断工作流的情况下更正生成代码中的错误。

  • 启用 TLC 断言 - 在 TLC 代码中的条件失败处停止编译过程,并生成 TLC 栈跟踪以识别 .tlc 文件中的错误。

另请参阅

主题