主要内容

为信号路径指定缓冲区的重用

如果你的模型的最优参数设置删除数据副本,您可以删除额外的数据通过使用副本可重用的存储类信号通过代码映射编辑器或金宝appSimulink.Signal数据对象。这种优化减少数据拷贝和内存消耗,增加代码的执行速度。学习后生成的代码和静态代码度量报告和识别领域你认为缓冲重用是可能的,你指定可重用的存储类信号线路。

您可以指定缓冲区复用信号,包括一对根尺寸和外港的信号。您还可以指定缓冲区重用只是一双根尺寸和外港信号。这种优化减少ROM和RAM消费,因为有更少的全局变量和数据复制生成的代码。代码执行速度也会增加。

示例模型

该模型ex_reusable_csc包含那种一次性的子系统DeltaSubsystem和MATLAB函数块DownsampleDeltaSubsystem包含块的MATLAB函数δy

模型=“ex_reusable_csc”;open_system(模型);

指定可重用代码映射编辑器中存储类

  1. 打开嵌入式编码器应用程序。

  2. 打开代码映射编辑器,单击代码接口>单个元素的代码映射

  3. 在模型中,选择RCSC_REAL线信号。把这个信号或信号在代码映射编辑器中,在信号/州选项卡上,单击添加选中的信号代码映射按钮。

  4. 行表示信号,设置存储类可重用的

  5. 同样,这些信号添加到代码映射编辑器和设置存储类可重用的:

  • RCSC_IMAG

  • RCSC_REAL2

  • RCSC_IMAG2

和这些信号子系统:

  • RCSC_REAL

  • RCSC_IMAG

  • RCSC_REAL2

  • RCSC_IMAG2

另外,在MATLAB中使用这些命令命令窗口:

cmo = coder.mapping.utils.create(模型);厘米= coder.mapping.api.get(模型);portHandles = get_param (“Real-Imag ex_reusable_csc /复杂”,“portHandles”);addSignal(厘米,[portHandles.Outport (1) portHandles.Outport (2)),“StorageClass”,可重用的);portHandles = get_param (“ex_reusable_csc / Downsample”,“portHandles”);addSignal(厘米,[portHandles.Outport (1) portHandles.Outport (2)),“StorageClass”,可重用的);portHandles = get_param (“ex_reusable_csc / DeltaSubsystem /△”,“portHandles”);addSignal(厘米,[portHandles.Outport (1) portHandles.Outport (2)),“StorageClass”,可重用的);portHandles = get_param (“ex_reusable_csc / DeltaSubsystem /δy”,“portHandles”);addSignal(厘米,[portHandles.Outport (1) portHandles.Outport (2)),“StorageClass”,可重用的);

构建的模型。

currentDir = pwd;[~,cgDir] = rtwdemodir ();slbuild(模型);
# # #开始构建过程:ex_reusable_csc # # #成功完成构建过程:ex_reusable_csc模型建立目标:总结构建模型重建行动的原因= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = ex_reusable_csc代码生成和编译代码生成信息文件不存在。1 1模型的建立(0模型已经更新)构建持续时间:0 h 0米26.278秒

缓冲重用的ex_reusable_csc.c文件包含这些全局变量:

用= fullfile (cgDir,“ex_reusable_csc_ert_rtw”,“ex_reusable_csc.c”);rtwdemodbtype(用/ *定义自定义存储类:可重用* /”,/ *外部输入(根尺寸信号用默认存储)* /”1 0);
/ *定义自定义存储类:可重用* /静态real_T RCSC_IMAG [1048576];/ * < Root > /复杂Real-Imag‘* /静态real_T RCSC_IMAG2 [262144];/ * < Root > / Downsample”* /静态real_T RCSC_REAL [1048576];/ * < Root > /复杂Real-Imag‘* /静态real_T RCSC_REAL2 [262144];/ * < Root > / Downsample * /

ex_reusable_csc.c文件包含这个代码:

用= fullfile (cgDir,“ex_reusable_csc_ert_rtw”,“ex_reusable_csc.c”);rtwdemodbtype(用“/ *输出和更新原子系统:< Root > / DeltaSubsystem“* /”,“/ *输出和更新原子系统:< Root > / Downsample“* /”1 0);rtwdemodbtype(用“/ *模型阶跃函数* /”,“/ *模型初始化函数* /”1 0);
/ *输出和更新原子系统:“< Root > / DeltaSubsystem”* /静态孔隙DeltaSubsystem (void) {/ * ComplexToRealImag: Real-Imag < Root > /复杂的包含:* MATLAB函数:“< S1 > /△”* SignalConversion来自:< S1 > /△的* * /△((& (RCSC_REAL2 [0])), (& (RCSC_IMAG2 [0])), (& (RCSC_REAL [0])), (& (RCSC_IMAG [0])));/ * SignalConversion产生:“< Root > / Downsample”包含:* ComplexToRealImag:“< Root > /复杂Real-Imag”* MATLAB函数:“< S1 > /δy”* SignalConversion来自:< S1 > /δy的* * /δy ((& (RCSC_REAL [0])), (& (RCSC_IMAG [0])), (& (RCSC_REAL2 [0])), (& (RCSC_IMAG2 [0])));}/ *模型阶跃函数* /空白ex_reusable_csc_step (void) {int32_T我;/ * ComplexToRealImag: Real-Imag < Root > /复杂的包含:*尺寸:“< Root > / ComplexData”* / (i = 0;我< 1048576;我+ +){RCSC_REAL[我]= rtU.ComplexData[我].re;RCSC_IMAG[我]= rtU.ComplexData[我].im;}/ * ComplexToRealImag结束:“< Root > /复杂Real-Imag‘* / / * MATLAB功能:“< Root > / Downsample”* / Downsample ((& (RCSC_REAL [0])), (& (RCSC_IMAG [0])), (& (RCSC_REAL2 [0])), (& (RCSC_IMAG2 [0])));/ *输出原子子系统:“< Root > / DeltaSubsystem”* / DeltaSubsystem ();/ *输出子系统:年底的< Root > / DeltaSubsystem * / / *外港:“< Root > /着干活”包含:* RealImagToComplex: < Root > / Real-Imag复杂的* SignalConversion来自:< S1 > /δy的* * / (i = 0; i < 261121; i++) { rtY.Out1[i].re = RCSC_REAL2[i]; rtY.Out1[i].im = RCSC_IMAG2[i]; } /* End of Outport: '/Out1' */ }

的变量RCSC_REALRCSC_IMAG持有复杂的实像块和输出。这些变量的输入δy块。的变量RCSC_REAL2RCSC_IMAG2持有的输出Downsampleδy。这些变量的输入块。通过交叉缓冲以这种方式,您在生成的代码中消除冗余数据副本。

把信号从代码映射编辑器,在信号/州选项卡,并单击选择信号删除选中的信号代码映射按钮。

另外,在MATLAB中使用这些命令命令窗口:

portHandles = get_param (“Real-Imag ex_reusable_csc /复杂”,“portHandles”);removeSignal(厘米,[portHandles.Outport (1) portHandles.Outport (2)));portHandles = get_param (“ex_reusable_csc / Downsample”,“portHandles”);removeSignal(厘米,[portHandles.Outport (1) portHandles.Outport (2)));portHandles = get_param (“ex_reusable_csc / DeltaSubsystem /△”,“portHandles”);removeSignal(厘米,[portHandles.Outport (1) portHandles.Outport (2)));portHandles = get_param (“ex_reusable_csc / DeltaSubsystem /δy”,“portHandles”);removeSignal(厘米,[portHandles.Outport (1) portHandles.Outport (2)));

当你为模型生成代码,ex_reusable_csc.h包含两个额外的全局变量:

slbuild(模型);用= fullfile (cgDir,“ex_reusable_csc_ert_rtw”,“ex_reusable_csc.h”);rtwdemodbtype(用/ *块信号和状态的,“}D_Work;”1 0);
# # #开始构建过程:ex_reusable_csc # # #成功完成构建过程:ex_reusable_csc模型建立目标:总结构建模型重建行动的原因= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = ex_reusable_csc代码生成和编译生成的代码是过时了。1 1模型的建立(0模型已经更新)构建持续时间:0 h 0米15.979秒/ *块信号和状态(默认存储)系统的<根> * / typedef struct {real_T z2 [262144];/ * < S1 > /δy的* / real_T z1 [262144];/ * < S1 > /δy的* / real_T z1_m [261632];/ * < S1 > /△的* / real_T z2_c [261632];/ * < S1 > /△的* / real_T RCSC_REAL [1048576];/ * < Root > /复杂Real-Imag‘* / real_T RCSC_IMAG [1048576];/ * < Root > /复杂Real-Imag‘* /

ex_reusable_csc.c文件现在包含这些代码。

用= fullfile (cgDir,“ex_reusable_csc_ert_rtw”,“ex_reusable_csc.c”);rtwdemodbtype(用“/ *输出和更新原子系统:< Root > / DeltaSubsystem“* /”,“/ *输出和更新原子系统:< Root > / Downsample“* /”1 0);rtwdemodbtype(用“/ *模型阶跃函数* /”,“/ *模型初始化函数* /”1 0);
/ *输出和更新原子系统:“< Root > / DeltaSubsystem”* /静态孔隙DeltaSubsystem (void) {/ * MATLAB功能:“< S1 > /△”* /△(rtDWork。z2, rtDWork。z1, rtDWork。z1_m rtDWork.z2_c);/ * MATLAB功能:“< S1 > /δy”* /δy (rtDWork。z1_m rtDWork。z2_c &rtDWork。z1 [0], &rtDWork.z2 [0]);}/ *模型阶跃函数* /空白ex_reusable_csc_step (void) {int32_T我;/ * ComplexToRealImag: Real-Imag < Root > /复杂的包含:*尺寸:“< Root > / ComplexData”* / (i = 0;我< 1048576;我+ +){rtDWork。RCSC_REAL[i] = rtU.ComplexData[i].re; rtDWork.RCSC_IMAG[i] = rtU.ComplexData[i].im; } /* End of ComplexToRealImag: '/Complex to Real-Imag' */ /* MATLAB Function: '/Downsample' */ Downsample(rtDWork.RCSC_REAL, rtDWork.RCSC_IMAG, rtDWork.z2, rtDWork.z1); /* Outputs for Atomic SubSystem: '/DeltaSubsystem' */ DeltaSubsystem(); /* End of Outputs for SubSystem: '/DeltaSubsystem' */ /* Outport: '/Out1' incorporates: * RealImagToComplex: '/Real-Imag to Complex' */ for (i = 0; i < 261121; i++) { rtY.Out1[i].re = rtDWork.z1[i]; rtY.Out1[i].im = rtDWork.z2[i]; } /* End of Outport: '/Out1' */ }

生成的代码包含两个额外的全局变量持有块输入和输出。

为模型的局限性,使用可重用代码映射编辑器中存储类

对可重用的数据元素,您可以指定相同的值标识符财产。如果你不指定一个值标识符,代码生成器使用相同的信号标签名称生成的代码的可复用的信号。代码生成器不重用信号如果:

  • 信号有相同的标签,但不同的标识符。

  • 信号具有相同的标识符,但不同的这些属性的值:DataScope,HeaderFile,DefinitionFile,老板。如果有不匹配的属性,代码生成器停止并产生一个错误如果模型配置参数检测无法重用定制的存储类被设置为错误

指定一个仿真软件信号金宝app对象重用

1。打开模型rtwdemo_reusable

模型=“rtwdemo_reusable_csc”;open_system(模型);

2。相应的信号模型中的决心金宝appSimulink.Signal数据对象的基本工作空间。右键单击RCSC_REAL线信号。从上下文菜单中,选择属性。在信号属性对话框,检查信号名称RCSC_REAL和参数信号仿真软件名称必须决心信号对象金宝app被选中。此设置指示有一个金宝appSimulink.Signal数据对象的基本工作空间名称相同RCSC_REAL

3所示。在模型中,导航到DeltaSubsystem子系统。选择RCSC_REAL在这个子系统信号线。这个信号也解决了信号对象的基本工作空间。

4所示。在基本工作空间,双击数据对象RCSC_REAL。的金宝appSimulink.Signal对话框打开。

5。在代码生成选项卡,检查的存储类参数设置为可重用的。此设置指示代码生成器生成的代码信号作为一个全局变量命名RCSC_REAL。与可重用的存储类,生成的代码可以存储复杂的输出Real-Imag块(在模型的根级)和MATLAB功能块的输出(子系统)RCSC_REAL全局变量。

6。在应用程序画廊,下代码生成,点击嵌入式编码器。的C代码选项卡打开。

7所示。单击构建按钮。

生成的代码实现相同的结果,前面的工作流程,您可以在其中添加信号映射的代码编辑器和设置存储类可重用的

注意:您可以指定缓冲区重用代码生成器不能实现的信号。在这种情况下,使用两个诊断模型显示指定消息类型。在配置参数对话框,这些诊断检测无法重用定制的存储类检测模糊自定义存储类最终值

bdclose rtwdemoclean(模型);cd (currentDir)

缓冲重用单元延迟和延迟街区

重用一个单元的信号延迟或推迟块,使用相同的可重用存储类规范一对输入和状态参数或一对输出和状态参数的单位延迟或推迟块。对于延迟块,您必须设置延迟的长度参数1初始条件>源对话框。要访问这些参数,模型中,打开属性检查器,然后单击模型中的块。

限制根尺寸和外港信号

这些限制适用于一个模型你指定缓冲区重用一双根尺寸和外港的信号:

  • 输出端口不能是有条件的。

  • 如果代码生成器不能重用相同的缓冲区在顶级模型中,生成的代码包含额外的缓冲区。如果上面的模型是一个引用的模型,代码生成器会报告错误。解决错误,删除金宝appSimulink.Signal规范的信号连接到输出港港口。

  • 当您运行代码生成器生成的可执行文件,和你重用一双根尺寸和外港信号,当根输入值为零,根输出值也必须是零。如果输出值是零,你重用的信号,然后从模拟结果可以从可执行产生的结果不同。

  • 可能会有一个模拟和生成代码不匹配时分配相同的可重用存储类两根尺寸和根外港的信号。这种不匹配时发生一个分配块驱动器根外港块,和分配块不赋值的每个元素分配块的输出信号,因为Y港并不活跃。这张图片显示了模型失配的发生:

在仿真过程中,不成文的任务块输出值为零。在代码生成,不成文的输出值作为输入相同。

为模型的局限性,使用仿真软件信号对象金宝app

这些限制适用于一个模型你为信号通过使用指定缓冲区的重用金宝appSimulink.Signal数据对象:

  • 信号,重用您指定必须具有相同的数据类型和采样率。

  • 指定的缓冲区重用,街区,修改一个信号为重用之前必须执行指定块使用原始信号值。有时代码生成器必须改变块的操作顺序以便缓冲重用可以发生。对模型的代码生成器无法重新排序块操作,缓冲重用不发生。

  • 对模型的代码生成器重整块,以便操作金宝appSimulink.Signal重用可以发生,你可以观察到顺序的差异。在调试选项卡,诊断部分选择信息覆盖下拉箭头。在的对话框中,选择执行顺序。在模拟显示排序的执行顺序,在建模选项卡上,选择更新模型。显示生成的代码的执行顺序的C代码选项卡上,选择构建模型

  • 您可以指定缓冲区链的可重用重用子系统只要这些子系统得不到重用模型中的任何地方。

相关的话题