主要内容

自定义模板生成文件

要配置或自定义模板生成文件(TMF),您应该熟悉使命令的工作原理以及它如何处理makefile (楼上文件)。您还应该了解makefile构建规则。有关这些主题的信息,请参考使用的make实用程序提供的文档。

模板生成文件和令牌

模板生成文件包含令牌。构建过程展开令牌并创建makefile:

  • 模型楼上编译和链接从模型组件生成的代码。

  • rtwshared.mk编译生成的共享实用程序代码。

生成文件(model_or_sharedutils楼上)使用特定于开发计算机的命令。

模板生成文件令牌

make_rtw命令(或带有某些目标的不同命令)指导生成过程model_or_sharedutils楼上.的make_rtw属性上指定的TMF代码生成窗格中的“配置参数”对话框。make_rtw逐行复制TMF,展开遇到的每个令牌。Template Makefile令牌由make_rtw扩展列出令牌及其展开项。

这些令牌被扩展的makefile以几种方式使用:

  • 来控制makefile中的条件行为。条件用于控制源文件列表、库名称、要构建的目标和其他与构建相关的信息。

  • 要提供编译文件的宏定义,例如,-DINTEGER_CODE = 1

Template Makefile令牌由make_rtw扩展

令牌 扩张
通用

| > ADDITIONAL_LDFLAGS < |

由块自动添加的链接器标志。

| > ALT_MATLAB_BIN < |

MATLAB的备用全路径名®可执行;Value不同于Value forMATLAB_BIN当完整路径名包含空格时。

| > ALT_MATLAB_ROOT < |

MATLAB安装的备用完整路径名;Value不同于Value forMATLAB_ROOT当完整路径名包含空格时。

| > BUILDARGS < |

传递给make_rtw.提供此标记是为了使您的model_or_sharedutils楼上当您更改构建参数时,文件将更改,从而在您的构建选项更改时强制更新模块。

| > COMBINE_OUTPUT_UPDATE_FCNS < |

选择型号配置参数时为True (1)单输出/更新功能,否则为False(0)。用于宏定义-DONESTEPFCN = 1

| > COMPILE_FLAGS_OTHER < |

以外的组中的编译器标志“选择”“OPT_OPTS”,“OPTIMIZATION_FLAGS”.构建过程生成一个警告,如果| > COMPILE_FLAGS_OTHER < |不存在,以下条件适用:

  • 构建信息包含一个不在中的编译器标志“选择”“OPT_OPTS”,或“OPTIMIZATION_FLAGS”

  • 编译器标志不在模板生成文件中。

计算机< | | >

电脑类型。参见MATLAB电脑命令。

| > DEFINES_OTHER < |

以外的组中的预处理器宏定义“选择”“OPT_OPTS”“OPTIMIZATION_FLAGS”,“自定义”

中的预处理器宏定义“选择”“OPT_OPTS”“OPTIMIZATION_FLAGS”,或“自定义”在模板makefile中没有展开的有相应变量/令牌对的DEFINES_OTHER.此行为有助于避免提供重复的预处理器宏定义。

例如,一些模板生成文件包含这些语句:

...Numst = |> Numst <|…Cpp_req_defines1 =…-DNUMST = $ (NUMST)…
如果模板makefile包含变量/令牌对Numst = |> Numst <|而且NUMST预处理器宏定义在吗buildInfo,则构建过程不会在其中展开它DEFINES_OTHER

构建过程生成一个警告,如果| > DEFINES_OTHER < |不存在,以下条件适用:

  • 构建信息包含不在中的预处理器宏定义“选择”“OPT_OPTS”“OPTIMIZATION_FLAGS”,或“自定义”

  • 预处理器宏定义,例如,NUMST,不在模板makefile中。

| > EXPAND_LIBRARY_LOCATION < |

预编译库文件的位置。的TargetPreCompLibLocation配置参数可以覆盖此设置。有关示例,请参见在构建期间控制库的位置和命名

| > EXPAND_LIBRARY_NAME < |

库名称。有关示例,请参见在构建期间控制库的位置和命名而且修改rtwmakecfg的模板制作文件

| > EXPAND_LIBRARY_SUFFIX < |

图书馆后缀。的TargetLibSuffix配置参数可以覆盖此设置。有关示例,请参见在构建期间控制库的位置和命名

| > EXT_MODE < |(R2018a及以后提供的模板makefile指定不需要TOOLCHAIN_NAME

True(1)启用生成外部模式支持代码,否则为False(0)。金宝app

| > EXTMODE_TRANSPORT < |(R2018a及以后提供的模板makefile指定不需要TOOLCHAIN_NAME

传输机制的索引(例如,tcpip串行)为外部模式。

| > EXTMODE_STATIC < |(R2018a及以后提供的模板makefile指定不需要TOOLCHAIN_NAME

如果外部模式选择静态内存分配,则为True(1)。如果选择动态内存分配,则为False(0)。

| > EXTMODE_STATIC_SIZE < |(R2018a及以后提供的模板makefile指定不需要TOOLCHAIN_NAME

外部模式的静态内存分配缓冲区的大小。

| > GENERATE_ERT_S_FUNCTION < |

(1)当模型配置参数为真创建块设置为,否则为False(0)。用于控制构建的makefile目标。

| > INCLUDE_MDL_TERMINATE_FCN < |

(1)当模型配置参数为真需要终止函数选择,否则为False(0)。用于宏定义-DTERMFCN = = 1

| > INTEGER_CODE < |

(1)当模型配置参数为真金宝app支持浮点数否则为False(0)。INTEGER_CODE是编译源代码时必需的宏定义,并在选择要链接的预编译库时使用。

| > MAKEFILE_NAME < |

model_or_sharedutils楼上—从TMF创建的makefile的名称。

| > MAT_FILE < |

(1)当模型配置参数为真MAT-file日志否则为False(0)。MAT_FILE是编译源代码时必需的宏定义,也用于在构建过程中包含日志记录代码。

| > MATLAB_BIN < |

定位的MATLAB可执行程序。

| > MATLAB_ROOT < |

安装MATLAB的路径。

| > MEM_ALLOC < |

RT_MALLOCRT_STATIC.指示如何分配内存。

| > MEXEXT < |

MEX-file扩展。参见MATLABmexext命令。

| > MODEL_MODULES < |

额外生成的源模块。例如,你可以把一个大的模型分成两个文件,模型.c而且模型1.摄氏度.在本例中,这个令牌扩展为模型1.摄氏度

| > MODEL_MODULES_OBJ < |

对象文件名(.obj)对应额外生成的源模块。

| > MODEL_NAME < |

Simulink的名称金宝app®目前正在构建框图。

< | | >多任务

如果解算器模式是多任务处理,则为True(1),否则为False(0)。

| > NCSTATES < |

连续状态数。

| > NUMST < |

模型中的采样次数。

| > RELEASE_VERSION < |

MATLAB发布版。

| > S_FUNCTIONS_LIB < |

可供链接的s函数库列表。

< | | >解算器

解算器源文件名,例如,ode3.c

| > SOLVER_OBJ < |

求解器对象(.obj)文件名,例如,ode3.obj

| > TARGET_LANG_EXT < |

c当模型配置参数语言设置为Ccpp语言设置为c++.在makefile中用于控制生成的源文件的扩展名。

| > TGT_FCN_LIB < |

指定编译器命令行选项。makefile中的行是Tgt_fcn_lib = |> Tgt_fcn_lib <|.在makefile条件语句中使用此令牌可以指定一个标准数学库作为编译器选项。可能的|>TGT_FCN_LIB<|令牌值有:

价值 生成呼叫
自定义CRL名称 Iso®/ iec 9899:1990 c (ANSI_C标准数学库
ISO_C ISO/ iec9899:1999 C标准数学库
ISO_C + + ISO/IEC 14882:2003 c++标准数学库
GNU ISO/IEC 9899:1999 C标准数学库的GNU扩展

| > TID01EQ < |

如果连续任务和第一个离散任务的采样率相等,则为True(1),否则为False(0)。

s函数和构建信息支持金宝app

请注意

有关本节中令牌的示例,请参见修改rtwmakecfg的模板制作文件

| > START_EXPAND_INCLUDES < |
| > EXPAND_DIR_NAME < |
| > END_EXPAND_INCLUDES < |

要添加到包含路径的文件夹名称列表。此外,ADD_INCLUDES宏必须添加到包括线。

| > START_EXPAND_LIBRARIES < |
| > EXPAND_LIBRARY_NAME < |
| > END_EXPAND_LIBRARIES < |

库名称列表。

| > START_EXPAND_MODULES < |
| > EXPAND_MODULE_NAME < |
| > END_EXPAND_MODULES < |

库模块名称| > START_EXPAND_LIBRARIES < |而且| > START_PRECOMP_LIBRARIES < |库列表。

| > START_EXPAND_RULES < |
| > EXPAND_DIR_NAME < |
| > END_EXPAND_RULES < |

Makefile规则。

| > START_PRECOMP_LIBRARIES < |
| > EXPAND_LIBRARY_NAME < |
| > END_PRECOMP_LIBRARIES < |

预编译库名称的列表。

模型引用支持金宝app

请注意

有关本节中令牌的示例,请参见在TMF中提供模型引用支持金宝app

| > MASTER_ANCHOR_DIR < |

对于并行构建,当前工作文件夹(松材线虫病)在构建开始的时候。

| > MODELLIB < |

为当前模型生成的库文件的名称。

| > MODELREFS < |

顶级模型引用的模型列表。

| > MODELREF_LINK_LIBS < |

顶层模型链接到的引用模型库的列表。

| > MODELREF_LINK_RSPFILE_NAME < |

顶层模型链接的响应文件的名称。此令牌仅对支持链接器响应文件的构建环境有效。金宝app有关它的使用示例,请参见matlabroot/工具箱/编码器/编译/ tmf / grt_vcx64.tmf

| > MODELREF_TARGET_TYPE < |

正在构建的目标类型。可能的值为

  • 没有一个:独立模型或引用其他模型的顶模型

  • 环球套票:模型参考目标构建

  • SIM卡:模型参考仿真目标构建

| > RELATIVE_PATH_TO_ANCHOR < |

相对路径,从生成的makefile位置到MATLAB工作文件夹。

| > START_DIR < |

在构建开始时的代码生成文件夹。并行构建需要此令牌。

通过替换构建过程已知的参数值来扩展这些标记。例如,如果源模型包含具有两个不同采样时间的块,则TMF语句

Numst = |> Numst <|

扩展:

Numst = 2

除了以上,make_rtw展开来自其他来源的令牌:

  • 在“配置参数”对话框的目标选项中定义的目标特定令牌

  • 的结构rtwoptions部分的系统目标文件。的结构rtwoptions构造包含字段的数组makevariable是扩大。

下面的例子是从matlabrootgrt / rtw / c / /grt.tlc.这部分以BEGIN_RTW_OPTIONS包含MATLAB代码设置rtwoptions.下面的指令导致| > EXT_MODE < |要扩展到的令牌1(对)或0(off),这取决于你如何设置外部模式选项。

rtwoptions(2)。makevariable='EXT_MODE'

调用make实用程序

使命令

在创建model_or_sharedutils楼上从TMF中调用使命令。调用使,构建过程发出此命令。

makecommand- fmodel_or_sharedutils楼上

makecommand定义为MAKECMD宏在您的系统目标文件TMF(请参阅模板制作文件的结构).可以指定其他选项使通过使用模型配置参数使命令.(请参阅指定Make命令而且模板制作文件和制作选项.)

例如,指定OPT_OPTS = - 02使命令场的原因make_rtw要生成以下内容使命令。

makecommand- fmodel_or_sharedutils楼上OPT_OPTS = - 02

TMF顶部的注释指定可用的使命令选项。如果这些选项不能为您提供足够的灵活性,您可以配置自己的TMF。

制作实用工具版本

make实用程序允许您控制构建实时程序的几乎所有方面。有几个不同的版本使可用。代码生成器提供自由软件基金会GNU®使适用于两个UNIX系统®1下的特定于平台子文件夹中的PC平台

matlabroot/ bin

的其他版本是可以使用的使使用代码生成器,尽管建议使用GNU Make。要与代码生成器兼容,请验证您的版本使金宝app支持以下命令格式。

makecommand- fmodel_or_sharedutils楼上

模板制作文件的结构

TMF有多个部分,包括以下部分:

  • 摘要描述makefile的目标。这里是一个来自ERT tmf的代表性摘要matlabroot/工具箱/编码器/编译/ tmf

    #摘要:使用生成的C代码和# Microsoft Visual C/ c++编译器构建基于windows的独立嵌入式实时版Simulink模型的模板制作文件。金宝app注意,这个模板是由build #过程自动定制的,以创建。下面的定义可以用来修改# build的行为:# OPT_OPTS优化选项。参见# vctools中的DEFAULT_OPT_OPTS。默认为Mak。# OPTS -用户特定的选项。# CPP_OPTS - c++编译器选项。# USER_SRCS -其他用户源,例如# S-functions所需的文件。# USER_INCLUDES -附加包含路径#(即USER_INCLUDES="- iwhereever - iwhereever2 ") # #打开调试:# set DEBUG_BUILD = 1,这将触发OPTS=- zi(可能与#编译器版本不同,请参阅编译器文档)# #此模板制作文件被设计用于包含'rtwgensettings. #的系统目标文件。BuildDirSuffix'参见ert.tlc
  • 宏由make_rtw读取section -定义宏make_rtw如何处理TMF。这是一位代表宏由make_rtw读取部分从GRT TMFs中matlabroot/工具箱/编码器/编译/ tmf

    #------------------------由make_rtw读取的宏----------------------------- # #以下宏由构建过程读取:# # MAKECMD -这是用于调用make实用程序的命令# HOST -这个模板生成文件的目标平台#(即PC或UNIX) # build -从构建过程调用make(是/否)?# SYS_TARGET_FILE系统目标文件名称。MAKECMD = nmake HOST = PC BUILD = yes SYS_TARGET_FILE = any BUILD_SUCCESS = ^#^#^#通过指定兼容的工具链TOOLCHAIN_NAME = [\ "Microsoft Visual c++ 2019 v16.0 | nmake(64位Windows)", \ "Microsoft Visual c++ 2017 v15.0 | nmake(64位Windows)", \ "Microsoft Visual c++ 2015 v14.0 | nmake(64位Windows)"]

    本节中的宏可能包括:

    • MAKECMD—用于调用make实用程序的命令。例如,如果MAKECMDmymake,则使调用的命令为

      mymake - fmodel_or_sharedutils楼上

    • 宿主-指定这个TMF的目标平台。这可以是个人电脑UNIXcomputer_name(参见MATLAB电脑命令),或任何

    • 构建——指示make_rtw是否应该调用使从构建过程。指定是的没有

    • SYS_TARGET_FILE—系统目标文件的名称或值任何.用于一致性检查make_rtw方法中指定的系统目标文件目标选择面板代码生成窗格中的“配置参数”对话框。如果你指定任何,您可以将TMF用于任何系统目标文件。

    • BUILD_SUCCESS—当makefile创建静态库时,它会生成BUILD_SUCCESS字符串,例如,在ert_vcx64.tmf

      (产品):美元(obj) (LIBS) (MODELREF_LINK_LIBS)美元@cmd / C“回声# # #链接……”$(LD) $(LDFLAGS) $(LIBS) \ @$(CMD_FILE) @$(MODELREF_LINK_RSPFILE) -dll -def:$(MODEL).def out:$@ @cmd /C "echo $(BUILD_SUCCESS)动态链接库$(PRODUCT)"

      时,构建过程发现BUILD_SUCCESS字符串时,它轮询是否存在已更新的静态库文件。构建过程不会将库文件链接到可执行文件,直到构建过程可以在文件系统上使用更新的时间戳确认库文件的存在。

      如果构建过程没有找到BUILD_SUCCESS在编译日志中,构建过程假设更新后的库存档在文件系统上可用。如果需要,构建过程将库链接到可执行文件。

  • 由make_rtw展开的令牌section -定义令牌make_rtw扩张。以下是一位代表的简短节选由make_rtw展开的令牌部分从ERT tmf中matlabroot/工具箱/编码器/编译/ tmf /

    #---------------------- 令牌扩大了make_rtw  ---------------------------- # # 以下标记,当用“| >”和“< |”扩大的#构建过程。# # MODEL_NAME - Simulink框图的名金宝app称# MODEL_MODULES -任何其他生成的源模块# MAKEFILE_NAME -从模板makefile创建的makefile的名称。mk# MATLAB_ROOT -安装MATLAB的路径. ...Model = |> model_name <| modules = |> model_modules <| product = |> product <| makefile = |> makefile_name <| matlab_root = |> matlab_root <|…

    有关TMF令牌的更多信息,请参见Template Makefile令牌由make_rtw扩展

  • 后面的部分因编译器、主机和目标而异。一些常见的部分包括模型和参考模型外部模式工具规格工具的定义包括路径C标志附加的库,源文件

  • 规则section -包含用于从生成的源代码构建可执行文件的make规则。构建规则通常特定于您的make版本。的规则节后面可能跟着相关的节,例如依赖关系

自定义和创建模板生成文件

简介

本节描述设置自定义模板makefile (TMF)并将其合并到构建过程中的机制。本文还讨论了修改TMF的技术以及与TMF相关的MATLAB文件机制。

在创建自定义TMF之前,您应该阅读文件夹和文件命名约定了解自定义目标的文件夹结构和MATLAB路径要求。

创建模板Makefile

若要自定义或创建新的TMF,请复制现有GRT或ERT TMFmatlabroot/工具箱/编码器/编译/ tmf

将副本放在与相关系统目标文件相同的文件夹中。通常,这是mytarget / mytarget目标文件夹结构中的文件夹。然后,重命名TMF(例如,mytarget.tmf)并加以修改。

要允许构建过程定位和选择TMF,必须在系统目标文件文件头中提供信息(请参阅系统目标文件结构).对于实现单个TMF的目标,指定要在构建过程中使用的TMF的标准方法是使用系统目标文件文件头的TMF指令。

TMF: mytarget.tmf

在模板生成文件中使用宏和模式匹配表达式

本节通过一个示例说明如何在TMF中使用宏和文件模式匹配表达式来生成命令model_or_sharedutils楼上

make utility过程model_or_sharedutils楼上中定义的依赖规则生成一组命令model_or_sharedutils楼上.后使生成用于构建或重建的命令集测验使执行它们。

例如,要构建一个名为测验使必须链接目标文件。但是,如果目标文件不存在或过期,使必须编译源代码。因此源文件和目标文件之间存在依赖关系。

每个版本使其特征和规则定义方式略有不同。例如,考虑一个名为测验它有两个来源,file1.c而且file2.c.使用大多数版本的使,依赖规则为

测试:file1。o file2.occ-o test file1.o file2.o file1.o: file1.c cc -c file1.c file2.o: file2.c cc -c file2.c

在本例中,是UNIX2假设环境。在PC环境中,文件扩展名、编译和链接命令是不同的。

在处理第一条规则时

测试:file1。o file2.o

使看到了构建测验,它需要建设file1.o而且file2.o.构建file1.o使处理规则

file1.o:file1.c

如果file1.o不存在,或者如果file1.o年龄比file1.c使编译file1.c

tmf的格式遵循上面的示例。的附加特性使例如宏和文件模式匹配表达式。在大多数版本中使定义宏时使用

MACRO_NAME =价值

宏的引用由$ (MACRO_NAME).当使看到这种表达形式,它就代替了价值$ (MACRO_NAME)

您可以使用模式匹配表达式使依赖规则更通用。例如,使用GNU3.你可以把这两个替换掉file1.o:file1.c"和"file2.o:file2.c的规则

%。O: %.c cc -c $<

请注意,$ <在前面的例子中,有一个特殊的宏,它等同于依赖文件(即file1.cfile2.c).因此,使用宏和模式匹配字符,前面的例子可以简化为

SRCS = file1.c file2.c OBJS = $(SRCS:.c=.o) test: $(OBJS) cc -o $@ $(OBJS) %。O: %.c cc -c $<

注意$ @上面的宏是另一个特殊的宏,在本例中,它等同于当前依赖项目标的名称测验

这个示例生成对象列表(obj)从资料来源(src),使用文本替换功能进行宏展开。它替换源文件扩展名(例如,.c)和目标文件扩展名(.o).这个例子还概括了程序的构建规则,测验,使用特殊的“$ @“宏。

使用rtwmakecfg自定义生成的makefile

tmf提供令牌,允许您将以下项目添加到生成的makefile中:

  • 源文件夹

  • 包括文件夹

  • 运行时库名称

  • 运行时模块对象

s -函数可以将此信息添加到makefile中rtwmakecfg.m文件的功能。在构建包含一个或多个S-Function块(如设备驱动程序块)的模型时,此函数特别有用。

要向makefile添加有关s函数的信息,请执行以下操作:

  1. 创建函数rtwmakecfg在文件rtwmakecfg.m.代码生成器将此文件与基于其文件夹位置的s函数相关联。

  2. 修改目标的TMF,使其支持返回信息的宏展开金宝apprtwmakecfg功能。

在构建过程的TLC阶段之后,当从TMF生成makefile时,构建过程将搜索rtwmakecfg.m包含s函数组件的文件夹中的文件。如果找到该文件,构建过程将调用rtwmakecfg函数。有关更多信息,请参见使用rtwmakecfg。m API自定义生成的Makefiles

金宝app支持自定义目标中的连续时间

如果希望自定义的基于ert的目标支持连续时间,则必须更新模板makefile (TMF)金宝app和静态主程序模块(例如,mytarget_main.c)作为你的目标。

模板制作文件修改。添加NCSTATES之后的令牌扩展NUMST令牌扩展,具体如下:

Numst = |> Numst <| ncstates = |> ncstates <|

另外,添加NCSTATESCPP_REQ_DEFINES宏,如下例所示:

cpp_req_定义= -dmodel =$(model) -dnumst =$(numst) -dncstates =$(ncstates) \ -dmat_file =$(mat_file) -dinteger_code =$(integer_code) \ -donestepfcn =$(onestepfcn) -dtermfcn =$(termfcn) \ -dhavestdio -dmulti_instance_code =$(multi_instance_code) \

主程序模块的修改。主程序模块定义了一个静态main函数,用于管理单速率和多速率模型所支持的任务模式的任务调度。金宝appNUMST(模型中的采样次数)决定了主函数是调用多速率代码还是单速率代码。但是,当一个模型使用连续时间时,不要依赖NUMST直接。

当模型有连续时间和标志时TID01EQ在生成的代码中,连续时间和最快的离散时间都被视为一个速率。与最快的离散速率相关的代码由主要时间步检查保护。当模型只有两个速率时,和TID01EQ为true,则生成的代码具有单速率调用接口。

要支持金宝app具有连续时间的模型,请更新静态主模块TID01EQ考虑到,如下:

  1. 之前NUMST在文件中引用时,添加以下代码:

    #如果已定义(TID01EQ) && TID01EQ == 1 && NCSTATES == 0 #定义DISC_NUMST (NUMST - 1) #否则#定义DISC_NUMST NUMST #endif
  2. 替换实例NUMST在文件中DISC_NUMST

模型参考注意事项

看到金宝app支持模型引用有关支持代码生成器模型引用特性所需的TMF修改的重要信息。金宝app

请注意

如果您正在使用不带变量的TMFMODELREFS,该文件可能与以前版本的Simulink软件一起使用。金宝app如果您希望TMF支持模型引用,请添加金宝appMODELREFS到make文件。

使用自定义模板Makefile构建共享实用程序代码时超时错误

如果构建过程使用自定义模板makefile为共享实用程序代码创建makefile,那么当所有这些条件都适用时,构建过程将产生一个超时错误:

  • 配置参数GenCodeOnly“关闭”

  • BUILD_SUCCESS的过程中输出使调用rtwshared.mk

  • 使调用rtwshared.mk不更新最终产品(通常rtwshared.lib).

要避免此错误,请更新自定义模板makefile,以便使调用生成BUILD_SUCCESS消息时才生成最终产品(由使变量产品).或者,如果构建过程不使用生成的makefile,可以通过设置配置参数禁用生成makefileGenerateMakefile“关闭”

相关的话题


1UNIX是The Open Group在美国和其他国家的注册商标。

2UNIX是The Open Group在美国和其他国家的注册商标。

3.GNU是自由软件基金会的注册商标。