Можно снова использовать буферы для матриц, которые имеют различные размеры и формы. В диалоговом окне Configuration Parameters вы включаете эту оптимизацию путем выбора буферов Reuse различных размеров и размерностей. Эта оптимизация сохраняет RAM и использование ROM и улучшает скорость выполнения кода.
Модель rtwdemo_differentsizereuse содержит сигналы различных размеров и размерностей.
model='rtwdemo_differentsizereuse';
open_system(model);

В диалоговом окне Configuration Parameters, буферах Повторного использования набора различных размеров и параметра размерности к off или в Окне Команды MATLAB, введите:
set_param('rtwdemo_differentsizereuse','DifferentSizesBufferReuse','off');
Создайте папку для сборки и инспекционного процесса.
currentDir = pwd; [~,cgDir] = rtwdemodir();
Выключите комментарии и создайте модель.
set_param('rtwdemo_differentsizereuse','GenerateComments','off'); rtwbuild('rtwdemo_differentsizereuse');
### Starting build procedure for model: rtwdemo_differentsizereuse ### Successful completion of build procedure for model: rtwdemo_differentsizereuse
Просмотрите сгенерированный код без оптимизации. Структура D_Work:

Фрагмент rtwdemo_differentsizereuse.c:
cfile = fullfile(cgDir,'rtwdemo_differentsizereuse_ert_rtw',... 'rtwdemo_differentsizereuse.c'); rtwdemodbtype(cfile,'#include "rtwdemo_differentsizereuse.h"',... 'void rtwdemo_differentsizereuse_initialize(void)',1,0);
#include "rtwdemo_differentsizereuse.h"
D_Work rtDWork;
ExternalInputs rtU;
ExternalOutputs rtY;
RT_MODEL rtM_;
RT_MODEL *const rtM = &rtM_;
static void Downsample(const real_T rtu_u[16384], real_T rty_z[4096]);
static void DeltaX(const real_T rtu_u[4096], real_T rty_z[4032]);
static void DeltaY(const real_T rtu_u[4032], real_T rty_z[3969]);
static void NoninplaceableSS1(void);
static void NoninplaceableSS2(void);
static void NoninplaceableSS3(void);
static void Downsample(const real_T rtu_u[16384], real_T rty_z[4096])
{
int32_T x;
int32_T y;
int32_T tmp;
int32_T tmp_0;
int32_T tmp_1;
for (x = 0; x < 64; x++) {
for (y = 0; y < 64; y++) {
tmp_0 = (1 + y) << 1;
tmp_1 = (1 + x) << 1;
tmp = ((tmp_0 - 2) << 7) + tmp_1;
tmp_0 = ((tmp_0 - 1) << 7) + tmp_1;
rty_z[x + (y << 6)] = (((rtu_u[tmp - 2] + rtu_u[tmp - 1]) + rtu_u[tmp_0 -
2]) + rtu_u[tmp_0 - 1]) / 4.0;
}
}
}
static void NoninplaceableSS1(void)
{
Downsample(rtDWork.ComplextoRealImag_o1, rtDWork.z_p);
Downsample(rtDWork.ComplextoRealImag_o2, rtDWork.z_f);
}
static void DeltaX(const real_T rtu_u[4096], real_T rty_z[4032])
{
int32_T x;
int32_T y;
int32_T tmp;
for (x = 0; x < 63; x++) {
for (y = 0; y < 64; y++) {
tmp = (y << 6) + x;
rty_z[x + 63 * y] = fabs(rtu_u[tmp] - rtu_u[tmp + 1]);
}
}
}
static void NoninplaceableSS2(void)
{
DeltaX(rtDWork.z_p, rtDWork.z_j);
DeltaX(rtDWork.z_f, rtDWork.z_m);
}
static void DeltaY(const real_T rtu_u[4032], real_T rty_z[3969])
{
int32_T x;
int32_T y;
int32_T tmp;
for (x = 0; x < 63; x++) {
for (y = 0; y < 63; y++) {
tmp = 63 * y + x;
rty_z[tmp] = fabs(rtu_u[tmp] - rtu_u[(1 + y) * 63 + x]);
}
}
}
static void NoninplaceableSS3(void)
{
DeltaY(rtDWork.z_j, rtDWork.z_i);
DeltaY(rtDWork.z_m, rtDWork.z);
}
void rtwdemo_differentsizereuse_step(void)
{
int32_T i;
for (i = 0; i < 16384; i++) {
rtDWork.ComplextoRealImag_o1[i] = rtU.ComplexData[i].re;
rtDWork.ComplextoRealImag_o2[i] = rtU.ComplexData[i].im;
}
NoninplaceableSS1();
NoninplaceableSS2();
NoninplaceableSS3();
for (i = 0; i < 3969; i++) {
rtY.Out1[i].re = rtDWork.z_i[i];
rtY.Out1[i].im = rtDWork.z[i];
}
}
Структура D_work содержит восемь глобальных переменных для содержания вводов и выводов Downsample, DeltaX и DeltaY. Эти переменные имеют различные размеры.
В диалоговом окне Configuration Parameters проверьте, что Повторное использование памяти выбрано.
Установите буферы Повторного использования различного параметра размеров и размерностей к on или в Окне Команды MATLAB, введите:
set_param('rtwdemo_differentsizereuse','DifferentSizesBufferReuse','on');
Создайте модель.
set_param('rtwdemo_differentsizereuse','GenerateComments','off'); rtwbuild(model);
### Starting build procedure for model: rtwdemo_differentsizereuse ### Successful completion of build procedure for model: rtwdemo_differentsizereuse
Просмотрите сгенерированный код без оптимизации. Структура D_Work:

Фрагмент rtwdemo_differentsizereuse.c:
cfile = fullfile(cgDir,'rtwdemo_differentsizereuse_ert_rtw',... 'rtwdemo_differentsizereuse.c'); rtwdemodbtype(cfile,'#include "rtwdemo_differentsizereuse.h"',... 'void rtwdemo_differentsizereuse_initialize(void)',1,0);
#include "rtwdemo_differentsizereuse.h"
D_Work rtDWork;
ExternalInputs rtU;
ExternalOutputs rtY;
RT_MODEL rtM_;
RT_MODEL *const rtM = &rtM_;
static void Downsample(const real_T rtu_u[16384], real_T rty_z[4096]);
static void DeltaX(const real_T rtu_u[4096], real_T rty_z[4032]);
static void DeltaY(const real_T rtu_u[4032], real_T rty_z[3969]);
static void NoninplaceableSS1(void);
static void NoninplaceableSS2(void);
static void NoninplaceableSS3(void);
static void Downsample(const real_T rtu_u[16384], real_T rty_z[4096])
{
int32_T x;
int32_T y;
int32_T tmp;
int32_T tmp_0;
int32_T tmp_1;
for (x = 0; x < 64; x++) {
for (y = 0; y < 64; y++) {
tmp_0 = (1 + y) << 1;
tmp_1 = (1 + x) << 1;
tmp = ((tmp_0 - 2) << 7) + tmp_1;
tmp_0 = ((tmp_0 - 1) << 7) + tmp_1;
rty_z[x + (y << 6)] = (((rtu_u[tmp - 2] + rtu_u[tmp - 1]) + rtu_u[tmp_0 -
2]) + rtu_u[tmp_0 - 1]) / 4.0;
}
}
}
static void NoninplaceableSS1(void)
{
Downsample(rtDWork.z_i, rtDWork.z);
Downsample(rtDWork.z_e, &rtDWork.z_i[0]);
}
static void DeltaX(const real_T rtu_u[4096], real_T rty_z[4032])
{
int32_T x;
int32_T y;
int32_T tmp;
for (x = 0; x < 63; x++) {
for (y = 0; y < 64; y++) {
tmp = (y << 6) + x;
rty_z[x + 63 * y] = fabs(rtu_u[tmp] - rtu_u[tmp + 1]);
}
}
}
static void NoninplaceableSS2(void)
{
DeltaX(rtDWork.z, &rtDWork.z_e[0]);
DeltaX(&rtDWork.z_i[0], &rtDWork.z[0]);
}
static void DeltaY(const real_T rtu_u[4032], real_T rty_z[3969])
{
int32_T x;
int32_T y;
int32_T tmp;
for (x = 0; x < 63; x++) {
for (y = 0; y < 63; y++) {
tmp = 63 * y + x;
rty_z[tmp] = fabs(rtu_u[tmp] - rtu_u[(1 + y) * 63 + x]);
}
}
}
static void NoninplaceableSS3(void)
{
DeltaY(&rtDWork.z_e[0], &rtDWork.z_i[0]);
DeltaY(&rtDWork.z[0], &rtDWork.z_e[0]);
}
void rtwdemo_differentsizereuse_step(void)
{
int32_T i;
for (i = 0; i < 16384; i++) {
rtDWork.z_i[i] = rtU.ComplexData[i].re;
rtDWork.z_e[i] = rtU.ComplexData[i].im;
}
NoninplaceableSS1();
NoninplaceableSS2();
NoninplaceableSS3();
for (i = 0; i < 3969; i++) {
rtY.Out1[i].re = rtDWork.z_i[i];
rtY.Out1[i].im = rtDWork.z_e[i];
}
}
Структура D_work теперь содержит три глобальных переменные вместо восьми глобальных переменных для содержания вводов и выводов Downsample, DeltaX и DeltaY. Сгенерированный код использует эти переменные, чтобы содержать по-другому измеренные вводы и выводы.
Закройте отчет генерации кода и модель.
bdclose(model) rtwdemoclean; cd(currentDir)
Если вы используете Reusable пользовательский класс памяти, чтобы задать повторное использование на сигналах, которые имеют различные размеры и формы, необходимо выбрать буферы Повторного использования различного параметра размеров и размерностей. В противном случае модель не создает.
Генератор кода не заменяет буфер на более низкий приоритетный буфер, который имеет меньший размер.
Генератор кода не снова использует буферы, которые имеют различные размеры и символьные размерности.
Буферы повторного использования различных размеров и размерностей