通过将子系统配置为作为参数传递数据的可重用函数,您可以减少代码生成器为相同原子子系统生成的代码量(例如,rtB_ *
对于块输入和输出,rtDW_ *
对于连续态,和rtP_ *
参数)。默认情况下,代码生成器生成子系统代码,通过共享驻留在共享内存中的全局数据结构的访问权,与其他代码进行通信。通过将数据作为参数传递,代码可以重入。代码的每个实例维护自己的唯一数据。
要配置子系统的可重用性和可重入性,请以相同的方式配置相同子系统的掩码和块参数。代码生成器执行校验和,以确定子系统是否相同,以及代码是否可重用。如果代码是可重用的,代码生成器将生成可重用、可重入的函数代码的单个实例。
配置子系统块参数。
当子系统为虚拟时,选择“块参数”作为原子单位对待(金宝appSimulink)启用函数封装参数。
设置块参数函数包装(金宝app模型)可重用的功能
.代码生成器为每个子系统生成一个带有参数的独立函数。选择可重用的功能
还启用可用于控制代码生成器为子系统代码生成的函数和文件的名称的附加参数。
块参数选择一个值函数名选项(金宝app模型)。要生成可重用、可重入的代码,请为相同的子系统指定相同的设置。
要让代码生成器确定函数名,请选择汽车
.
若要使用子系统名称,或对于库块,使用库块的名称,请选择使用子系统名称
.
显示块参数函数名(金宝appSimulink)并输入一个唯一的、有效的C/ c++函数名,选择用户指定的
.
如果在一个模型引用层次结构中存在一个相同子系统的多个实例,请选择汽车
.
如果你正在使用嵌入式编码器®,您可以使用标识符格式控件。看到标识符格式控制(嵌入式编码)。
集文件名选项(金宝app模型)。要生成可重用、可重入的代码,请为相同的子系统指定相同的设置。
让代码生成器决定文件命名选择汽车
.
若要使用子系统名称,或对于库块,则使用库块选择的名称使用子系统名称
.
使用由块参数指定的函数名函数名选项选择使用函数名
.
显示块参数文件名(无扩展名)(金宝appSimulink),并输入文件名,不包括扩展名(例如,.c
或. cpp
)选择用户指定的
.
其他注意事项:
如果在一个模型引用层次结构中存在一个相同子系统的多个实例,请选择汽车
.
如果代码生成器没有为子系统生成单独的文件,则函数代码将放在从子系统的父系统生成的文件中。如果父模块是模型本身,则代码生成器将函数代码放在其中
或模型
.c
.模型
. cpp
如果生成的代码处于源代码控制之下,请指定除汽车
.该规范防止在修改和重建模型时更改生成的文件名。
如果您选择使用子系统名称
,如果模型包含model块,或者为模型生成模型引用目标,那么代码生成器将破坏子系统文件名。在这些情况下,代码生成器使用文件名模型
子系统
.c
.
如果子系统A有掩码参数b
而且K
子系统B有掩码参数c
而且K
,代码重用是不可能的。代码生成器为子系统A和B生成单独的函数。如果您为子系统A和B设置不同的块参数,代码重用是不可能的。
此示例演示如何配置原子子系统以生成可重用代码。若要指定为子系统生成的代码作为原子单元执行,请在“块参数”对话框上选择作为原子单位对待参数。该参数启用函数包装参数。代码生成选项卡。的函数包装参数有以下四个设置:
内联
:内联子系统代码
那种一次性的功能
:将I/O作为全局数据传递的函数
可重用的功能
:将I/O作为函数参数传递的函数
汽车
:让Simu金宝applink Coder基于上下文进行优化
的可重用的功能
而且汽车
设置允许代码生成器重用子系统代码。的可重用的功能
而且那种一次性的功能
设置启用函数名选项,函数名,文件名称选项参数。
如果您有嵌入式Coder许可证,您可以配置一个不可重用的子系统来接受参数。
示例模型
的rtwdemo_ssreuse
模型包含两个相同的子系统,魔法石,第1章
而且SS2
.对于这些子系统,函数包装参数设置为可重用的
函数
,以及函数名参数是myfun
.这些子系统是参数化的掩模子系统。要查看被屏蔽子系统的内容,右键单击子系统块并选择面具>看下面具.
模型=“rtwdemo_ssreuse”;open_system(模型);
生成和检查代码
为构建和检查过程创建一个临时文件夹。打开金宝app仿真软件编码器或嵌入式编码器然后,生成并检查代码。
currentDir = pwd;[~, cgDir] = rtwdemodir ();rtwbuild(模型)
###成功完成模型的构建过程:rtwdemo_ssreuse
用= fullfile (cgDir,“rtwdemo_ssreuse_grt_rtw”,“rtwdemo_ssreuse.c”);rtwdemodbtype(用'/*模型步长','/*模型初始化', 1, 0);
/*模型步长函数*/ void rtwdemo_ssreuse_step(void){/*为原子子系统输出:'<根>/SS1' */ /* Inport: '<根>/In1'合并:* Inport: '<根>/In2' */ myfun(rtwdemo_ssreuse_U. In2)三机一体,rtwdemo_ssreuse_U。In2 &rtwdemo_ssreuse_B。魔法石,第1章,rtwdemo_ssreuse_P。T1Data,rtwdemo_ssreuse_P.T1Break); /* End of Outputs for SubSystem: '/SS1' */ /* Outport: ' /Out1' */ rtwdemo_ssreuse_Y.Out1 = rtwdemo_ssreuse_B.SS1.LookupTable; /* Outputs for Atomic SubSystem: ' /SS2' */ /* Inport: ' /In1' incorporates: * Inport: ' /In2' */ myfun(rtwdemo_ssreuse_U.In1, rtwdemo_ssreuse_U.In2, &rtwdemo_ssreuse_B.SS2, rtwdemo_ssreuse_P.T2Data, rtwdemo_ssreuse_P.T2Break); /* End of Outputs for SubSystem: ' /SS2' */ /* Outport: ' /Out2' */ rtwdemo_ssreuse_Y.Out2 = rtwdemo_ssreuse_B.SS2.LookupTable; }
在模型步进函数中,有两个对可重用函数的调用,myfun
.掩码参数,T1Break
,T1Data
,T2Break
,T2Data
,是函数参数。
改变函数包装参数内联
.
set_param (“rtwdemo_ssreuse(魔法石,第1章”,“RTWSystemCode”,“内联”) set_param (“SS2 rtwdemo_ssreuse /”,“RTWSystemCode”,“内联”)
生成并检查代码。
rtwbuild(模型)
###成功完成模型的构建过程:rtwdemo_ssreuse
用= fullfile (cgDir,“rtwdemo_ssreuse_grt_rtw”,“rtwdemo_ssreuse.c”);rtwdemodbtype(用'/*模型步长','/*模型初始化', 1, 0);
/*模型步长函数*/ void rtwdemo_ssreuse_step(void) {real_T Out1_tmp;/*原子子系统输出:'<根>/SS2' */ /*原子子系统输出:'<根>/SS1' */ /* Sum: '/Sum'合并:* Inport: '<根>/In1' * Inport: '<根>/In2' * Sum: ' /Sum' */ Out1_tmp = rtwdemo_ssreuse_U。In1 + rtwdemo_ssreuse_U.In2;/*输出子系统的结束:' /SS2' */ /* Outport: ' /Out1'合并:* Lookup_n-D: ' /Lookup Table' * Sum: ' /Sum' */ rtwdemo_ssreuse_Y。Out1 = look1_binlx(Out1_tmp, rtwdemo_ssreuse_P. Out1 = out1_binlx)T1Break rtwdemo_ssreuse_P。T1Data 10 u);/*输出结束为子系统:'<根>/SS1' */ /*输出为原子子系统:'<根>/SS2' */ /*输出端口:'<根>/Out2'合并:* Lookup_n-D: ' /Lookup Table' */ rtwdemo_ssreuse_Y。Out2 = look1_binlx(Out1_tmp, rtwdemo_ssreuse_P. Out2 = out1_binlx)T2Break rtwdemo_ssreuse_P。T2Data 10 u);/*子系统输出结束:' /SS2' */}
在模型步长函数中,子系统代码是内联的。
改变函数包装参数那种一次性的功能
.为SS2
,更改函数名参数myfun2
.
set_param (“rtwdemo_ssreuse(魔法石,第1章”,“RTWSystemCode”,“那种一次性函数”) set_param (“SS2 rtwdemo_ssreuse /”,“RTWSystemCode”,“那种一次性函数”) set_param (“SS2 rtwdemo_ssreuse /”,“RTWFcnName”,“myfun2”)
生成并检查代码。
rtwbuild(模型)
###成功完成模型的构建过程:rtwdemo_ssreuse
用= fullfile (cgDir,“rtwdemo_ssreuse_grt_rtw”,“rtwdemo_ssreuse.c”);rtwdemodbtype(用'/*模型步长','/*模型初始化', 1, 0);
/*模型步长函数*/ void rtwdemo_ssreuse_step(void){/*原子子系统的输出:'<根>/SS1' */ myfun();/* output for SubSystem: '/SS1' */ /* Atomic SubSystem: ' /SS2' */ myfun2();/*子系统输出结束:' /SS2' */}
模型步骤函数包含对函数的调用myfun
而且myfun2
.这些函数有一个void-void接口。
改变函数包装参数汽车
.
set_param (“rtwdemo_ssreuse(魔法石,第1章”,“RTWSystemCode”,“汽车”) set_param (“SS2 rtwdemo_ssreuse /”,“RTWSystemCode”,“汽车”)
为汽车
设置,Simuli金宝appnk Coder选择最佳格式。对于这个模型,最佳格式是可重用函数。
关闭模型并清理。
bdclose rtwdemoclean(模型);cd (currentDir)
代码生成器使用校验和来确定子系统是否相同和可重用。子系统代码在以下情况下不会被重用:
在块和数据对象中,使用符号指定尺寸。
端口在子系统间具有不同的采样时间、数据类型、复杂性、帧状态或维度。
子系统的输出被标记为全局信号。
子系统包含具有不同名称或参数设置的相同块。
子系统的输出连接到合并块,和输出合并块配置了一个自定义存储类,该类在C代码中实现为不可寻址内存(例如,设置
).
子系统的输入是非标量的,并使用一个自定义存储类进行配置,该类在C代码中实现为不可寻址内存。
屏蔽子系统具有一个非标量的参数,并配置了一个自定义存储类,该类在C代码中实现为不可寻址内存。
当您设置模型配置参数时,函数调用子系统使用掩码参数默认参数行为来可调
.要重用掩码函数调用子系统,请将其放在一个新的原子子系统中,而不使用掩码。然后将Trigger块从屏蔽子系统移动到原子子系统。
子系统中的块使用部分可调表达式.一些部分可调表达式禁用代码重用。
部分可调表达式是包含一个或多个可调变量和一个不可调表达式的表达式。例如,假设您创建了可调变量K
与价值15.23
还有可调变量P
与价值(5、7、9)
.表达式K + P '
部分可调表达式是否因为表达式P '
不可调。有关可调表达式限制的更多信息,请参见可调表达式的限制.
对于包含可重用s功能块的子系统,块必须满足支持代码重用的s -函数金宝app(嵌入式编码)。
如果您选择可重用的功能
如果代码生成器确定您不能为子系统重用代码,那么它将生成一个不重用的单独函数。代码生成报告可能显示单独的函数是可重用的,即使只有一个子系统使用它。如果您希望代码生成器在这种情况下内联子系统代码(而不是作为函数部署),请设置函数包装(金宝app模型)汽车
.
如果可重用子系统使用共享的本地数据存储,并且您为模型数据元素配置了默认映射,请为category保留默认存储类映射共享本地数据存储设置为默认的
.
在子系统中使用这些块可以防止子系统代码被重用:
范围块(启用了数据日志记录)
S-Function块不能满足某些标准(参见支持代码重用的s -函数金宝app(嵌入式编码器))
文件块(启用了数据日志记录)
工作区块(启用了数据日志记录)
对于可重用库子系统(跨引用模型共享的子系统),代码生成器使用校验和来确定子系统是否相同。代码生成器将可重用的库子系统代码放在共享工具文件夹中,并且可重用的代码独立于顶级模型或参考模型的生成代码。例如,可重用库子系统代码不包括
或模型
.h
.模型
_types.h
代码生成器放在共享实用程序文件夹中并依赖于模型代码的可重用代码不会编译。如果代码生成器确定可重用库子系统代码依赖于模型代码,则可重用子系统代码不会放在共享实用程序文件夹中。当可重用库子系统时,代码生成器生成依赖于模型代码的代码:
包含使用时间相关功能的块,如Step块、连续时间块或多速率块。
包含一个或多个Model块。
包含未内联的子系统或可重用库子系统。
包含未配置存储类的信号汽车
.代码生成器放置配置为非的变量汽车
中的存储类
.模型
.h
包含没有与存储类一起配置的参数汽车
.
包含用户定义的存储类,如Enumeration, Simulink。金宝app信号,仿真软件。金宝appParameter, and so on where数据范围没有设置为出口
.代码生成器可以将类型定义放在
.模型
_types.h
是一个生成预处理器条件的可变子系统。代码生成器放置定义变量对象的预处理器指令模型
_types.h
上述限制也适用于基于库的代码生成。有关更多信息,请参见基于库的可重用库子系统代码生成(嵌入式编码)。