提高内联 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 架构。

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 代码的时间统计量,并为模块分析生成文件
,为目标 TLC 生成文件modelName_frontend.html。modelName.html生成代码时启动 TLC 调试器 - 设置断点、检查变量、导航 TLC 代码,并在不中断工作流的情况下更正生成代码中的错误。
启用 TLC 断言 - 在 TLC 代码中的条件失败处停止编译过程,并生成 TLC 栈跟踪以识别
.tlc文件中的错误。