主要内容

生成本地变量可以定位的存储类

信号,如果可能的话,生成的变量是局部的函数而不是全局存储。产生局部变量可以防止代码生成器实现优化,删除这些变量从生成的代码。局部变量改进可观测性、可读性和有利于调试所生成的代码。

减少使用局部变量与全局变量的使用堆栈使用控制。例如,堆栈大小可以确定本地和全局变量的数量代码生成器生成的代码可以分配。有关更多信息,请参见自定义栈空间分配

示例模型

该模型rtwdemo_localizable_csc包含有两个信号可以定位的存储类。在自锁子系统、信号与标签门闩有一个可以定位的存储类。在调试子系统、信号与标签调试有一个可以定位的存储类。

生成代码与可以定位的存储类

  1. 打开模型。

    模型=“rtwdemo_localizable_csc”;open_system(模型);
  2. 遵守规范,打开代码映射编辑器。在C代码选项卡上,选择代码接口>单个元素的代码映射

  3. 信号/州选项卡,扩大信号。信号的存储类门闩调试被设置为可以定位的

  4. 生成并查看代码。的Debug_b函数包含这个代码:

    静态孔隙Debug_b (const real_T rtu_In1 [6], const real_T rtu_In2 [6], real_T rtd_A [6]) {real_T调试;int32_T我;(我= 0;我< 6;我+ +){Debug = rtu_In1[我]* rtu_In2[我];rtd_A[我]+ =调试;}}

    自锁函数包含这个代码:

    静态空自锁(const real_T rtu_In1 [36], real_T rty_Out1 [6], real_T rty_Out2 [6], real_T rtd_A [6]) {real_T门闩[6];int32_T我;int32_T i_0;(我= 0;我< 6;我+ +){门闩[我]= rtd_A[我];rty_Out2[我]=门闩[我];}(i = 0;我< 6;我+ +){rty_Out1[我]= 0.0; for (i_0 = 0; i_0 < 6; i_0++) { rty_Out1[i] += rtu_In1[6 * i_0 + i] * Latch[i_0]; } } }

    两个函数包含变量的中间值。的Debug_b函数包含变量调试。的自锁函数包含变量门闩

没有可以定位的存储类生成代码

  1. 改变信号存储类可以定位的ExportToFile。在代码映射编辑器中,对于每一个信号,设置存储类ExportToFile

  2. 生成并查看代码。的rtwdemo_localizable_csc.c文件包含这两个全局变量声明:

    real_T调试[6];real_T门闩[6];

    Debug_b函数包含这个代码:

    静态孔隙Debug_b (const real_T rtu_In1 [6], const real_T rtu_In2 [6], real_T rtd_A [6]) {int32_T我;(我= 0;我< 6;我+ +){调试[我]= rtu_In1[我]* rtu_In2[我];rtd_A[我]+ =调试(我);}}

    自锁函数包含这个代码:

    静态空自锁(const real_T rtu_In1 [36], real_T rty_Out1 [6], real_T rty_Out2 [6], real_T rtd_A [6]) {int32_T我;int32_T i_0;(我= 0;我< 6;我+ +){门闩[我]= rtd_A[我];rty_Out2[我]=门闩[我];}(i = 0;我< 6;我+ +){rty_Out1[我]= 0.0;(i_0 = 0; i_0 < 6; i_0++) { rty_Out1[i] += rtu_In1[6 * i_0 + i] * Latch[i_0]; } } }

    代码的可读性和可观察性是一样的可以定位的存储类规范除了标记信号是全局变量。

  3. 删除调试门闩信号从代码的映射。在代码映射编辑器中,选择每个信号并单击删除信号按钮。

  4. 保存模型。

  5. 生成并查看代码。的Debug_b函数包含这个代码:

    静态调试无效(const real_T rtu_In1 [6], const real_T rtu_In2 [6], real_T rtd_A [6]) {int32_T我;(我= 0;我< 6;我+ +){rtd_A[我]+ = rtu_In1[我]* rtu_In2[我];}}

    自锁函数包含这个代码:

    静态空自锁(const real_T rtu_In1 [36], real_T rty_Out1 [6], real_T rty_Out2 [6], real_T rtd_A [6]) {int32_T我;int32_T i_0;(我= 0;我< 6;我+ +){rty_Out2[我]= -rtd_A[我];rty_Out1[我]= 0.0;(i_0 = 0;i_0 < 6;i_0 + +) {rty_Out1[我]+ = rtu_In1 [6 * i_0 + i) * rtd_A [i_0];}}}

    没有可以定位的ExportToFile存储类,代码生成器消除了调试门闩变量。如果没有这些变量,生成的代码的可读性和可观察性减少。

额外的信息

  • 代码生成器的本地化的信号可以定位的存储类规范,选择模型配置参数启用本地块输出。这个参数是在默认情况下。

  • 您可以指定相同的可以定位的存储类的两个信号在不同的可重用的子系统。因此,您可以创建一个库块从一个可重用的子系统可以定位的存储类规范。

  • 代码生成器并不创建一个局部变量必须保持全球的一个信号。少数情况下,代码生成器不能定位信号有:

    • 输入和输出信号,即使在那种一次性的子系统函数接口参数设置为允许参数(优化)

    • 信号是持有国家,因为它的接收器和驱动块执行在不同的利率。

    • 可以定位的规范是一个信号,跨越的边界条件执行子系统。

相关的话题