主要内容

cgsl_0201:冗余单元延迟和内存块

ID:标题 cgsl_0201:冗余单元延迟和内存块
描述 当准备代码生成一个模型,
一个 删除冗余单元延迟和内存块。
基本原理 一个 冗余单元延迟和内存块使用额外的全局内存。从一个模型删除冗余降低内存使用而不影响模型的行为。
最后的改变 R2013a
例子

推荐:合并单元延迟

孔隙减少(void) {ConsolidatedState_2 = Matrix_UD_Test - (Cal_1 * DWork。UD_3_DSTATE + Cal_2 * DWork.UD_3_DSTATE);DWork。UD_3_DSTATE = ConsolidatedState_2;}

不推荐:冗余单元延迟

无效冗余(void) {RedundantState = (Matrix_UD_Test - Cal_2 * DWork.UD_1B_DSTATE) - Cal_1 * DWork.UD_1A_DSTATE;DWork。UD_1B_DSTATE = RedundantState;DWork。UD_1A_DSTATE = RedundantState;}

单位延迟和交换和分配内存块展览代数性质。当方程的块是一个驱动信号,你可以移动单位延迟和内存块到一个新的位置方程不改变结果。

顶部路径在前面的例子中,块的方程是:

  1. Out_1 (t) = UD_1 (t)

  2. UD_1 (t) = In_1 (t - 1) * Cal_1

下面路径的方程是:

  1. Out_2 (t) = UD_2 (t) * Cal_1

  2. UD_2 (t) = In_2 (t - 1)

相比之下,如果你添加一个方程二次信号,延迟单元块的位置影响结果。如以下示例所示,单位延迟块的位置影响结果由于扭曲的时间样品顶部和底部之间的路径。

在单一来源和多个目的地,比较比较复杂。例如,在接下来的模型,您可以重构两个单位延迟块到一个单位延迟。

从黑盒的角度来看,这两个模型是等价的。然而,从内存和计算的角度来看,两个模型之间的差异存在。

{real_T rtb_Gain4;rtb_Gain4 = Cal_1 *冗余;Y。Redundant_Gain = Cal_2 * rtb_Gain4;Y。Redundant_Int = DWork.Int_A;Y。Redundant_Int_UD = DWork.UD_A;Y。Redundant_Gain_UD = DWork.UD_B; DWork.Int_A = 0.01 * rtb_Gain4 + DWork.Int_A; DWork.UD_A = Y.Redundant_Int; DWork.UD_B = Y.Redundant_Gain; }
{real_T rtb_Gain1;real_T rtb_UD_C;rtb_Gain1 = Cal_1 *减少;rtb_UD_C = DWork.UD_C;Y。Reduced_Gain_UD = Cal_2 * DWork.UD_C;Y。Reduced_Gain = Cal_2 * rtb_Gain1;Y。Reduced_Int = DWork.Int_B; Y.Reduced_Int_UD = DWork.Int_C; DWork.UD_C = rtb_Gain1; DWork.Int_B = 0.01 * rtb_Gain1 + DWork.Int_B; DWork.Int_C = 0.01 * rtb_UD_C + DWork.Int_C; }

在这种情况下,原始模型更有效。在第一个代码示例中,有三个全局变量,两个单元的延迟块(DWork。UD_A和DWork.UD_B)和一个离散时间积分器(DWork.Int_A)。第二个代码示例显示了一个减少到一个全局变量单位产生的延误(Dwork.UD_C),但是有两个全局变量由于冗余离散时间积分器块(DWork。Int_B和DWork.Int_C)。离散时间积分器块路径引入了额外的本地变量(rtb_UD_C)和两个额外的计算。

相比之下,重构模型(二)下面是更有效率的。

{real_T rtb_Gain4_f: real_T rtb_Int_D;rtb_Gain4_f = Cal_1 * U.Input;rtb_Int_D = DWork.Int_D;Y。R_Int_Out = DWork.UD_D;Y。R_Gain_Out = DWork.UD_E;DWork。Int_D = 0.01 * rtb_Gain4_f + DWork.Int_D;DWork。UD_D = rtb_Int_D; DWork.UD_E = Cal_2 * rtb_Gain4_f; }
{real_T rtb_UD_F;rtb_UD_F = DWork.UD_F;Y。Gain_Out = Cal_2 * DWork.UD_F;Y。Int_Out = DWork.Int_E;DWork。UD_F = Cal_1 * U.Input;DWork。Int_E = 0.01 * rtb_UD_F + DWork.Int_E; }

的代码重构模型更有效,因为从根信号分支没有冗余单元延迟。