自定义模板生成文件
要配置或自定义模板生成文件(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扩展
令牌 | 扩张 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
通用 | |||||||||||
|
由块自动添加的链接器标志。 |
||||||||||
|
MATLAB的备用全路径名®可执行;Value不同于Value for |
||||||||||
|
MATLAB安装的备用完整路径名;Value不同于Value for |
||||||||||
|
传递给 |
||||||||||
|
选择型号配置参数时为True (1)单输出/更新功能,否则为False(0)。用于宏定义 |
||||||||||
|
以外的组中的编译器标志
|
||||||||||
|
电脑类型。参见MATLAB |
||||||||||
|
以外的组中的预处理器宏定义 中的预处理器宏定义 例如,一些模板生成文件包含这些语句: ...Numst = |> Numst <|…Cpp_req_defines1 =…-DNUMST = $ (NUMST)… Numst = |> Numst <| 而且NUMST 预处理器宏定义在吗buildInfo ,则构建过程不会在其中展开它DEFINES_OTHER .构建过程生成一个警告,如果
|
||||||||||
|
预编译库文件的位置。的 |
||||||||||
|
库名称。有关示例,请参见在构建期间控制库的位置和命名而且修改rtwmakecfg的模板制作文件. |
||||||||||
|
图书馆后缀。的 |
||||||||||
|
True(1)启用生成外部模式支持代码,否则为False(0)。金宝app |
||||||||||
|
传输机制的索引(例如, |
||||||||||
|
如果外部模式选择静态内存分配,则为True(1)。如果选择动态内存分配,则为False(0)。 |
||||||||||
|
外部模式的静态内存分配缓冲区的大小。 |
||||||||||
|
(1)当模型配置参数为真创建块设置为银 ,否则为False(0)。用于控制构建的makefile目标。 |
||||||||||
|
(1)当模型配置参数为真需要终止函数选择,否则为False(0)。用于宏定义 |
||||||||||
|
(1)当模型配置参数为真金宝app支持浮点数否则为False(0)。 |
||||||||||
|
|
||||||||||
|
(1)当模型配置参数为真MAT-file日志否则为False(0)。MAT_FILE 是编译源代码时必需的宏定义,也用于在构建过程中包含日志记录代码。 |
||||||||||
|
定位的MATLAB可执行程序。 |
||||||||||
|
安装MATLAB的路径。 |
||||||||||
|
|
||||||||||
|
MEX-file扩展。参见MATLAB |
||||||||||
|
额外生成的源模块。例如,你可以把一个大的模型分成两个文件, |
||||||||||
|
对象文件名( |
||||||||||
|
Simulink的名称金宝app®目前正在构建框图。 |
||||||||||
|
如果解算器模式是多任务处理,则为True(1),否则为False(0)。 |
||||||||||
|
连续状态数。 |
||||||||||
|
模型中的采样次数。 |
||||||||||
|
MATLAB发布版。 |
||||||||||
|
可供链接的s函数库列表。 |
||||||||||
|
解算器源文件名,例如, |
||||||||||
|
求解器对象( |
||||||||||
|
|
||||||||||
|
指定编译器命令行选项。makefile中的行是
|
||||||||||
|
如果连续任务和第一个离散任务的采样率相等,则为True(1),否则为False(0)。 |
||||||||||
s函数和构建信息支持金宝app 请注意 有关本节中令牌的示例,请参见修改rtwmakecfg的模板制作文件. |
|||||||||||
|
要添加到包含路径的文件夹名称列表。此外,ADD_INCLUDES 宏必须添加到包括 线。 |
||||||||||
|
库名称列表。 | ||||||||||
|
库模块名称| > START_EXPAND_LIBRARIES < | 而且| > START_PRECOMP_LIBRARIES < | 库列表。 |
||||||||||
|
Makefile规则。 | ||||||||||
|
预编译库名称的列表。 | ||||||||||
模型引用支持金宝app 请注意 有关本节中令牌的示例,请参见在TMF中提供模型引用支持金宝app. |
|||||||||||
|
对于并行构建,当前工作文件夹(松材线虫病 )在构建开始的时候。 |
||||||||||
|
为当前模型生成的库文件的名称。 | ||||||||||
|
顶级模型引用的模型列表。 | ||||||||||
|
顶层模型链接到的引用模型库的列表。 | ||||||||||
|
顶层模型链接的响应文件的名称。此令牌仅对支持链接器响应文件的构建环境有效。金宝app有关它的使用示例,请参见 . |
||||||||||
|
正在构建的目标类型。可能的值为
|
||||||||||
|
相对路径,从生成的makefile位置到MATLAB工作文件夹。 | ||||||||||
|
在构建开始时的代码生成文件夹。并行构建需要此令牌。 |
通过替换构建过程已知的参数值来扩展这些标记。例如,如果源模型包含具有两个不同采样时间的块,则TMF语句
Numst = |> Numst <|
扩展:
Numst = 2
除了以上,make_rtw
展开来自其他来源的令牌:
在“配置参数”对话框的目标选项中定义的目标特定令牌
的结构
rtwoptions
部分的系统目标文件。的结构rtwoptions
构造包含字段的数组makevariable
是扩大。
下面的例子是从
.这部分以matlabroot
grt / rtw / c / /grt.tlcBEGIN_RTW_OPTIONS
包含MATLAB代码设置rtwoptions
.下面的指令导致| > EXT_MODE < |
要扩展到的令牌1
(对)或0
(off),这取决于你如何设置外部模式选项。
rtwoptions(2)。makevariable='EXT_MODE'
调用make实用程序
使命令
在创建
从TMF中调用model_or_sharedutils
楼上使
命令。调用使
,构建过程发出此命令。
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实用程序的命令。例如,如果MAKECMD
=mymake
,则使
调用的命令为mymake - f
model_or_sharedutils
楼上宿主
-指定这个TMF的目标平台。这可以是个人电脑
,UNIX
,
(参见MATLABcomputer_name
电脑
命令),或任何
.构建
——指示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
在本例中,是UNIX[2]假设环境。在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)
.
您可以使用模式匹配表达式使依赖规则更通用。例如,使用GNU[3.]你可以把这两个替换掉file1.o:file1.c
"和"file2.o:file2.c
的规则
%。O: %.c cc -c $<
请注意,$ <
在前面的例子中,有一个特殊的宏,它等同于依赖文件(即file1.c
或file2.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函数的信息,请执行以下操作:
创建函数
rtwmakecfg
在文件rtwmakecfg.m
.代码生成器将此文件与基于其文件夹位置的s函数相关联。修改目标的TMF,使其支持返回信息的宏展开金宝app
rtwmakecfg
功能。
在构建过程的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 <|
另外,添加NCSTATES
到CPP_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
考虑到,如下:
之前
NUMST
在文件中引用时,添加以下代码:#如果已定义(TID01EQ) && TID01EQ == 1 && NCSTATES == 0 #定义DISC_NUMST (NUMST - 1) #否则#定义DISC_NUMST NUMST #endif
替换实例
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
来“关闭”
.
相关的话题
[1]UNIX是The Open Group在美国和其他国家的注册商标。
[2]UNIX是The Open Group在美国和其他国家的注册商标。
[3.]GNU是自由软件基金会的注册商标。