示例模型
在模型 matlab:rtwdemo_optimize_global_ebf 中,Assignment 模块将来自 Inport 模块和 Constant 模块的值赋给输出信号。输出信号馈入 Gain 模块中。
model = 'rtwdemo_optimize_global_ebf';
load_system('rtwdemo_optimize_global_ebf')
生成代码但不进行优化
在 Configuration Parameters 对话框中,验证是否选择了 Signal storage reuse 参数。
在 Configuration Parameters 对话框中,对于 Optimize global access parameter,选择 None 或在 MATLAB 命令行窗口中输入以下命令:
set_param('rtwdemo_optimize_global_ebf','GlobalVariableUsage','None');
在您的系统临时文件夹中,为编译和检查过程创建一个文件夹:
currentDir = pwd;
[~,cgDir] = rtwdemodir();
编译模型。
rtwbuild(model);
### Starting build procedure for: rtwdemo_optimize_global_ebf
### Successful completion of build procedure for: rtwdemo_optimize_global_ebf
Build Summary
Top model targets built:
Model Action Rebuild Reason
============================================================================================================
rtwdemo_optimize_global_ebf Code generated and compiled Code generation information file does not exist.
1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 43.311s
查看生成的代码而不进行优化。这是 rtwdemo_optimize_global_ebf.c 的一部分。
cfile = fullfile(cgDir,'rtwdemo_optimize_global_ebf_ert_rtw',...
'rtwdemo_optimize_global_ebf.c');
rtwdemodbtype(cfile,'/* Model step','/* Model initialize',1, 0);
/* Model step function */
void rtwdemo_optimize_global_ebf_step(void)
{
real_T rtb_Assignment[5];
int32_T i;
/* SignalConversion generated from: '/Assignment' incorporates:
* Constant: '/Constant'
*/
for (i = 0; i < 5; i++) {
rtb_Assignment[i] = rtCP_Constant_Value[i];
}
/* End of SignalConversion generated from: '/Assignment' */
/* Assignment: '/Assignment' incorporates:
* Inport: '/In1'
*/
rtb_Assignment[1] = rtU.In1;
/* Outport: '/Out1' incorporates:
* Gain: '/Gain'
*/
for (i = 0; i < 5; i++) {
rtY.Out1[i] = 2.0 * rtb_Assignment[i];
}
/* End of Outport: '/Out1' */
}
该代码为本地向量 rtb_Assignment 赋值。最后一条语句将局部向量 rtb_Assignment 中的值复制到全局向量 rtY.Out1。更少的全局变量引用会提高执行速度。该代码对全局变量引用使用的指令多于对局部变量引用使用的指令。
在 Static Code Metrics Report 中,检查 Global Variables 部分。
在 Code Generation Report 窗口中,选择 Static Code Metrics Report。
向下滚动到 Global Variables 部分。
选择每个变量前的 [+] 符号以展开它。
对全局变量的读写总次数为 2。
生成代码并进行优化
在 Configuration Parameters 对话框中,对于 Optimize global access parameter,选择 Use global to hold temporary results,或在 MATLAB 命令行窗口中输入以下命令:
set_param('rtwdemo_optimize_global_ebf',...
'GlobalVariableUsage','Use global to hold temporary results');
编译模型。
rtwbuild(model);
### Starting build procedure for: rtwdemo_optimize_global_ebf
### Successful completion of build procedure for: rtwdemo_optimize_global_ebf
Build Summary
Top model targets built:
Model Action Rebuild Reason
===========================================================================================
rtwdemo_optimize_global_ebf Code generated and compiled Generated code was out of date.
1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 18.399s
查看优化后的生成代码。这是 rtwdemo_optimize_global_ebf.c 的一部分。
cfile = fullfile(cgDir,'rtwdemo_optimize_global_ebf_ert_rtw',...
'rtwdemo_optimize_global_ebf.c');
rtwdemodbtype(cfile,'/* Model step','/* Model initialize',1, 0);
/* Model step function */
void rtwdemo_optimize_global_ebf_step(void)
{
int32_T i;
/* SignalConversion generated from: '/Assignment' incorporates:
* Constant: '/Constant'
*/
for (i = 0; i < 5; i++) {
rtY.Out1[i] = rtCP_Constant_Value[i];
}
/* End of SignalConversion generated from: '/Assignment' */
/* Assignment: '/Assignment' incorporates:
* Inport: '/In1'
*/
rtY.Out1[1] = rtU.In1;
/* Outport: '/Out1' incorporates:
* Gain: '/Gain'
*/
for (i = 0; i < 5; i++) {
rtY.Out1[i] *= 2.0;
}
/* End of Outport: '/Out1' */
}
该代码在不使用局部变量的情况下为全局向量 rtY.Out1 赋值。这种赋值可改善 ROM 和 RAM 消耗量,减少数据副本数。代码将值置于每个赋值操作的目标变量中,而不是在最后复制值。在 Static Code Metrics Report 中,检查 Global Variables 部分。
由于使用全局变量保存局部结果,全局变量的读写总次数从 2 增加到 5。这种优化通过重用全局变量来减少数据副本数。
关闭代码生成报告。
rtwdemoclean;
cd(currentDir)