主要内容

将数据拷贝转换为指针赋值

代码生成器通过尝试替换来优化矢量信号分配的生成代码循环控制的元素赋值和memcpy使用指针赋值的函数调用。指针赋值可以避免昂贵的数据拷贝。因此,它们使用更少的堆栈空间,并提供更快的执行速度循环控制的元素赋值和memcpy函数调用。如果将大型数据集分配给矢量信号,这种优化可以显著提高代码效率。

配置模型以优化矢量信号分配的生成代码

要应用此优化:

  1. 验证目标是否支持金宝appmemcpy函数。

  2. 确定您的模型是否使用矢量信号分配(例如Y =表达式)来移动大量数据。例如,您的模型可以使用Selector块从向量、矩阵或多维信号中选择输入元素。

  3. 优化窗格中,使用memcpy作为向量赋值参数,默认开启,启用关联的Memcpy阈值(字节)参数。

  4. 检查设置Memcpy阈值(字节).默认情况下,它指定64字节作为数组的最小大小memcpy函数调用或指针赋值可以替换生成的代码中的循环。根据应用程序矢量信号分配中的数组大小,以及对阈值选择的目标环境考虑,接受默认值或指定另一个数组大小。

示例模型

考虑以下命名的模型rtwdemo_pointer_conversion.该模型使用Switch块将数据分配给矢量信号。然后该信号馈送到总线选择器块。

生成没有优化的代码

  1. 2 .在“配置参数”对话框中清除使用memcpy进行向量赋值参数。

  2. 为构建和检查过程创建临时文件夹。

  3. 新闻Ctrl + B生成代码。

# # #开始构建过程:rtwdemo_pointer_conversion # # #成功完成构建过程:rtwdemo_pointer_conversion模型建立目标:总结构建模型重建行动的理由  ============================================================================================================ rtwdemo_pointer_conversion代码生成和编译。代码生成信息文件不存在。构建1 / 1模型(0个模型已经更新)构建持续时间:0h 0m 12.637s

查看未经过优化的生成代码。这是一部分rtwdemo_pointer_conversion.c

/*模型步长函数*/ void rtwdemo_pointer_conversion_step(void) {int32_T i;int16_T rtb_dataX [100];int16_T rtb_dataY [100];/*从'<根>/Switch'生成的交换机包含:*常量:'<根>/Constant' *常量:'<根>/Constant1' *常量:'<根>/Constant2' *常量:'<根>/Constant3' *输入:'<根>/In1' */ for (i = 0;I < 100;i++) {if (rtU.In1) {rtb_dataX[i] = rtCP_Constant_Value[i];rtb_dataY[i] = rtCP_Constant1_Value[i];} else {rtb_dataX[i] = rtb_constant2_value [i];rtb_dataY[i] = rtb_constant3_value [i];}} /* Switch End of Switch generated from: '<根>/Switch' */ /* S-Function (sfix_look1_dyn): '<根>/动态查找表'合并:* Inport: '<根>/In2' * Outport: '<根>/Out1' */ /*动态查找表块:'<根>/动态查找表' * Input0 Data Type: Integer S16 * Input1 Data Type: Integer S16 * Input2 Data Type: Integer S16 * Output0 Data Type: Integer S16 *查找方法:Linear_Endpoint * */ LookUp_S16_S16(&(rtY.Out1), & rtb_datay [0], rtU。In2, &rtb_dataX[0], 99U); }

如果没有优化,生成的代码包含循环控制的元素赋值。

启用优化和生成代码

  1. 2 .在“配置参数”对话框中,选择使用memcpy进行向量赋值参数。

  2. 生成的代码。

# # #开始构建过程:rtwdemo_pointer_conversion # # #成功完成构建过程:rtwdemo_pointer_conversion模型建立目标:总结构建模型重建行动的理由  =========================================================================================== rtwdemo_pointer_conversion代码生成和编译。生成的代码已经过时。构建1 / 1模型(0个模型已经更新)构建时间:0h 0m 10.4s

查看未经过优化的生成代码。这是一部分rtwdemo_pointer_conversion.c

/*模型步长函数*/ void rtwdemo_pointer_conversion_step(void) {const int16_T *rtb_dataX_0;int16_T *rtb_dataY_0;/* Inport: '<根>/In1' */ if (rtU.In1){/*从'<根>/Switch'生成的开关:* Constant: '<根>/Constant' */ rtb_dataX_0 = &rtCP_Constant_Value[0];/* Switch from: '<根>/Switch'合并:* Constant: '<根>/Constant1' */ rtb_dataY_0 = &rtCP_Constant1_Value[0];} else {/* Switch from: '<根>/Switch'合并:* Constant: '<根>/Constant2' */ rtb_dataX_0 = &rtCP_Constant2_Value[0];/* Switch from: '<根>/Switch'合并:* Constant: '<根>/Constant3' */ rtb_dataY_0 = &rtCP_Constant3_Value[0];} /* End of Inport: '<根>/In1' */ /* S-Function (sfix_look1_dyn): '<根>/动态查找表'合并:* Inport: '<根>/In2' * Outport: '<根>/Out1' */ /*动态查找表块:'<根>/动态查找表' * Input0数据类型:Integer S16 * Input1数据类型:Integer S16 * Input2数据类型:Integer S16 * Output0数据类型:Integer S16 *查找方法:线性端点* */ LookUp_S16_S16(&(rtY.Out1), & rtb_datay_0 [0], rtU。In2, &rtb_dataX_0[0], 99U);}

因为设置Memcpy阈值(字节)参数小于生成代码中的数组大小,优化代码包含矢量信号赋值的指针赋值。

另请参阅

|

相关的话题