主要内容

在生成的代码中初始化信号、状态和参数数据

模型中的信号线、块参数和块状态可以作为数据(例如,作为全局变量)出现在生成的代码中。默认情况下,代码在执行主算法之前初始化该数据。在Simulink中匹配仿真的数值金宝app®,代码生成器根据您在模型中创建的规范选择初始值。

通过理解生成的代码如何初始化数据,您可以:

  • 为在执行期间重新初始化状态的系统建模,这意味着应用程序可以重新启动整个系统。

  • 将初始值作为变量存储在内存中,变量可以在执行运行之间保持。然后,您可以在启动或重新启动系统之前覆盖这些值。

  • 通过消除对不变初始值的存储,并防止生成不必要的或冗余初始化数据的代码,生成有效的代码。

有关初始化模型中的信号和状态的基本信息,请参见初始化信号和离散状态负载状态信息

静态初始化和动态初始化

要初始化数据项(如全局变量),应用程序可以使用静态初始化或动态初始化。

  • 静态初始化发生在定义(分配内存)变量的同一条语句中。初始化并不发生在函数定义内部。

    代码可以更高效,因为生成的模型函数都不执行初始化语句。

  • 动态初始化发生在函数内部。对于每个模型或非虚拟子系统,代码生成器通常创建一个或多个专用于初始化的函数。

    生成的代码或您的代码可以通过在执行期间调用初始化函数重新启动系统。

需要非零位模式的实际地面初始化

每个数据项都有一个真实世界土地价值.这个值取决于项目的数据类型。例如,对于数据类型为int8,现实世界的地面值是零。对于枚举,ground值是默认枚举成员。

对于某些类型的数据,为了表示真实世界的地面值,计算机在内存中存储为零(所有位都为零)。然而,对于其他一些数据,计算机在内存中存储一个非零值。这些数据包括,例如:

  • 定点数据有偏差。代码将这样的数据项初始化为存储的整数值,给定缩放和偏差,该整数值表示实际的零。

  • 一种枚举,其默认成员映射到非零的整数值。例如,如果默认成员为使用基础整数值3,代码将这样的数据项初始化为

初始化信号和状态数据

在模型中,可以通过块参数控制信号和状态初始值。例如,要设置a的初始值单位延迟Block,你用初始条件参数。在某些情况下,也可以使用InitialValue财产的金宝app仿真软件。信号对象。对于大多数块参数,默认值是0

还可以使用国家的作家初始化函数子系统和初始状态模型配置参数。

默认情况下,生成的代码在生成的初始化函数中动态初始化信号和状态数据(以及其他数据,比如模型错误状态)。这个函数,名为模型_initialize默认情况下,按此顺序执行信号和状态初始化操作:

  1. 将默认生成的结构(如DWork结构)中的信号和状态数据初始化为存储值为零。

  2. 将不属于默认生成结构的附加信号和状态数据初始化为相关的真实接地值。

    此初始化仅适用于满足以下两个条件的数据:

    • 生成的代码定义(分配内存)数据。

    • 数据使用的存储类不是汽车(默认存储类)或模型的默认(当代码映射编辑器指定默认的存储类,默认设置)。

    例如,代码将此操作应用于使用存储类的数据项ExportedGlobal

  3. 将每个信号和状态初始化为模型指定的实际值,例如,通过初始条件参数的单位延迟块。

  4. 将每个状态初始化为您使用a分配的实际值国家的作家块。函数仅在使用初始化函数模型中的子系统。

  5. 将每个状态初始化为使用配置参数指定的实际值初始状态

在执行这个初始化函数之后,每个数据项都有函数分配的最后一个实际值。例如,如果你使用a国家的作家块初始化块状态5同时也使用初始状态初始化相同状态的配置参数10,国家最终使用10作为初始值。

memset对于批量初始化

若要将具有连续存储空间的信号或状态数据项初始化为存储值为0的值,可调用生成的代码memset在初始化函数中。具有连续存储的数据项包括DWork结构、数组或使用多字数据类型的数据项。

如果您的应用程序需要它,您可以阻止生成的代码使用memset用于初始化浮点数数据以存储0。看到使用memset将浮点数和双精度数初始化为0.0

可调初始值

可以配置可调块参数的方式,例如获得参数的获得块,出现在生成的代码中。大多数设置初始值的块参数(例如,初始条件可调。例如,配置参数默认参数的行为可以确定初始值在生成的代码中是作为内联常数显示还是作为可调全局数据显示。您还可以使用参数对象和存储类来控制这些初始值的表示。

对于可调初始值,在模型初始化函数中,赋值语句的右边是一个全局变量、结构字段或其他数据,这些数据的值可以在内存中更改。

要使生成的代码中的初始值可调,请参见在生成的代码中控制信号和状态初始化

参数数据初始化

生成的代码将参数数据静态地初始化为您在Simulink中指定的值。金宝app

将可调参数(全局变量)的初始值表示为涉及系统常量或其他宏的数学表达式,这需要Embedded Coder®,请参阅数学表达式初始化(嵌入式编码器)

参数数据种类

这些模型元素作为参数数据出现在生成的代码中:

  • 可调块参数,例如获得参数的获得块,当你设置默认参数的行为可调.每个参数显示为一个专用全局结构的字段。

  • 一些可调块参数默认参数的行为内联.当代码生成器不能将参数的值内联为文字数字时,参数将显示为专用全局变量的字段常量结构。

  • 金宝app仿真软件。参数对其应用具有导出数据作用域的存储类的对象。例如,内置存储类ExportedGlobal具有导出的数据作用域,但是存储类ImportedExtern没有。

数学表达式初始化(嵌入式编码器

您可以设置参数对象的值(例如金宝app仿真软件。参数)到涉及数字的数学表达式,MATLAB®变量和其他参数对象。看到使用数学表达式设置变量值

如果在Embedded Coder中使用此技术,则可以通过使用指定的表达式生成初始化相应参数数据(全局变量)的代码。例如,请参见从系统常量或其他宏初始化参数值(嵌入式编码器)(嵌入式编码).有关一般信息,包括限制,请参见用表达式值生成参数对象的代码

生成代码中的数据初始化

此示例显示生成的代码如何初始化信号、状态和参数数据。

探索模型示例

打开示例模型,rtwdemo_rtwintro

open_system (“rtwdemo_rtwintro”

在Apps Gallery中,单击金宝app仿真软件编码器

打开模型数据编辑器。在建模选项卡上,单击模型数据编辑器

检查选项卡。对于单位延迟块状态,初始值被设置为0,这意味着状态的初始值为零。这个州被命名为X

初始值例如,对于一个非零数,5

set_param (“rtwdemo_rtwintro / X”“InitialCondition”“5”

打开代码映射编辑器。在C代码选项卡上,选择代码接口>单个元素代码映射

信号/州选项卡,在存储类XExportedGlobal.使用此设置,块状态将显示在生成的代码中作为单独的全局变量。

coder.mapping.utils.create (“rtwdemo_rtwintro”);厘米= coder.mapping.api.get (“rtwdemo_rtwintro”);设置状态(厘米,“rtwdemo_rtwintro / X”“StorageClass”“ExportedGlobal”);

在模型中,打开放大器子系统,这是一个触发子系统。

在模型数据编辑器中,检查参数选项卡。要设置和检查信号和状态的初始值,可以使用参数选项卡而不是选项卡。

模型数据编辑器显示,对于Outport块,初始输出InitialOutput参数设置为0,默认的。这个子系统输出需要一个初始值,因为子系统是有条件执行的。保持初始值为默认值。

在模型中,清晰配置参数>信号存储复用.当您清除此设置时,信号线将作为用于存储信号数据的生成结构的字段出现在生成的代码中。这种信号表示方式使我们更容易看到代码生成器是如何初始化数据的。

set_param (“rtwdemo_rtwintro”“OptimizeBlockIOStorage”“关闭”

在模型中,检查配置参数配置参数>优化>默认参数行为.配置参数设置为内联,这意味着块参数(包括初始值)将作为内联文字或作为常量数据。

导航到模型的根级别。

在模型数据编辑器中,单击显示/刷新的额外信息按钮。

附近的内容过滤框中,单击过滤器使用选择按钮。

在模型中,单击标记的Constant块公司.模型数据编辑器显示恒定值价值)参数被设置为公司公司是基本工作空间中的MATLAB变量。

公司,在价值金宝appSimulink.Parameter (uint8 (1)).MATLAB转换公司到一个金宝app仿真软件。参数对象。

在代码映射编辑器中,在参数选项卡,应用存储类ExportedGlobal公司.使用此设置,生成的代码将进行定义公司作为全局变量。关于初始化,公司是参数数据的一项。

公司= Si金宝appmulink.Parameter(公司);INC.StorageClass =“ExportedGlobal”

生成和检查代码

要构建模型并生成代码,请按Ctrl + B

slbuild (“rtwdemo_rtwintro”);
### Starting build procedure for: rtwdemo_rtwintro ###成功完成build procedure for: rtwdemo_rtwintro模型重建行动的原因  ================================================================================================= rtwdemo_rtwintro代码生成和编译代码生成信息文件不存在。建造时间:0小时0米28.325秒

在生成的文件中rtwdemo_rtwintro.c,在函数定义之外,代码静态初始化参数数据公司.的价值公司1

文件= fullfile (“rtwdemo_rtwintro_grt_rtw”“rtwdemo_rtwintro.c”);rtwdemodbtype(文件,'/*导出块参数*/''uint8_T INC = 1U;', 1, 1)
/*导出块参数*/ uint8_T INC = 1U;/ *变量:公司

在同一个文件中,检查RTWDEMO_RTWINTRO_INITIALIZE.函数。首先,函数使用memset将模型中的内部信号初始化为存储的值0

rtwdemodbtype(文件,'/ *阻止I / O * /'”sizeof (B_rtwdemo_rtwintro_T)),“, 1, 1)
/*块I/O */ (void) memset(((void *) &rtwdemo_rtwintro_B), 0, sizeof(B_rtwdemo_rtwintro_T));

然后函数初始化单位延迟状态,X,以底价计算。在这种情况下,地面值是零。

rtwdemodbtype(文件,/*导出全局状态*/'“X = 0 u;”, 1, 1)
/*导出全局状态*/ X = 0U;

该函数还将其他数据初始化为接地值,包括根级输入和输出(import和Outport块)。

rtwdemodbtype(文件,/*外部输入*/'“Amplifier_Trig_ZCE = POS_ZCSIG;”, 1, 1)
/*外部输入*/ rtwdemo_rtwintro_U。输入= 0;/*外部输出*/ rtwdemo_rtwintro_Y。输出= 0;rtwdemo_rtwintro_PrevZCX。放大器_Trig_ZCE = POS_ZCSIG;

然后初始化函数X中指定的值初始条件块参数。

rtwdemodbtype(文件,/* UnitDelay的初始化条件:" /X " */'...“X = 5 u;”, 1, 1)
/*初始化条件为UnitDelay: '/X' */ X = 5U;

最后,函数初始化对象的输出放大器子系统。

rtwdemodbtype(文件,'SystemInitialize for Triggered SubSystem'...“子系统初始化的结束”, 1, 1)
/* SystemInitialize for Triggered SubSystem: '/Amplifier' */ /* SystemInitialize for Outport: '/Output' includes: * Outport: '/Out' */ rtwdemo_rtwintro_Y. */输出= 0;

检查存储值和实际值之间的差异

对于某些数据,即使真实世界的初始值是零,计算机也会在内存中存储非零值。为了观察这种差异,对块状态应用一个倾斜定点数据类型,X.要运行此示例,您必须拥有Fixed-Point Designer™。

在模型数据编辑器中,检查信号选项卡。

在模型中,点击Switch块的输出信号,switch_out

使用数据类型列,将信号数据类型设置为fixdt(1, 16日,1,3).该表达式表示斜率为的定点数据类型1还有一种偏见3.

set_param (“rtwdemo_rtwintro /开关”“OutDataTypeStr”...“fixdt(1, 16日,1,3)”

在模型中,选择Sum块。在属性检查器中,在信号的属性、清晰要求所有输入具有相同的数据类型

set_param (“rtwdemo_rtwintro /总和”“InputSameDT”“关闭”

要防止不同平台上的编译错误,请选择模型配置参数只生成代码.此设置导致模型只生成代码。

set_param (“rtwdemo_rtwintro”“GenCodeOnly”“上”

要构建模型并生成代码,请按Ctrl + B

slbuild (“rtwdemo_rtwintro”
### # Starting build procedure for: rtwdemo_rtwintro ### #成功完成代码生成for: rtwdemo_rtwintro build Summary Top model targets built: model Action Rebuild Reason =================================================================== rtwdemo_rtwintro code generated generated code was out of date. / /生成的代码已经过期建造时间:0小时0米11.218秒

模型初始化函数首先初始化X到现实世界的基础值,0.由于斜偏差数据类型,它有偏差3.,这个实际值对应于的存储值-3

rtwdemodbtype(文件,/*导出全局状态*/'“X = 3;”, 1, 1)
/*导出全局状态*/ X = -3;

然后初始化函数X的实际初始值初始条件块参数,5.这个真实世界的值对应于存储的值2

rtwdemodbtype(文件,/* UnitDelay的初始化条件:" /X " */'...”X = 2,“, 1, 1)
/*初始化UnitDelay条件:'/X' */ X = 2;

建模的目标

目标 更多的信息
通过使用块显式建模初始化行为

可以使用初始化函数重置功能子系统。在子系统中,使用国家的作家块来动态地计算和分配状态的初始值。相应的代码出现在模型初始化函数中。

有关更多信息,请参见生成响应初始化、重置和终止事件的代码

防止生成显式将数据初始化为零的代码

如果您的应用程序环境已经将全局变量初始化为零,为了更高效的代码,您可以防止生成显式将全局变量初始化为零的语句。这种优化只适用于初始值在内存中存储为零的信号和状态。例如,代码生成器没有将优化应用于:

  • 通过使用块参数指定非零初始值的数据。

  • 实际初始值为零但相应存储值不为零的数据。

  • 其默认成员映射为非零整数的枚举数据。

优化需要嵌入式编码器。有关更多信息,请参见删除零初始化码(嵌入式编码)

生成从外部代码导入数据的代码

您可以生成重用(导入)外部代码定义的数据的代码。例如,您可以应用存储类ImportedExtern到信号线、块状态或参数对象。对进口数据:

  • 生成的代码不会初始化参数数据。您的代码必须初始化导入的参数数据。

  • 生成的初始化函数动态地初始化一些信号和状态数据。与生成的代码分配的数据不同,代码不会将导入的信号或状态数据初始化为存储值为零。相反,代码会立即将数据初始化为您在Simulink中指定的真实值。金宝app

有关更多信息,包括如何防止生成的代码初始化导入的数据,请参见在外部调用代码和生成代码之间交换数据

另请参阅

相关的话题