Чтобы настроить ваше приложение и выбрать компромиссы для скорости выполнения и использования памяти, можно выбрать оптимизацию ссылки глобальной переменной для сгенерированного кода.
На диалоговом окне Configuration Parameters, в Optimize global data access выпадающий список, три опции параметра управляют оптимизацией использования глобальной переменной.
None
. Используйте оптимизацию по умолчанию. Этот выбор работает хорошо на большинство моделей. Генератор кода балансирует использование локальных и глобальных переменных. Это генерирует код, который балансирует RAM и скорость потребления и выполнения ROM.
Use global to hold temporary results
. Многократное использование глобальных переменных повышает эффективность кода и удобочитаемость. Эти глобальные переменные повторных использований оптимизации, который приводит к генератору кода, задающему меньше переменных. Это уменьшает RAM и потребление ROM и копии данных.
Minimize global data access
. Используя локальные переменные, чтобы кэшировать глобальные данные уменьшает потребление ROM путем сокращения размера кода. Эта оптимизация улучшает скорость выполнения, потому что код использует меньше инструкций для локальных ссылок на переменных, чем для ссылок глобальной переменной.
Минимизация использования глобальных переменных при помощи локальных переменных взаимодействует с управлением использованием стека. Например, сложите размер, может определить количество локальных и глобальных переменных, которые генератор кода может выделить в сгенерированном коде. Для получения дополнительной информации смотрите, Настраивают Выделение Стекового пространства.
Генератор кода использует глобальные и локальные переменные, когда вы выбираете None
по сравнению с тем, когда вы выбираете Use global to hold temporary
results
.
Модель в качестве примера
В модели matlab:rtwdemo_optimize_global_ebf, блок Assignment присваивает значения, прибывающие от блоков Инпорта и Константа до выходного сигнала. Выходной сигнал питается в блок Gain.
model = 'rtwdemo_optimize_global_ebf'; load_system('rtwdemo_optimize_global_ebf')
Сгенерируйте код без оптимизации
В диалоговом окне Configuration Parameters проверьте, что параметр Повторного использования памяти выбран.
В диалоговом окне Configuration Parameters, для Оптимизировать параметра доступа к глобальным данным, выбирают None
или введите следующую команду в командное окно MATLAB:
set_param('rtwdemo_optimize_global_ebf','GlobalVariableUsage','None');
Во временной папке вашей системы создайте папку для сборки и инспекционного процесса:
currentDir = pwd; [~,cgDir] = rtwdemodir();
Создайте модель.
slbuild(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 9.635s
Просмотрите сгенерированный код без оптимизации. Вот фрагмент 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: '<Root>/Assignment' incorporates: * Constant: '<Root>/Constant' */ for (i = 0; i < 5; i++) { rtb_Assignment[i] = rtCP_Constant_Value[i]; } /* End of SignalConversion generated from: '<Root>/Assignment' */ /* Assignment: '<Root>/Assignment' incorporates: * Inport: '<Root>/In1' */ rtb_Assignment[1] = rtU.In1; /* Outport: '<Root>/Out1' incorporates: * Gain: '<Root>/Gain' */ for (i = 0; i < 5; i++) { rtY.Out1[i] = 2.0 * rtb_Assignment[i]; } /* End of Outport: '<Root>/Out1' */ }
Код присваивает значения локальному векторному rtb_Assignment
. Последний оператор копирует значения в локальном векторном rtb_Assignment
к глобальному векторному rtY.Out1
. Меньше ссылок глобальной переменной приводит к улучшенной скорости выполнения. Код использует больше инструкций для ссылок глобальной переменной, чем для локальных ссылок на переменных.
В Статическом Метрическом Отчете Кода исследуйте раздел Global Variables.
В окне Code Generation Report выберите Static Code Metrics Report.
Прокрутите вниз к Global Variables
раздел.
Выберите [+] знак перед каждой переменной, чтобы расширить его.
Общее количество чтений и записей для глобальных переменных равняется 2.
Сгенерируйте код с оптимизацией
В диалоговом окне Configuration Parameters, для Оптимизировать параметра доступа к глобальным данным, выбирают Use global to hold temporary results
, или введите следующую команду в командное окно MATLAB:
set_param('rtwdemo_optimize_global_ebf',... 'GlobalVariableUsage','Use global to hold temporary results');
Создайте модель.
slbuild(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 7.435s
Просмотрите сгенерированный код с оптимизацией. Вот фрагмент 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: '<Root>/Assignment' incorporates: * Assignment: '<Root>/Assignment' * Constant: '<Root>/Constant' */ for (i = 0; i < 5; i++) { rtY.Out1[i] = rtCP_Constant_Value[i]; } /* End of SignalConversion generated from: '<Root>/Assignment' */ /* Assignment: '<Root>/Assignment' incorporates: * Inport: '<Root>/In1' */ rtY.Out1[1] = rtU.In1; /* Outport: '<Root>/Out1' incorporates: * Assignment: '<Root>/Assignment' * Gain: '<Root>/Gain' */ for (i = 0; i < 5; i++) { rtY.Out1[i] *= 2.0; } /* End of Outport: '<Root>/Out1' */ }
Код присваивает значения глобальному векторному rtY.Out1
не используя локальную переменную. Это присвоение улучшает ROM и потребление RAM и уменьшает копии данных. Код помещает значение в целевую переменную для каждого присвоения вместо того, чтобы копировать значение в конце. В Статическом Метрическом Отчете Кода исследуйте раздел Global Variables.
В результате использования глобальных переменных, чтобы содержать локальные результаты, общее количество чтений и записей для глобальных переменных увеличилось от 2 до 5. Эта оптимизация уменьшает копии данных путем многократного использования глобальных переменных.
Закройте отчет генерации кода.
rtwdemoclean; cd(currentDir)
Сгенерируйте оптимизированный код, который читает из и пишет в глобальные переменные менее часто.
Модель в качестве примера
В модели matlab:rtwdemo_optimize_global, пять сигналов питаются в Многопортовый блок switch.
model = 'rtwdemo_optimize_global'; load_system('rtwdemo_optimize_global')
Сгенерируйте код без оптимизации
В диалоговом окне Configuration Parameters проверьте, что параметр Повторного использования памяти выбран.
В диалоговом окне Configuration Parameters, для Оптимизировать параметра доступа к глобальным данным, выбирают None
или введите следующую команду в командное окно MATLAB:
set_param('rtwdemo_optimize_global','GlobalVariableUsage','None');
Во временной папке вашей системы создайте папку для сборки и инспекционного процесса.
currentDir = pwd; [~,cgDir] = rtwdemodir();
Создайте модель.
slbuild(model);
### Starting build procedure for: rtwdemo_optimize_global ### Successful completion of build procedure for: rtwdemo_optimize_global Build Summary Top model targets built: Model Action Rebuild Reason ======================================================================================================== rtwdemo_optimize_global 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 8.9563s
Просмотрите сгенерированный код без оптимизации. Вот фрагмент rtwdemo_optimize_global.c
.
cfile = fullfile(cgDir,'rtwdemo_optimize_global_ert_rtw',... 'rtwdemo_optimize_global.c'); rtwdemodbtype(cfile,'/* Model step','/* Model initialize',1, 0);
/* Model step function */ void rtwdemo_optimize_global_step(void) { /* MultiPortSwitch: '<Root>/Multiport Switch' incorporates: * Inport: '<Root>/In1' */ switch ((int32_T)rtU.In1) { case 1: /* Outport: '<Root>/Out1' incorporates: * Constant: '<Root>/Constant' */ rtY.Out1 = 1.0; break; case 2: /* Outport: '<Root>/Out1' incorporates: * Constant: '<Root>/Constant1' */ rtY.Out1 = 2.0; break; case 3: /* Outport: '<Root>/Out1' incorporates: * Constant: '<Root>/Constant2' */ rtY.Out1 = 3.0; break; default: /* Outport: '<Root>/Out1' incorporates: * Constant: '<Root>/Constant3' */ rtY.Out1 = 4.0; break; } /* End of MultiPortSwitch: '<Root>/Multiport Switch' */ }
В Статическом Метрическом Отчете Кода исследуйте Global Variables
раздел.
В окне Code Generation Report выберите Static Code Metrics Report.
Прокрутите вниз к Global Variables
раздел.
Выберите [+] знак перед каждой переменной, чтобы расширить его.
Общее количество чтений и записей для глобальных переменных равняется 5.
Включите оптимизацию и сгенерируйте код
В диалоговом окне Configuration Parameters, для Оптимизировать параметра доступа к глобальным данным, выбирают Minimize global data access
или введите следующую команду в командное окно MATLAB:
set_param('rtwdemo_optimize_global',... 'GlobalVariableUsage','Minimize global data access');
Создайте модель.
slbuild(model);
### Starting build procedure for: rtwdemo_optimize_global ### Successful completion of build procedure for: rtwdemo_optimize_global Build Summary Top model targets built: Model Action Rebuild Reason ======================================================================================= rtwdemo_optimize_global 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 7.2085s
Просмотрите сгенерированный код с оптимизацией. Вот фрагмент rtwdemo_optimize_global.c
.
cfile = fullfile(cgDir,'rtwdemo_optimize_global_ert_rtw',... 'rtwdemo_optimize_global.c'); rtwdemodbtype(cfile,'/* Model step','/* Model initialize',1, 0);
/* Model step function */ void rtwdemo_optimize_global_step(void) { real_T tmp_Out1; /* MultiPortSwitch: '<Root>/Multiport Switch' incorporates: * Inport: '<Root>/In1' */ switch ((int32_T)rtU.In1) { case 1: /* Outport: '<Root>/Out1' incorporates: * Constant: '<Root>/Constant' */ tmp_Out1 = 1.0; break; case 2: /* Outport: '<Root>/Out1' incorporates: * Constant: '<Root>/Constant1' */ tmp_Out1 = 2.0; break; case 3: /* Outport: '<Root>/Out1' incorporates: * Constant: '<Root>/Constant2' */ tmp_Out1 = 3.0; break; default: /* Outport: '<Root>/Out1' incorporates: * Constant: '<Root>/Constant3' */ tmp_Out1 = 4.0; break; } /* End of MultiPortSwitch: '<Root>/Multiport Switch' */ /* Outport: '<Root>/Out1' */ rtY.Out1 = tmp_Out1; }
В rtwdemo_optimize_global.c
, код присваивает постоянное значение локальной переменной tmp_Out1
в каждом операторе выбора. Последний оператор в коде копирует значение tmp_Out1
к глобальной переменной rtY.Out1
. Меньше ссылок глобальной переменной приводит к меньшему количеству инструкций и улучшенной скорости выполнения.
В Статическом Метрическом Отчете Кода исследуйте Global Variables
раздел. В результате минимизации доступов к глобальным данным общее количество чтений и записей для глобальных переменных уменьшилось с 5 до 2.
Закройте отчет генерации кода.
rtwdemoclean; cd(currentDir)
Оптимизируйте доступ к глобальным данным