生成子系统重入代码

可以减少代码量,代码发生器通过配置子系统作为传递数据作为自变量(例如可重复使用的功能相同的原子子系统产生,rtB_ *为块的输入和输出,rtDW_ *连续状态,且rtP_ *为参数)。默认情况下,代码生成器产生的子系统的代码,与其它代码通过共享到全局数据结构访问连通驻留在共享存储器中。通过将数据作为参数,代码是可重入。代码的每个实例维护其自己独特的数据。

为可重用性和可重入,配置掩模和等同分系统的块参数相同的方式配置的子系统。代码生成器执行一个校验和,以确定子系统是否是相同的,该代码是否是可重复使用的。如果代码是可重复使用,代码发生器产生的可重复使用的,可重入的功能码的单个实例。

要配置子系统块参数:

  1. 如果一个子系统是虚拟的,选择块参数治疗以原子单位(万博1manbetxSimulink中),以使能功能的包装参数。

  2. 集块参数功能包装(万博1manbetxSimulink中),以可重复使用的功能。代码发生器产生与每个子系统的参数的单独的功能。选择可重复使用的功能也使您可以使用控制功能和文件的代码生成器产生的代码子系统的名字附加参数。

  3. 选择块参数的值功能名称选项(万博1manbetxSIMULINK)。为了产生可重复使用的,可重入代码,指定相同的子系统相同的设置。

    • 为了让代码生成器确定的函数名称,选择汽车

    • 要使用子系统名,为图书馆块,库块的名称,选择使用子系统名称

    • 要显示块参数功能名称(万博1manbetxSimulink中),并输入一个唯一的,有效的C / C ++函数名,选择用户指定

    如果模型参考层次结构中存在一个相同的子系统的多个实例中,选择汽车

    如果您使用的是嵌入式编码器®,你可以使用标识格式控制。看到标识格式控制(嵌入式编码)。

  4. 文件名选择(万博1manbetxSIMULINK)。为了产生可重复使用的,可重入代码,指定相同的子系统相同的设置。

    • 为了让代码生成器确定文件命名选择汽车

    • 要使用子系统名,为图书馆块,库块的名称选择使用子系统名称

    • 为了使用功能名,如由块参数指定功能名称选项选择使用功能名称

    • 要显示块参数文件名(没有扩展名)(万博1manbetxSIMULINK)和输入文件名,不包括扩展名(例如,。C要么的.cpp) 选择用户指定

    其他注意事项:

    • 如果模型参考层次结构中存在一个相同的子系统的多个实例中,选择汽车

    • 如果代码发生器不产生用于子系统一个单独的文件中,函数代码放置从子系统的父系统产生的文件中。如果父是模型本身,代码生成器放置在函数代码模型。C要么模型的.cpp

    • 如果您生成的代码是源代码控制之下,指定以外的值汽车。该规范防止生成的文件名从当你修改并重新生成模式转变。

    • 如果您选择使用子系统名称,代码生成轧液机的子系统的文件名,如果该模型包含模型块,或如果正在用于模型生成的模型参考目标。在这些情况下,代码生成器使用的文件名模型子系统。C

如果子系统A具有屏蔽参数bķ和子系统B具有掩模参数Cķ,代码重用是不可能的。该代码产生器,用于子系统A和B生成单独的函数如果分系统A和B设定的块参数不同,代码复用是不可能的。

在生成的代码重用功能

此示例示出了如何配置用于生成可重用代码的原子子系统。要指定为一个子系统生成的代码执行作为一个原子单元,在块参数对话框中,选择所述治疗以原子单位参数。这个参数可以使功能包装在参数代码生成标签。该功能包装参数有以下四种设置:

  • 排队:内联子系统代码

  • 不可再利用的功能:与I / O功能作为全局数据传递

  • 可重复使用的功能:与I / O功能作为函数的参数传递

  • 汽车:让Simu万博1manbetxlink的编码器优化基于上下文

可重复使用的功能汽车设置允许代码生成器重用子系统的代码。该可重复使用的功能不可再利用的功能设置启用功能名称选项功能名称文档名称选项参数。

如果你有一个嵌入式编码许可,您可以配置一不可再利用子系统接受参数。

例如型号

rtwdemo_ssreuse模型包含两个相同的子系统,SS1SS2。对于这些子系统中,功能包装参数设置为可重复使用功能功能名称参数myfun。该子系统参数屏蔽子系统。要查看掩盖子系统的内容,请右键单击该子系统块,并选择面具>下看面具

模型='rtwdemo_ssreuse';open_system(模型);

生成和检查代码

创建用于构建和检查过程中的临时文件夹。打开万博1manbetxSimulink的编码器要么嵌入式编码应用程序。然后,产生和检查的代码。

currentDir = PWD;[〜,cgDir] = rtwdemodir();rtwbuild(模型)
###启动构建过程:rtwdemo_ssreuse ###的构建过程的顺利完成:rtwdemo_ssreuse
的CFile =完整文件(cgDir,'rtwdemo_ssreuse_grt_rtw''rtwdemo_ssreuse.c');rtwdemodbtype(CFile的,“/ *型号步骤”“/ *型号初始化”,1,0);
/ *型号阶跃函数* /空rtwdemo_ssreuse_step(无效){/ *产出原子子系统: '<根> / SS1' * / / * INPORT: '<根> /输入1' 包含:* INPORT:“<根> /IN2' * / myfun(rtwdemo_ssreuse_U.In1,rtwdemo_ssreuse_U.In2,&rtwdemo_ssreuse_B.SS1,rtwdemo_ssreuse_P.T1Data,rtwdemo_ssreuse_P.T1Break);/ *产出子系统的结束: '<根> / SS1' * / / * OUTPORT: '<根> /输出1' * / rtwdemo_ssreuse_Y.Out1 = rtwdemo_ssreuse_B.SS1.LookupTable;/ *产出原子子系统: '<根> / SS2' * / / * INPORT: '<根> /输入1' 包含:* INPORT: '<根> /英寸2' * / myfun(rtwdemo_ssreuse_U.In1,rtwdemo_ssreuse_U.In2,&rtwdemo_ssreuse_B.SS2,rtwdemo_ssreuse_P.T2Data,rtwdemo_ssreuse_P.T2Break);/ *产出子系统的结束: '<根> / SS2' * / / * OUTPORT: '<根> /输出2' * / rtwdemo_ssreuse_Y.Out2 = rtwdemo_ssreuse_B.SS2.LookupTable;}

在模型阶跃函数有两种调用的可重复使用的功能,myfun。面具参数,T1BreakT1DataT2BreakT2Data,是函数参数。

更改功能包装参数排队

set_param('rtwdemo_ssreuse / SS1''RTWSystemCode''排队')set_param('rtwdemo_ssreuse / SS2''RTWSystemCode''排队'

产生和检查的代码。

rtwbuild(模型)
###启动构建过程:rtwdemo_ssreuse ###的构建过程的顺利完成:rtwdemo_ssreuse
的CFile =完整文件(cgDir,'rtwdemo_ssreuse_grt_rtw''rtwdemo_ssreuse.c');rtwdemodbtype(CFile的,“/ *型号步骤”“/ *型号初始化”,1,0);
/ *型号阶跃函数* /空rtwdemo_ssreuse_step(无效){real_T Out1_tmp;/ *产出原子子系统: '<根> / SS2' * / / *产出原子子系统: '<根> / SS1' * / / *总: ' /萨姆' 包含:* INPORT:“<根> /输入1' * INPORT: '<根> /英寸2' *总: ' /萨姆' * / Out1_tmp = rtwdemo_ssreuse_U.In1 + rtwdemo_ssreuse_U.In2;/ *产出子系统的结束: '<根> / SS2' * / / * OUTPORT: '<根> /输出1' 包含:* Lookup_n-d: ' /查寻表' *总:“/萨姆” * / rtwdemo_ssreuse_Y.Out1 = look1_binlx(Out1_tmp,rtwdemo_ssreuse_P.T1Break,rtwdemo_ssreuse_P.T1Data,10U);/ *产出子系统的结束: '<根> / SS1' * / / *产出原子子系统: '<根> / SS2' * / / * OUTPORT: '<根> /输出2' 包含:* Lookup_n-d: /查找表'* / rtwdemo_ssreuse_Y.Out2 = look1_binlx(Out1_tmp,rtwdemo_ssreuse_P.T2Break,rtwdemo_ssreuse_P.T2Data,10U);/ *产出子系统的结束: '<根> / SS2' * /}

在该模型中的阶跃函数,子系统代码被内联。

更改功能包装参数不可再利用的功能。对于SS2,改功能名称参数myfun2

set_param('rtwdemo_ssreuse / SS1''RTWSystemCode'“不能重复使用的功能”)set_param('rtwdemo_ssreuse / SS2''RTWSystemCode'“不能重复使用的功能”)set_param('rtwdemo_ssreuse / SS2''RTWFcnName''myfun2'

产生和检查的代码。

rtwbuild(模型)
###启动构建过程:rtwdemo_ssreuse ###的构建过程的顺利完成:rtwdemo_ssreuse
的CFile =完整文件(cgDir,'rtwdemo_ssreuse_grt_rtw''rtwdemo_ssreuse.c');rtwdemodbtype(CFile的,“/ *型号步骤”“/ *型号初始化”,1,0);
/ *型号阶跃函数* /空rtwdemo_ssreuse_step(无效){/ *产出原子子系统: '<根> / SS1' * / myfun();/ *产出子系统的结束: '<根> / SS1' * / / *产出原子子系统: '<根> / SS2' * / myfun2();/ *产出子系统的结束: '<根> / SS2' * /}

该模型阶跃函数包含对函数的调用myfunmyfun2。这些功能有一个空隙空接口。

更改功能包装参数汽车

set_param('rtwdemo_ssreuse / SS1''RTWSystemCode''汽车')set_param('rtwdemo_ssreuse / SS2''RTWSystemCode''汽车'

为了汽车设置,Simuli万博1manbetxnk的编码器选择最佳格式。对于这个模型,最优格式是可重复使用的功能。

关闭模型和清理。

bdclose(模型)rtwdemoclean;CD(currentDir)

限制

  • 代码生成器使用校验和来确定子系统是否是相同的,可重复使用的。子系统的代码不能重复利用,如果:

    • 在块和数据对象,您可以使用符号指定尺寸。

    • 端口具有不同的采样时间,数据类型,复杂性,帧状态,或尺寸跨越子系统。

    • 一个子系统的输出被标记为一个全局信号。

    • 子系统包含具有不同的名称或参数设定相同的块。

    • 一个子系统的输出被连接到一个合并块,和的输出合并块被配置与在C代码作为不可寻址存储器实现的自定义存储类(例如,位域)。

    • 一个子系统的所述输入是非标量,并且被配置与在C代码作为不可寻址存储器实现的定制的存储类。

    • 掩蔽的子系统具有参数即非标量,并且被配置与在C代码作为不可寻址存储器实现的定制的存储类。

    • 函数调用子系统使用覆盖参数,当你设置模型配置参数默认参数行为可调。为了重复使用屏蔽函数调用子系统,将它放在一个新的原子子系统内不戴面具。然后从掩蔽子系统移动触发块进入原子子系统。

    • 子系统中的一块使用部分可调谐表达。有些部分可调表情禁用代码重用。

      部分可调谐表达式是包含一个或多个可调谐的变量和不可调的表达式的表达式。例如,假设您创建的可调变量ķ与价值15.23和可调变量P与价值[5; 7; 9]。表达方式K + P”是部分可调谐表达,因为表达式P”不可调。有关可调表达限制的详细信息,请参阅可调式限制

  • 对于包含S-功能模块是可重复使用的子系统,该块必须满足上市要求S-功能,支持代码重用万博1manbetx(嵌入式编码)。

  • 如果您选择可重复使用的功能和代码生成器确定,你不能重用的代码的子系统,它产生不重复使用一个单独的函数。代码生成报告可能显示,单独的功能是可重复使用的,即使只有一个子系统使用它。如果你喜欢,在这种情况下,代码生成器内嵌子系统的代码(而不是部署为功能),集功能包装(万博1manbetxSimulink中),以汽车

  • 如果一个可重复使用的子系统使用一个共享的本地数据存储和配置的模型数据元素默认映射,保留类的默认存储类映射共享本地数据存储调成默认

  • 在一个子系统中使用这些模块可以防止子系统代码被重用:

    • 范围块(启用数据记录)

    • 不符合特定条件的S-功能块(参照S-功能,支持代码重用万博1manbetx(嵌入式编码))

    • 到文件块(启用数据记录)

    • 为了工作区块(启用数据记录)

  • 对于可重复使用的库子系统(横跨参考模型共享子系统),代码生成器使用校验和来确定子系统是否相同。代码生成器放置在共享的公用设施可重用库子系统代码文件夹,并且可重复使用的代码是独立于顶部模型或参考模型的生成的代码的。例如,可重复使用的库子系统的代码不包括模型。H要么模型_types.h

    可重用的代码共享公用代码生成位置文件夹是依赖于模型的代码不能编译。如果代码发生器确定所述可重用库子系统代码是依赖于模型的代码,可重复使用的子系统的代码没有被放置在共享文件夹中的实用程序。代码发生器产生的代码是依赖于模型代码时可重复使用的库子系统:

    • 包含使用时间相关的功能,如一个步骤块,或者连续时间或多速率嵌段的嵌段。

    • 包含一个或多个模型块。

    • 包含不内联子系统或可重用库子系统。

    • 包含不与存储类构成的信号汽车。在配置有非代码生成的地方变量汽车在存储类模型。H

    • 包含不与存储类配置参数汽车

    • 包含像枚举,Simulink.Signal,Simulink.Parameter用户定义存储类,等等,其中万博1manbetx数据范围未设置为出口。代码生成器可以放置类型定义模型_types.h

    • 是产生预处理条件变体子系统。代码生成器的地方预处理指令,在定义变异对象模型_types.h

上述限制也适用于基于库的代码生成。欲了解更多信息,请参阅图书馆为基础的代码生成可重复使用的库子系统(嵌入式编码)。

相关话题