数据复制减少数据存储读取和数据存储块写
这个例子显示了代码生成器删除临时缓冲区数据存储读取和数据存储块写。这种优化提高执行速度,减少内存消耗。
示例模型
该模型rtwdemo_optimizedatastorebuffers
包含函数调用者UpdateFunc
调用模型函数金宝appDefineUpdateFunc
。读取的数据存储块安全域
读取从mem
。数据存储块写DSW
写入mem
。
模型=“rtwdemo_optimizedatastorebuffers”;open_system(模型);
没有生成代码优化
在配置参数对话框中,取消选择重用缓冲区的数据存储读取和数据存储块写参数或者在MATLAB命令提示符,输入这个命令:
set_param(模型,“OptimizeDataStoreBuffers”,“关闭”);
构建的模型。
currentDir = pwd;[~,cgDir] = rtwdemodir ();rtwbuild(模型)
# # #开始构建过程模型:rtwdemo_optimizedatastorebuffers # # #成功完成构建过程模型:rtwdemo_optimizedatastorebuffers
查看生成的代码没有优化。这段代码是在rtwdemo_optimizedatastorebuffers.c
。
用= fullfile (cgDir,“rtwdemo_optimizedatastorebuffers_ert_rtw”,…“rtwdemo_optimizedatastorebuffers.c”);rtwdemodbtype(用“/ *模型步骤”,/ *初始化模型的1 0);
/ *模型阶跃函数* /空白rtwdemo_optimizedatastorebuffers_step (void) {real_T rtb_DSR_last;real_T rtb_SimFuncCall_o1;real_T rtb_Sum_p;/ * DataStoreRead: < Root > /安全域的* / rtb_DSR_last = mem.last;/ *开关:“< Root > /开关”包含:*不变:“< Root > /常数”* DataStoreRead: < Root > /安全域的*尺寸:< Root > /明确的* /如果(rtU.Clear) {rtb_SimFuncCall_o1 = 0.0;其他}{rtb_SimFuncCall_o1 = mem.max;}/ *开关:“< Root > /开关”* / / *功能性:“< Root > / SimFuncCall”包含:*尺寸:“< Root > / DataNew”* / UpdateFunc (rtb_SimFuncCall_o1 rtU。DataNew、&rtb_SimFuncCall_o1 &rtb_Sum_p);/ * DataStoreWrite:“< Root > / DSW“下手* / mem。去年= rtb_SimFuncCall_o1;mem。max = rtb_Sum_p; /* Outport: '/Delta' incorporates: * Inport: ' /DataNew' * Sum: ' /Sum' */ rtY.Delta = rtU.DataNew - rtb_DSR_last; }
生成的代码包含数据存储的数据副本读取和写数据存储块,分别。
生成代码的优化
在配置参数对话框中清除重用缓冲区的数据存储读取和数据存储块写参数或MATLAB命令提示符,输入这个命令:
set_param(模型,“OptimizeDataStoreBuffers”,“上”);
构建的模型。
rtwbuild(模型)
# # #开始构建过程模型:rtwdemo_optimizedatastorebuffers # # #成功完成构建过程模型:rtwdemo_optimizedatastorebuffers
查看生成的代码的优化。这段代码是在rtwdemo_optimizedatastorebuffers.c
。
用= fullfile (cgDir,“rtwdemo_optimizedatastorebuffers_ert_rtw”,…“rtwdemo_optimizedatastorebuffers.c”);rtwdemodbtype(用“/ *模型步骤”,/ *初始化模型的1 0);
/ *模型阶跃函数* /空白rtwdemo_optimizedatastorebuffers_step (void) {real_T rtb_DSR_last;real_T tmp;/ * DataStoreRead: < Root > /安全域的* / rtb_DSR_last = mem.last;/ *开关:“< Root > /开关”包含:*不变:“< Root > /常数”* DataStoreRead: < Root > /安全域的*尺寸:< Root > /明确的* /如果(rtU.Clear) {tmp = 0.0;其他}{tmp = mem.max;}/ *开关:“< Root > /开关”* / / *功能性:“< Root > / SimFuncCall”包含:* DataStoreWrite:“< Root > / DSW“下手*尺寸:“< Root > / DataNew”* / UpdateFunc (tmp, rtU。DataNew mem。最后,&mem.max);/ *输出港:“< Root > /δ”包含:*尺寸:“< Root > / DataNew”*金额:< Root > /笔的* /而无。δ= rtU。DataNew - rtb_DSR_last;}
数据存储的数据复制写不是在生成的代码块。包含数据存储的数据复制的代码读取块因为和块后执行数据存储块写。生成的代码包含了变量rtb_DSR_last
和块的输出。因此,块得到的值之和SimFuncCall
计算的时间步长,而不是这些值下一个时间步。如果和块的优先级低于SimFuncCall
,代码生成器可以删除数据存储的数据复制读取块。其他情况下,代码生成器可能不能消除数据副本:
模型金宝app函数内部写入数据存储内存块。
数据存储读或写数据存储块选择元素的数组数据存储内存块。
数据存储内存块有一个自定义存储类。
数据存储读取和数据存储块写发生在同一个街区除非块是一个总线分配块或一个任务块。
关闭模型和清理。
bdclose rtwdemoclean(模型);cd (currentDir)
另请参阅
相关的话题
- 本地块输出和生成代码重用(金宝app仿真软件编码器)