一些从输入计算输出,生成的代码存储内部数据在全球记忆中。不连接到根级输入或输出的信号(轮廓尺寸或外港块)是内部数据。
内部数据还可包括:
诸如a的状态的块状态单位延迟堵塞。该算法必须在执行周期之间保留状态值,因此生成的代码通常将状态存储在全局存储器中(例如,作为全局变量或全局结构变量的字段)。
A嵌段参数,如获得A.参数获得块,其值代码生成器不能在代码中内联。例如,代码生成器无法意联内联的值参数。
一个有条件地执行的子系统的状态指示器,例如启用子系统。
对于更高效的代码,您可以配置优化,例如配置参数>默认参数行为和配置参数>信号存储重用试图消除内部数据存储。然而,该优化不能消除对某些数据,消耗在生成的代码存储器存储。
当您理解生成的代码存储内部数据的默认格式时,您可以:
使信号可访问和参数可调谐默认情况下。然后,您可以在执行期间与其交互并监视代码。
通过消除内部数据的存储,并根据硬件和构建工具链,控制优化无法消除的数据在内存中的位置,从而生成高效的生产代码。
促进模型接口的内部数据块,以便其他组件和系统可以访问该数据。
有关生成的代码如何通过接口将数据与调用环境交换的信息,请参阅生成的代码如何与环境交换数据。
此示例显示生成的代码如何存储诸如块状态的内部数据。
探索示例模型
打开示例模型RTWDEMO_ROLL.
。
Open_System(“rtwdemo_roll”)
该模型包含不连接到root级Inport或Outport块的内部信号。一些信号有一个名称,例如phiCmd
信号。
该模型还包含一些维护状态数据的块。例如,在基础罗兰码
分系统,一个离散时间积分器块标记积分商
保持一个状态。
在模型中,设置配置参数>代码生成>系统目标文件到grt.tlc.
。
set_param(“rtwdemo_roll”那'systemtargetfile'那'grt.tlc')
检查设置配置参数>代码生成>接口>代码接口包装。那个设定不可用的功能
意味着生成的代码不可重复使用(重圈)。
对于此示例,通过清除生成更简单的代码>代码生成>接口>高级参数> Mat-file日志。
set_param(“rtwdemo_roll”那'matfilelogging'那'离开')
不能重复使用生成的代码
设置这些配置参数:
放默认参数行为到可调
。
清晰的信号存储重用。
set_param(“rtwdemo_roll”那'defaultparameterbehavior'那'调音'那......'OptimizeBlockiostorage'那'离开')
从模型中生成代码。
RTWBuild(“rtwdemo_roll”)
###成功完成:rtwdemo_roll的构建过程
文件RTWDEMO_ROLL.H.
定义几种表示内部数据的结构类型。例如,块输入和输出结构为模型中的每个内部信号定义一个字段。每个字段名称从生成信号的块的名称中派生,或者如果您从信号的名称指定信号的名称。
file = fullfile('rtwdemo_roll_grt_rtw'那'rtwdemo_roll.h');RTWDEMODBTYPE(文件,......'/ *块信号(默认存储)* /'那'} b_rtwdemo_roll_t;',1,1)
/ *块信号(默认存储)* / typedef struct {real32_t phicmd;/ *'/ modeswitch'* / real32_t abs;/ *' / abs'* / real32_t fixingptunitdelay1;/ *' / fixt单元delay1'* / real32_t xnew;/ *' /启用'* / real32_t tkswitch;/ *' / tkswitch'* / real32_t refswitch;/ *' / refwitch'* / real32_t积分器;/ *' / Integrator'* / Real32_t令人满意;/ *' / sublimit'* / real32_t sum;/ *' / sum'* / real32_t passgain; /* ' /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;/ *' / mixtpt单元delay1'* / real32_t Integrator_dstate;/ *' /积分器'* / int8_t Integrator_prevresettate;/ *' /积分器'* /} dw_rtwdemo_roll_t;
该文件定义了构造类型以表示参数数据。模型中的每个可调谐块参数,例如获得增益块的参数显示为此结构的字段。如果块参数从MATLAB变量或a获取其值金宝appSimulink.Parameter.
对象,变量或对象显示为字段,而不是块参数。
该文件还定义了一个结构类型,实时模型数据结构,其单个字段表示生成代码在执行期间是否遇到错误的运行时指示。
RTWDEMODBTYPE(文件,'/ *实时模型数据结构* /'那......'/ *块参数(默认存储)* /',1,0)
/ *实时模型数据结构* / struct tag_rtm_rtwdemo_roll_t {const char_t * errorstatus;};
对于表示实时模型数据结构的结构类型,该文件RTWDEMO_ROLL_TYPES.H.
创建所生成的代码后使用为结构分配存储器的别名。
file = fullfile('rtwdemo_roll_grt_rtw'那'rtwdemo_roll_types.h');RTWDEMODBTYPE(文件,'/ *转发声明rtModel * /'那......'rt_model_rtwdemo_roll_t;',1,1)
/* rtModel的前向声明*/ typedef struct tag_RTM_rtwdemo_roll_T RT_MODEL_rtwdemo_roll_T;
使用这些结构类型,文件RTWDEMO_ROLL.C.
定义(分配存储器),其存储用于将所生成的算法内部数据全局结构变量。该文件还定义了表示实时模型数据结构和一个指向结构变量。
file = 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;/ *外部输入(具有默认存储的根Inport信号)* / extu_rtwdemo_roll_t rtwdemo_roll_u;/ *外部输出(用默认存储的信号馈送的根出口)* / exty_rtwdemo_roll_t rtwdemo_roll_y;/ *实时模型* / RT_MODEL_RTWDEMO_ROLL_T RTWDEMO_ROLL_M_;RT_MODEL_RTWDEMO_ROLL_T * CONST RTWDEMO_ROLL_M =&RTWDEMO_ROLL_M_;
该模型步
函数表示主要模型算法,使用a空白空白
接口(没有参数)。
RTWDEMODBTYPE(文件,......'/ *模型步骤功能* /'那'void RTWDEMO_ROLL_STEP(void)',1,1)
/*模型step函数*/ void rtwdemo_roll_step(void)
在功能定义中,通过直接访问全局变量,该算法执行计算并存储中间导致信号和状态结构中的中间导致。该算法还从相应的全局变量读取参数数据。例如,在基础罗兰码
子系统,为此生成的代码积分商
块从结构中读取和写入信号,状态和参数数据。
RTWDEMODBTYPE(文件,'/ *离散凝集器:''/积分器''*' 那......'/* End of DiscreteIntegrator: "/Integrator " */' ,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)
/ *模型初始化函数* / void RTWDEMO_ROLL_INITIALIZE(void){/ *注册码* // *初始化错误状态* / rtmseterrorstatus(rtwdemo_roll_m,(null));/ *块I / O * /(void)MEMSET(((void *)和RTWDEMO_ROLL_B),0,SIZEOF(B_RTWDEMO_ROLL_T));/ *状态(dwork)* /(void)memset((void *)和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.H.
,实时模型数据结构包含指向错误指示的指针,内部数据和主要输入和输出数据的形式extu.
和ex
子结构(其字段表示模型的根级别的Inport和Outport块)。
file = fullfile('rtwdemo_roll_grt_rtw'那'rtwdemo_roll.h');RTWDEMODBTYPE(文件,'/ *实时模型数据结构* /'那......'/ *依赖源文件的外部数据声明* /',1,0)
/ *实时模型数据结构* / struct tag_rtm_rtwdemo_roll_t {const 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结构)分配了子结构的内存。
file = fullfile('rtwdemo_roll_grt_rtw'那'rtwdemo_roll.c');RTWDEMODBTYPE(文件,'/ *模型数据分配功能* /'那......'RT_MODEL_RTWDEMO_ROLL_T * RTWDEMO_ROLL(VOID)',1,1)
/ *模型数据分配功能* / RT_MODEL_RTWDEMO_ROLL_T * RTWDEMO_ROLL(VOID)
该模型步
函数接受表示实时模型数据结构的参数。
RTWDEMODBTYPE(文件,'/ *模型步骤功能* /'那'void rtwdemo_roll_step',1,1)
/ *模型步骤功能* / void RTWDEMO_ROLL_STEP(RT_MODEL_RTWDEMO_ROLL_T * CONST RTRWDEMO_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(文件,'/ *离散凝集器:''/积分器''* /' 那......'/* End of DiscreteIntegrator: "/Integrator " */' ,1,1)
/*离散Integrator: '/Integrator' */ if (rtwdemo_roll_B->NotEngaged_e || (rtwdemo_roll_DW->Integrator_PrevResetState != 0)) {rtwdemo_roll_DW->Integrator_DSTATE = rtwdemo_roll_P.Integrator_IC;} if (rtwdemo_roll_DW->Integrator_DSTATE >= rtwdemo_roll_P.intLim) {rtwdemo_roll_DW->Integrator_DSTATE = rtwdemo_roll_P.intLim;} else {if (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;
类似地,模型初始化函数接受实时模型数据结构作为参数。
RTWDEMODBTYPE(文件,......'/ *模型初始化功能* /'那“无效rtwdemo_roll_initialize”,1,1)
/ *模型初始化函数* / void 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.H.
没有定义块输入和输出的结构。对于模型中的所有内部信号,优化消除存储或创建本地函数变量而不是全局结构字段。
优化无法消除三个块状态的存储,因此该文件继续定义DWORK结构类型。
file = fullfile('rtwdemo_roll_grt_rtw'那'rtwdemo_roll.h');RTWDEMODBTYPE(文件,......'/ *模块状态(默认存储),用于系统的那“}DW_rtwdemo_roll_T;”,1,1)
/ *块状态(默认存储)为系统''* / typedef struct {real32_t fixptunitdelay1_dstate;/ *' / mixtpt单元delay1'* / real32_t Integrator_dstate;/ *' /积分器'* / int8_t Integrator_prevresettate;/ *' /积分器'* /} dw_rtwdemo_roll_t;
为离散时间积分器块生成的代码现在只在DWork结构中存储状态和输出数据。
file = fullfile('rtwdemo_roll_grt_rtw'那'rtwdemo_roll.c');RTWDEMODBTYPE(文件,'/ *用于离散仪器的更新:''/ Integrator''' 那......'更新的/ * END FOR DiscreteIntegrator: ''/集成' '* /' ,1,1)
/* Update for DiscreteIntegrator: '/Integrator'合并:* Gain: ' /IntGain' */ rtwdemo_roll_DW. */Integrator_DSTATE += 0.5F * rtb_TKSwitch * 0.025F;如果(rtwdemo_roll_DW。积分商_DSTATE >= 5.0F) { rtwdemo_roll_DW.Integrator_DSTATE = 5.0F; } else { if (rtwdemo_roll_DW.Integrator_DSTATE <= -5.0F) { rtwdemo_roll_DW.Integrator_DSTATE = -5.0F; } } rtwdemo_roll_DW.Integrator_PrevResetState = (int8_T)rtb_NotEngaged_f;
优化还消除了模型中块参数的存储。例如,在离散时间积分器块中上饱和极限和较低的饱和极限参数设置为inllim.
和- intlim.
。inllim.
是A.金宝appSimulink.Parameter.
对象,其存储的值5.
。在用于离散时间积分器,这些块参数和生成的代码inllim.
看起来是线索的5.0f.
和-5.0f.
。
如果模型包含代码生成器不能直接内联的参数(例如数组参数),则代码将定义表示数据的结构类型。这恒定参数结构使用const
存储类型限定符,因此某些构建工具链可以进一步优化汇编代码。
当您选择优化配置参数>启用本地块输出,代码生成器尝试通过将内部信号表示为局部变量而不是全局结构的字段来尝试产生更有效的代码。如果局部变量消耗的内存会超出目标硬件上可用的堆栈空间,请考虑通过设置指示最大堆栈大小配置参数>最大堆栈大小(字节)。有关更多信息,请参阅最大堆栈大小(字节)。
一种测试点是存储在唯一存储器位置的信号。有关包括模型中的测试点的信息,请参阅将信号配置为测试点。
生成包含测试点的模型的代码时,构建过程为每个测试点分配单独的内存缓冲区。默认情况下,测试点作为标准数据结构的成员存储为诸如
。模型
_B.
如果您有嵌入式编码器®:
您可以通过指定代码生成设置来控制测试点的默认表示内部数据代码映射编辑器中的数据类别(参见配置数据的默认代码生成).
您可以指定构建过程忽略模型中的测试点,允许通过使用最佳缓冲区分配忽略测试点的信号参数。忽略测试点有助于从原型转换到部署,并避免由于工作流工件而意外地降低生成的代码。看到忽略测试点的信号。
即使在与测试点关联时,虚拟总线也不会出现在生成的代码中。要在生成的代码中显示总线,请使用非视频总线或虚拟总线转换为非范围总线信号转换堵塞。
工作空间变量是用于在模型中指定块参数值的变量。工作区变量包括数字MATLAB®变量和金宝appSimulink.Parameter.
对象您在工作空间存储,例如基本的工作区,或在数据字典。
当你设置时默认参数行为到可调
,默认情况下,工作区变量显示在生成的代码中作为全局参数结构的可调字段。如果使用这样的变量来指定多个块参数值,则变量显示为全局参数结构的单个字段。代码不会创建多个字段以表示块参数。因此,在代码执行期间调整字段值更改模型的数学行为以与在模拟期间调整MATLAB变量或参数对象的值相同的方式。
如果有嵌入式编码器,则可以通过指定代码映射编辑器中的参数数据类别的代码生成设置来控制工作区变量的默认表示(参见配置数据的默认代码生成).
这模型参数类别适用于存储在模型工作区中的变量。
这外部参数类别适用于存储在基础工作区或数据字典中的变量。
默认情况下,代码生成器假定应用程序中的其他系统和组件无需访问内部数据。例如,内部数据受到可以从生成的代码中消除它们的优化。有关原型设计和测试目的,您可以通过清除优化或配置测试点并应用存储类来访问内部数据(请参阅保留的变量在生成的代码).有关优化的生产代码,请将各个数据项配置为在生成的代码中显示为模型接口的一部分。
根据生成代码的重返,即您选择的设置代码接口包装,您可以在模型中配置每个数据项来通过出现在这些实体之一的代码中参与接口:
全局符号,例如全局变量或对专业函数的调用
生成的入口点函数的正式参数(参数)
该表显示了每个类别可以用于参与接口的机制。
数据类别 | 出现为全局符号 | 表现为入口点函数的参数 |
---|---|---|
根级轮廓尺寸或外港堵塞 | 仅适用于非身份模型。 | 是的。 |
信号连接两个块 | 仅适用于非身份模型。 | 仅针对重圈模型,仅作为结构的领域。 或者,将信号连接到根级外港堵塞。 |
块状态 | 仅适用于非身份模型。 | 仅针对重圈模型,仅作为结构的领域。 |
数据存储诸如数据存储内存堵塞 | 是的。 | 仅针对重圈模型,仅作为结构的领域。 |
块参数或参数对象,如金宝appSimulink.Parameter. |
是的。 | 只作为一个领域的结构。 |
对于单个实例算法(您设置代码接口包装到不可用的功能
),使用Model Data Editor或Property Inspector将Storage类直接应用于单个数据项。使用直接应用的存储类,数据项将显示在代码中作为全局符号,例如全局变量。存储类还可以防止优化从消除数据项的存储。
您可以将存储类应用于信号、块状态和块参数。(对于块参数,您可以通过参数对象间接应用存储类,例如金宝appSimulink.Parameter.
).但是,对于信号,考虑将信号连接到一个外港块在模型的根级别。然后,可选地,您可以将存储类应用于块。在框图中,外港块表示该信号代表一个系统输出。
有关存储类的更多信息,请参阅C代码生成配置模型接口元素。
对于可重入算法(您设置代码接口包装到可重用的功能
),使用不同的技术来配置数据项出现在代码的产生的入口点函数的形式参数(参数)。
对于内部信号,请直接应用存储类默认模式
(看C代码生成配置模型接口元素).如果您有Embedded Coder,在代码映射编辑器中内部数据类别,将默认存储类设置为默认的
或结构化存储类,你在嵌入式编码字典定义(见创建代码定义以用于代码映射编辑器).可替换地,配置信号作为测试点(见生成的代码中的测试点的出现).默认情况下,信号显示为标准数据结构之一的字段(参见生成代码如何存储内部信号、状态和参数数据).如果您不希望信号出现在生产代码中,请使用测试点,以便稍后选择模型配置参数忽略测试点的信号。
或者,将信号连接到外港块在模型的根级别。将信号连接到根级外港块阻止优化从代码中消除信号。为了帮助在大型模型中进行信号路由,请使用转到和从块。
对于块参数,创建一个参数对象,例如金宝appSimulink.Parameter.
并直接申请以外的存储类汽车
对象。存储类可防止优化在代码中引入参数值。
使用存储类,参数在模型的实例之间共享,这是对入口点函数的调用。函数直接访问参数数据,作为全局符号,而不是一个参数。您无法将参数配置为代码中的参数作为参数,因此您无法启用模型的每个实例来使用参数的不同值。
有关应用存储类的信息,请参阅C代码生成配置模型接口元素。
缺省情况下,代码生成器聚合了优化不能将诸如大多数状态数据消除成标准结构的内部数据,以诸如Dwork结构的标准结构。使用嵌入式编码器,您可以控制生成的代码如何存储此数据。
使用代码映射编辑器为每个类别的数据(如状态和信号)指定默认内存部分(内部数据).在生成的代码中,您的自定义Pragmas或其他装饰围绕数据定义和声明。
您还可以根据模型中的原子子系统分区结构,以便为子例程和其他算法子组件的数据指定不同的默认内存部分。
有关更多信息,请参阅通过插入Pragmas来控制数据和功能放置。
您可以控制标准数据结构的一些特征。有关更多信息,请参阅控制数据结构的特征(嵌入式编码器)。
在过去的结构特点,如在生成的代码文件放置额外的控制,通过使用嵌入式编码字典创建自己的结构化存储类。然后,使用代码映射编辑器将存储类应用于数据类别。存储类中删除从标准结构中的数据,创建其他的结构,你可以更好地控制。有关应用默认的存储类数据类别的详细信息,请参阅配置数据的默认代码生成。有关创建存储类的更多信息,请参阅定义存储类型,存储器部分,和函数模板的软件体系结构。
在标准数据结构中,要创建包含单个实例(非身份)子程序或子组件的数据的子结构,请使用原子子系统封装相应的块。在子系统参数中,设置功能包装到可重用的功能
。有关更多信息,请参阅为非宽度子系统生成模块化功能代码。
或者,封装模型中的块并使用a模型堵塞。在引用的模型中,设置配置参数>模型参考>每个顶级模型允许的实例总数到多种的
。有关更多信息,请参阅为模型引用层次结构生成代码。
要创建单独的,独立的结构,包含多实例(重圈)子程序或子组件中的数据,在模型中使用原子子系统来封装相应的块。在子系统参数中,设置功能包装到不可用的功能
并选择具有独立数据的函数。有关更多信息,请参阅为非宽度子系统生成模块化功能代码。
或者,封装模型中的块并使用a模型堵塞。在参考模型,选择这些技术之一:
放配置参数>模型参考>每个顶级模型允许的实例总数到一
。有关更多信息,请参阅为模型引用层次结构生成代码。
放每个顶级模型允许的实例总数到多种的
并使用嵌入式编码器字典创建结构化存储类。然后,使用代码映射编辑器将存储类应用于数据类别。要创建存储类,请参阅定义存储类型,存储器部分,和函数模板的软件体系结构。要将存储类应用于数据类别,请参阅配置数据的默认代码生成。
要将任意信号和参数组织成自定义结构和子结构,创建非virtual总线信号和参数结构。可选地,为了防止优化从代码中消除数据,将总线信号或参数结构的存储类设置为以外的值汽车
(默认设置)。
在将块添加到模型时,必须将每个新信号和参数明确地将每个新信号和参数放入总线或结构。
有关更多信息,请参阅将数据组织到生成代码中的结构中。
要使内部数据类别作为独立的非结构化全局变量而不是标准数据结构的字段出现在生成的代码中,请使用代码映射编辑器对数据类别应用非结构化存储类。例如,应用存储类ExportedGlobal
。但是,如果要生成多实例,则通过设置配置参数来重新输入代码代码接口包装到以外的价值不可用的功能
,您无法为某些类别的数据使用此技术(参见存储类和重入,多实例模型和组件).
要通过使用代码映射编辑器将默认存储类数据的类别,看配置数据的默认代码生成。要选择一个存储类,见选择用于控制生成代码中的数据表示的存储类。