如何生成的代码存储内部信号,状态和参数数据

一些从输入计算输出,生成的代码存储内部数据在全局内存。不连接到根级别的输入或输出的信号(运行轨迹要么外港块)为内部数据。

内部数据还可以包括:

  • 一种块状态,如A的状态单位延迟块。算法必须在执行周期之间保留状态值,因此生成的代码通常将状态存储在全局内存中(例如,作为全局变量或全局结构变量的字段)。

  • A嵌段参数,如获得一个参数获得块,代码生成器无法将其值内联到代码中。例如,代码生成器不能内联非标量参数的值。

  • 一个有条件地执行的子系统的状态指示器,例如启用子系统。

为了更有效的代码,你可以配置的优化,如配置参数>默认参数行为配置参数>信号存储重用试图消除内部数据存储。然而,该优化不能消除对某些数据,消耗在生成的代码存储器存储。

当你理解了默认格式,其中生成的代码存储内部数据,您可以:

  • 使信号访问和参数默认可调。然后,您可以用互动和执行过程中监控的代码。

  • 通过消除内部数据存储生成高效的生产代码,并根据您的硬件和构建工具链,控制数据的优化不能消除记忆的位置。

  • 促进内部数据块到模型接口,使得其它组件和系统可以访问该数据。

有关生成的代码如何通过接口与调用环境交换数据的信息,请参见如何生成的代码交换数据用环境

在生成的代码内部数据

此示例示出了所生成的代码是如何存储诸如块的状态的内部数据。

探索范例模型

打开示例模型rtwdemo_roll

open_system('rtwdemo_roll')

该模型包含不连接到根级别INPORT或出口框的内部信号。一些信号有一个名称,如phiCmd信号。

该模型还包含了一些块维持状态数据。例如,在BasicRollMode子系统,离散时间积分器块标记积分保持状态。

该模型集配置参数>代码生成>系统目标文件grt.tlc

set_param('rtwdemo_roll','SystemTargetFile','grt.tlc')

检查设置为配置参数>代码生成>接口>代码接口封装。设置不可再利用的功能装置所生成的代码是不可重用(折返)。

在这个例子中,产生由清算简单的代码配置参数>代码生成>接口>高级参数> MAT文件记录

set_param('rtwdemo_roll','MatFileLogging',“关”)

不能重复使用生成的代码

设置这些配置参数:

  • 默认参数行为可调

  • 明确信号存储重用

set_param('rtwdemo_roll','DefaultParameterBehavior',“可调”,...'OptimizeBlockIOStorage',“关”)

从模型中生成代码。

rtwbuild('rtwdemo_roll')
###启动构建过程:rtwdemo_roll ###的构建过程的顺利完成:rtwdemo_roll

该文件rtwdemo_roll.h定义了表示内部数据几种结构类型。例如,该块的输入和输出结构限定为模型中的每个内部信号的一个场。每个字段名称从产生的信号,或者,如果你的信号指定一个名称,从信号的名称块的名称派生的。

文件= fullfile (“rtwdemo_roll_grt_rtw”,'rtwdemo_roll.h');rtwdemodbtype(文件,...'/ *块信号(默认存储)* /',“}B_rtwdemo_roll_T;”,1,1)
/ *块信号(默认存储)* / typedef结构{real32_T phiCmd;/ * '<根> / ModeSwitch' * / real32_T阿布斯;/ * ' / ABS' * / real32_T FixPtUnitDelay1;/ * ' / FixPt单位延迟1' * / real32_T Xnew;/ * ' /启用' * / real32_T TKSwitch;/ * ' / TKSwitch' * / real32_T RefSwitch;/ * ' / RefSwitch' * / real32_T积分;/ * ' /集成' * / real32_T DispLimit;/ * ' / DispLimit' * / real32_T萨姆;/ * ' /萨姆' * / real32_T DispGain; /* '/DispGain' */ real32_T RateLimit; /* '/RateLimit' */ real32_T Sum1; /* '/Sum1' */ real32_T RateGain; /* '/RateGain' */ real32_T Sum2; /* '/Sum2' */ real32_T CmdLimit; /* '/CmdLimit' */ real32_T IntGain; /* '/IntGain' */ real32_T hdgError; /* '/Sum' */ real32_T DispGain_a; /* '/DispGain' */ real32_T Product; /* '/Product' */ boolean_T NotEngaged; /* '/NotEngaged' */ boolean_T TKThreshold; /* '/TKThreshold' */ boolean_T RefThreshold2; /* '/RefThreshold2' */ boolean_T RefThreshold1; /* '/RefThreshold1' */ boolean_T Or; /* '/Or' */ boolean_T NotEngaged_e; /* '/NotEngaged' */ } B_rtwdemo_roll_T;

该文件定义的结构类型,结构DWork,以表示块状态,例如离散时间积分器块的状态。

rtwdemodbtype(文件,...'/ *模块状态(默认存储),用于系统的,'} DW_rtwdemo_roll_T;',1,1)
/*系统'' */ typedef struct {real32_T FixPtUnitDelay1_DSTATE的块状态(默认存储);/* '/FixPt Unit Delay1' */ real32_T Integrator_DSTATE;/* '/Integrator' */ int8_T Integrator_PrevResetState;/* '/Integrator' */} DW_rtwdemo_roll_T;

该文件定义了表示参数数据的结构类型。模型中的每个可调块参数,例如获得增益块的参数,显示为这种结构的一个字段。如果一个块参数从一个MATLAB变量或获得其值万博1manbetxSimulink.Parameter对象,变量或对象显示为一个字段,不是块参数。

该文件还定义了结构类型实时模型数据结构,其单个字段表示的生成的代码是否已经执行过程中遇到的错误的运行时间的指示。

rtwdemodbtype(文件,“/ *实时模型数据结构* /”,...'/ *块参数(缺省存储)* /',1,0)
/ *实时模型数据结构* /结构tag_RTM_rtwdemo_roll_T {常量char_T * ErrorStatus中;};

对于代表的实时模型数据结构中的结构类型,文件rtwdemo_roll_types.h创建所生成的代码后使用为结构分配存储器的别名。

文件= fullfile (“rtwdemo_roll_grt_rtw”,'rtwdemo_roll_types.h');rtwdemodbtype(文件,'/ *转发声明rtModel * /',...'RT_MODEL_rtwdemo_roll_T;',1,1)
/ *转发声明rtModel * / typedef结构tag_RTM_rtwdemo_roll_T RT_MODEL_rtwdemo_roll_T;

使用这些结构类型,文件rtwdemo_roll.c定义(分配存储器),其存储用于将所生成的算法内部数据全局结构变量。该文件还定义了表示实时模型数据结构和一个指向结构变量。

文件= fullfile (“rtwdemo_roll_grt_rtw”,'rtwdemo_roll.c');rtwdemodbtype(文件,'/ *块信号(默认存储)* /',...'=&rtwdemo_roll_M_;',1,1)
/ *块信号(默认存储)* / B_rtwdemo_roll_T rtwdemo_roll_B;/ *块状态(默认存储)* / DW_rtwdemo_roll_T rtwdemo_roll_DW;/ *外部输入(根运行轨迹与默认存储信号)* / ExtU_rtwdemo_roll_T rtwdemo_roll_U;/ *外部输出* / ExtY_rtwdemo_roll_T rtwdemo_roll_Y(通过具有默认存储信号馈送根outports);/ *实时模型* / RT_MODEL_rtwdemo_roll_T rtwdemo_roll_M_;RT_MODEL_rtwdemo_roll_T * const的rtwdemo_roll_M =&rtwdemo_roll_M_;

该模型功能,这表示主模型算法,采用的是无效无效接口(不带参数)。

rtwdemodbtype(文件,...'/ *型号阶跃函数* /',“空白rtwdemo_roll_step(空白),1,1)
/ *型号阶跃函数* /空rtwdemo_roll_step(无效)

在函数定义,该算法通过直接访问全局变量进行计算,并存储在信号和状态的结构的中间结果。该算法还从相应的全局变量读取参数数据。例如,在BasicRollMode子系统,用于生成的代码积分块读取并从结构写入信号,状态,和参数数据。

rtwdemodbtype(文件,'/* DiscreteIntegrator: " /Integrator " *',...'DiscreteIntegrator的/ *结束: '' /集成' '* /',1,1)
/ * DiscreteIntegrator: ' /集成' * /如果(!rtwdemo_roll_B.NotEngaged_e ||(rtwdemo_roll_DW.Integrator_PrevResetState = 0)){rtwdemo_roll_DW.Integrator_DSTATE = rtwdemo_roll_P.Integrator_IC;}如果(rtwdemo_roll_DW.Integrator_DSTATE> = rtwdemo_roll_P.intLim){rtwdemo_roll_DW.Integrator_DSTATE = rtwdemo_roll_P.intLim;}否则{如果(rtwdemo_roll_DW.Integrator_DSTATE <= rtwdemo_roll_P.Integrator_LowerSat){rtwdemo_roll_DW.Integrator_DSTATE = rtwdemo_roll_P.Integrator_LowerSat;}} rtwdemo_roll_B.Integrator = rtwdemo_roll_DW.Integrator_DSTATE;

因为无效无效接口和直接访问数据,该功能是不可重入。如果多次调用该函数在应用程序中,每个调用将数据写入到全局结构变量和后续调用可以读取数据,从而在电话之间无意的干扰。

模型初始化函数rtwdemo_roll_initialize初始化所有内部数据的零。该功能还通过调用一个专门的微距功能初始化错误状态。初始化函数直接访问全局变量,这意味着该函数是不可重入。

rtwdemodbtype(文件,'/ *型号初始化函数* /',...'的sizeof(DW_rtwdemo_roll_T));',1,1)
/ *初始化模型函数* /空隙rtwdemo_roll_initialize(无效){/ *注册代码* / / *初始化错误状态* / rtmSetErrorStatus(rtwdemo_roll_M,(NULL));/ *块I / O * /(无效)的memset(((无效*)&rtwdemo_roll_B),0,的sizeof(B_rtwdemo_roll_T));/ *状态(dwork)* /(无效)的memset((无效*)&rtwdemo_roll_DW,0,的sizeof(DW_rtwdemo_roll_T));

然后,该函数将DWork结构中的块状态初始化为模型中块参数指定的初始值。模型中的三种状态中有两种具有可调的初始值,因此代码通过从参数结构读取数据来初始化它们。

rtwdemodbtype(文件,...'为原子子系统/ * SystemInitialize: ''<根> / RollAngleReference' '* /',...'/ *型号终止功能* /',1,0)
/ *用于原子子系统SystemInitialize: '<根> / RollAngleReference' * / / * InitializeConditions为UnitDelay: ' / FixPt单位延迟1' * / rtwdemo_roll_DW.FixPtUnitDelay1_DSTATE = rtwdemo_roll_P.LatchPhi_vinit;/ * SystemInitialize对于子系统的结束: '<根> / RollAngleReference' * / / *为原子子系统SystemInitialize: '<根> / BasicRollMode' * / / *对于DiscreteIntegrator InitializeConditions: ' /集成' * / rtwdemo_roll_DW。Integrator_DSTATE = rtwdemo_roll_P.Integrator_IC;rtwdemo_roll_DW.Integrator_PrevResetState = 0;/ *用于SystemInitialize子系统的结束: '<根> / BasicRollMode' * /}

生成可重用的代码

您可以配置生成代码为折返,这意味着你可以多次调用的入口点函数中的应用程序。根据该结构,而不是直接访问全局变量,入口点函数接受通过正式的参数(指针参数)的内部数据。有了这些指针参数,每个呼叫可以在一个单独设置的全局变量保持内部数据,防止呼叫之间无意的相互作用。

该模型集配置参数>代码生成>接口>代码接口封装可重复使用的功能

set_param('rtwdemo_roll',“CodeInterfacePackaging”,“可重复使用的功能”)

从模型中生成代码。

rtwbuild('rtwdemo_roll')
###启动构建过程:rtwdemo_roll ###的构建过程的顺利完成:rtwdemo_roll

现在,rtwdemo_roll.h中,实时模型数据结构包含指向误差指示,内部数据,以及在形式主要输入和输出数据EXTUExtY子结构(其中代表INPORT和出口框在模型的根级别的域)。

文件= fullfile (“rtwdemo_roll_grt_rtw”,'rtwdemo_roll.h');rtwdemodbtype(文件,“/ *实时模型数据结构* /”,...'/*从属源文件的外部数据声明*/',1,0)
/ *实时模型数据结构* /结构tag_RTM_rtwdemo_roll_T {常量char_T * ErrorStatus中;B_rtwdemo_roll_T * blockIO;ExtU_rtwdemo_roll_T *输入;ExtY_rtwdemo_roll_T *输出;DW_rtwdemo_roll_T * dwork;};/ *块参数(缺省存储)* /的extern P_rtwdemo_roll_T rtwdemo_roll_P;

要在应用程序中多次调用生成的代码,您的代码必须为每次调用分配实时模型数据结构内存。该文件rtwdemo_roll.c定义一个专门的函数,为新的实时模型数据结构分配内存,并返回一个指向该结构的指针。该函数还为模型数据结构中的字段所指向的子结构分配内存,例如DWork结构。

文件= fullfile (“rtwdemo_roll_grt_rtw”,'rtwdemo_roll.c');rtwdemodbtype(文件,“/ *模型数据分配的函数* /”,...'RT_MODEL_rtwdemo_roll_T * rtwdemo_roll(无效)',1,1)
/ *模型数据分配函数* / RT_MODEL_rtwdemo_roll_T * rtwdemo_roll(无效)

该模型函数接受表示实时模型数据结构的参数。

rtwdemodbtype(文件,'/ *型号阶跃函数* /',“无效rtwdemo_roll_step”,1,1)
/* Model step函数*/ void rtwdemo_roll_step(RT_MODEL_rtwdemo_roll_T *const rtwdemo_roll_M)

在函数定义,该算法首先提取从实时模型数据结构中的每个指针到一个局部变量。

rtwdemodbtype(文件,'* rtwdemo_roll_B =','rtwdemo_roll_M->输出;',1,1)
B_rtwdemo_roll_T *rtwdemo_roll_B = ((B_rtwdemo_roll_T *) rtwdemo_roll_M->blockIO);DW_rtwdemo_roll_T *rtwdemo_roll_DW = (DW_rtwdemo_roll_T *) rtwdemo_roll_M->dwork);ExtU_rtwdemo_roll_T *rtwdemo_roll_U = (ExtU_rtwdemo_roll_T *) rtwdemo_roll_M->输入;ExtY_rtwdemo_roll_T *rtwdemo_roll_Y = (ExtY_rtwdemo_roll_T *) rtwdemo_roll_M->输出;

然后,访问存储在全局存储器内的数据,这些局部变量的相互作用算法。

rtwdemodbtype(文件,'/ * DiscreteIntegrator: '' /集成' '* /',...'DiscreteIntegrator的/ *结束: '' /集成' '* /',1,1)
/ * DiscreteIntegrator: ' /集成' * /如果(!rtwdemo_roll_B-> NotEngaged_e ||(rtwdemo_roll_DW-> Integrator_PrevResetState = 0)){rtwdemo_roll_DW-> Integrator_DSTATE = rtwdemo_roll_P.Integrator_IC;}如果(rtwdemo_roll_DW-> Integrator_DSTATE> = rtwdemo_roll_P.intLim){rtwdemo_roll_DW-> Integrator_DSTATE = rtwdemo_roll_P.intLim;}否则{如果(rtwdemo_roll_DW-> Integrator_DSTATE <= rtwdemo_roll_P.Integrator_LowerSat){rtwdemo_roll_DW-> Integrator_DSTATE = rtwdemo_roll_P.Integrator_LowerSat;}} rtwdemo_roll_B->集成= rtwdemo_roll_DW-> Integrator_DSTATE;

类似地,模型初始化函数接受实时模型数据结构作为参数。

rtwdemodbtype(文件,...'/ *型号初始化函数* /',“无效rtwdemo_roll_initialize”,1,1)
/ *初始化模型函数* /空隙rtwdemo_roll_initialize(RT_MODEL_rtwdemo_roll_T * const的rtwdemo_roll_M)

因为每次调用您对一个单独的实时模型数据结构的入口点函数相互作用,您避免调用之间无意的相互作用。

使用代码生成优化消除内部数据

为了更有效的代码,消耗更少的内存中,选择优化,如默认参数行为,已清除较早。

set_param('rtwdemo_roll','DefaultParameterBehavior',“内联”,...'OptimizeBlockIOStorage',“上”,...'LocalBlockOutputs',“上”)

在这个例子中,对于简单的代码,集代码接口封装不可再利用的功能

set_param('rtwdemo_roll',“CodeInterfacePackaging”,“不能重复使用的功能”)

从模型中生成代码。

rtwbuild('rtwdemo_roll')
###启动构建过程:rtwdemo_roll ###的构建过程的顺利完成:rtwdemo_roll

现在,rtwdemo_roll.h没有定义块的输入和输出的结构。对于所有在模型内部信号的优化或者消除存储或创建的本地函数变量而不是全局结构域。

该优化未能消除对三块状态储存,因此该文件继续定义DWork结构类型。

文件= fullfile (“rtwdemo_roll_grt_rtw”,'rtwdemo_roll.h');rtwdemodbtype(文件,...'/ *模块状态(默认存储),用于系统的,'} DW_rtwdemo_roll_T;',1,1)
/*系统'' */ typedef struct {real32_T FixPtUnitDelay1_DSTATE的块状态(默认存储);/* '/FixPt Unit Delay1' */ real32_T Integrator_DSTATE;/* '/Integrator' */ int8_T Integrator_PrevResetState;/* '/Integrator' */} DW_rtwdemo_roll_T;

对于离散时间积分器块生成的代码现在只在DWork结构存储状态和输出数据。

文件= fullfile (“rtwdemo_roll_grt_rtw”,'rtwdemo_roll.c');rtwdemodbtype(文件,'的DiscreteIntegrator / *更新: '' /集成' '',...'更新的/ * END FOR DiscreteIntegrator: '' /集成' '* /',1,1)
/ *更新DiscreteIntegrator: ' /集成' 包含:*增益: ' / IntGain' * / rtwdemo_roll_DW.Integrator_DSTATE + = 0.5F * rtb_TKSwitch * 0.025F;如果(rtwdemo_roll_DW.Integrator_DSTATE> = 5.0F){rtwdemo_roll_DW.Integrator_DSTATE = 5.0F;}否则{如果(rtwdemo_roll_DW.Integrator_DSTATE <= -5.0F){rtwdemo_roll_DW.Integrator_DSTATE = -5.0F;}} rtwdemo_roll_DW.Integrator_PrevResetState =(中int8_t)rtb_NotEngaged_f;

的优化也消除存储在模型中的块参数。举例来说,在离散时间积分器块,所述饱和上限饱和下限参数设置为intLim-intLimintLim万博1manbetxSimulink.Parameter对象,其存储的值5。在用于离散时间积分器,这些块参数和生成的代码intLim显示为内联面值数字5.0F-5.0F

如果模型包含一个参数,该码发生器不能直接内联(例如,阵列参数)时,代码定义表示数据的结构类型。这个常量参数结构使用常量存储类型限定符,所以一些构建工具链可以进一步优化汇编代码。

在生成的代码局部变量

当您选择优化配置参数>启用本地块输出中,代码生成试图由代表内部信号作为局部变量而不是全局结构的字段中产生更有效的代码。如果局部变量占用的内存超过风险的堆栈空间可用在目标硬件上,可以考虑指示设置的最大堆栈大小配置参数>最大堆栈大小(字节)。欲了解更多信息,请参阅最大堆栈大小(字节)

在生成的代码测试点的外观

一个测试点是一种存储在一个唯一内存位置的信号。有关在模型中包含测试点的信息,请参见配置信号作为测试点

当您生成模型,包括测试点代码,生成过程中分配每个测试点的独立内存缓冲区。默认情况下,测试点存储为一个标准的数据结构的成员,诸如模型_B

如果你有嵌入式编码器®:

  • 您可以通过在指定的代码生成设置控制的测试点的默认表示内部数据在代码映射编辑数据的类别(见配置默认代码生成数据(嵌入式编码))。

  • 您可以指定构建过程模型忽略了测试点,从而优化缓冲区分配,通过使用忽略测试点的信号(嵌入式编码)参数。忽略测试点有利于从原型到部署转变,并避免产生码偶然降解由于工作流的伪像。看到忽略测试点的信号(嵌入式编码)

虚拟总线不会出现在生成的代码,即使与测试点相关联。在生成的代码显示总线,使用非虚拟总线或虚拟总线通过一个转换成非虚拟总线信号转换块。

在生成的代码工作区变量的外观

工作区变量是您使用的模型,以指定块的参数值的变量。工作区变量包括数字MATLAB®变量和万博1manbetxSimulink.Parameter对象您在工作空间存储,例如基本的工作区,或在数据字典。

当您设置默认参数行为可调默认情况下,工作空间变量出现在生成的代码作为全局参数结构的可调谐的字段。如果使用这样的变量来指定多个块的参数值,该变量显示为全局参数结构的单个字段。代码不创建多个域来表示块参数。因此,在代码执行期间调整字段值改变模型中的相同的方式,在模拟过程中调整MATLAB变量或参数对象的值的数学行为。

如果您有嵌入式编码,您可以通过在代码映射编辑器参数数据的类别指定代码生成设置控制工作空间变量的默认表示(见配置默认代码生成数据(嵌入式编码))。

  • 型号参数类别适用于您在模型工作区,存储变量。

  • 外部参数类适用于变量,你在基地工作区或一个数据字典存储。

将内部数据提升到接口

默认情况下,代码生成器假定其他系统和组件在您的应用程序并不需要访问内部数据。例如,内部数据受到能够从所生成的代码消除它们的优化。对于原型和测试目的,您可以通过清除优化或通过配置测试点和应用存储类(见访问内部数据保留的变量在生成的代码)。优化生产代码,配置各个数据项以在生成的代码显示为模型接口的一部分。

数据可以促进

根据生成的代码的重入,也就是设置你选择代码接口封装,您可以配置模型中的每个数据项,通过在代码中显示为以下实体之一来参与接口:

  • 一个全球性的符号,比如一个全局变量或调用一个专门的功能

  • 生成的入口点函数的形式参数(实参)

该表显示了机制,数据的每个类别可以使用参与的接口。

数据的类别 显示为全局符号 表现为入口点函数的参数
根级别运行轨迹要么外港 只适用于不可重入的模型。 是。
连接两组信号 只适用于不可重入的模型。

只有一个折返模式,只能作为一个结构的领域。

可替换地,信号连接到根级外港块。

阻塞状态 只适用于不可重入的模型。 只有一个折返模式,只能作为一个结构的领域。
数据存储诸如数据存储内存 是。 只有一个折返模式,只能作为一个结构的领域。
块参数或参数对象如万博1manbetxSimulink.Parameter 是。 只有作为一个结构的领域。

单实例算法

对于单实例算法(设置代码接口封装不可再利用的功能)中,通过使用模型数据编辑器或属性检查直接应用于存储类的各个数据项。用直接施加存储类中,数据项出现在代码为全局符号如全局变量。存储类还防止从优化消除存储的数据项。

您可以将存储类的信号,块状态和块参数。(对于块参数,在应用存储类间接通过参数对象如万博1manbetxSimulink.Parameter)。然而,对于一个信号,考虑信号连接到外港在模型的根级别阻塞。然后,您可以选择应用的存储类来块。在该框图中,所述外港方框示出了该信号表示一个系统输出。

有关存储类的更多信息,请参阅模型接口元素的C代码生成配置

可重入算法

对于重入算法(设置代码接口封装可重复使用的功能),使用不同的技术来配置数据项出现在代码的产生的入口点函数的形式参数(参数)。

  • 对于内部信号,直接应用存储类默认模式(看到模型接口元素的C代码生成配置)。如果您有嵌入式编码,在代码映射编辑器,为内部数据类别,默认的存储类设置为默认或结构化存储类,你在嵌入式编码字典定义(见在代码映射编辑器使用创建代码定义(嵌入式编码))。可替换地,配置信号作为测试点(见在生成的代码测试点的外观)。默认情况下,信号表现为标准数据结构中的一个(参照的场如何生成的代码存储内部信号,状态和参数数据)。如果您不希望该信号出现在生产代码中,请使用一个测试点,以便稍后可以选择模型配置参数忽略测试点的信号

    或者,将信号连接到外港在模型的根级别阻塞。该信号连接到根级外港块防止优化从消除来自码的信号。与信号路由帮助在较大的模型,使用块。

  • 对于一个块参数,创建一个参数对象如万博1manbetxSimulink.Parameter并直接申请以外的存储类汽车对象。存储类防止优化从内联代码中的参数值。

    与存储类中,该参数的模型的实例,这是入口点的函数的调用之间共享。功能直接访问的参数数据,作为一个全局符号,而不是一个参数。您不能配置出现在代码作为参数一个参数,所以你不能使模型的每个实例使用不同的值作为参数。

    有关应用存储类信息,请参阅模型接口元素的C代码生成配置

内部数据的控制默认表示(嵌入式编码)

默认情况下,代码生成器将优化不能消除的内部数据(比如大多数状态数据)聚合到DWork结构等标准结构中。使用嵌入式编码器,您可以控制生成的代码如何存储这些数据。

数据的控制放置在存储器通过插入编译指示

使用代码映射编辑器,以指定为诸如状态和信号的数据的每个类别一个默认的存储部(内部数据)。在生成的代码,您的自定义编译指示或其他装饰环绕的数据定义和声明。

您也可以根据你的模型原子子系统分区结构,使您可以为子程序和其他算法子的数据指定不同的默认内存部分。

欲了解更多信息,请参阅控制数据和功能放置在存储器通过插入编译指示(嵌入式编码)

全球类型的控制名称,字段和变量的标准数据结构

您可以控制的标准数据结构的一些特点。欲了解更多信息,请参阅数据结构的控制特性(嵌入式编码)

在过去的结构特点,如在生成的代码文件放置额外的控制,通过使用嵌入式编码字典创建自己的结构化存储类。然后,通过使用代码映射编辑应用存储类数据的类别。存储类中删除从标准结构中的数据,创建其他的结构,你可以更好地控制。有关应用默认的存储类数据类别的详细信息,请参阅配置默认代码生成数据(嵌入式编码)。有关创建存储类的更多信息,请参阅定义存储类型,存储器部分,和函数模板的软件体系结构(嵌入式编码)

数据组织成结构根据子组件

  • 在标准数据结构中,要创建包含单实例(不可重入)子例程或子组件数据的子结构,可以使用原子子系统封装相应的块。在子系统中设置参数功能包装可重复使用的功能。欲了解更多信息,请参阅产生非虚子系统模块化功能代码(嵌入式编码)

    或者,将这些块封装在模型中并使用模型块。在参考模型,集配置参数>型号引用>实例总数允许每顶级车型。欲了解更多信息,请参阅生成代码模型参考层次

  • 创建包含用于多实例(折返)子例程或子组件中的数据,在模型中单独的,独立的结构,使用原子子系统封装对应块。在子系统中设置参数功能包装不可再利用的功能并选择与单独的数据功能。欲了解更多信息,请参阅产生非虚子系统模块化功能代码(嵌入式编码)

    或者,将这些块封装在模型中并使用模型块。在参考模型,选择这些技术之一:

组织信号和参数数据转换为有意义的,自定义结构和子

组织的任意信号和参数为自定义结构和子结构,创建非虚拟总线信号和参数的结构。可选地,为了防止从优化从代码消除数据时,存储类的总线信号或参数结构的设置以外的值汽车(默认设置)。

在向模型添加块时,必须显式地将每个新信号和参数放入总线或结构中。

欲了解更多信息,请参阅数据组织成结构生成的代码

创建单独的全局变量不是结构的字段

为了使一个类的内部数据出现在所生成的代码作为单独的,非结构化的全局变量,而不是一个标准的数据结构的字段中,通过使用代码映射编辑应用非结构化存储类的数据类别。例如,应用存储类ExportedGlobal。但是,如果通过设置配置参数生成多实例,重入代码代码接口封装的值不可再利用的功能,您不能对某些类别的数据使用此技术(请参阅存储类和重入,多实例模型和组件)。

要通过使用代码映射编辑器将默认存储类数据的类别,看配置默认代码生成数据(嵌入式编码)。要选择一个存储类,见选择存储类用于控制数据表示在生成的代码

相关话题