Этот пример показывает, как оптимизировать сгенерированный код путем вставки числовых значений параметров блоков. Параметры блоков включают параметр Gain блока Gain и данные таблицы и наборы точек останова блока n-D Интерполяционной таблицы.
Эта оптимизация определяет, занимают ли параметры числовых блоков глобальную память в сгенерированном коде. Оптимизация может:
Улучшите скорость выполнения.
Уменьшите потребление ОЗУ и ПЗУ.
Откройте пример модели rtwdemo_paraminline
и сконфигурируйте его, чтобы показать сгенерированные имена блоков.
load_system('rtwdemo_paraminline') set_param('rtwdemo_paraminline','HideAutomaticNames','off') open_system('rtwdemo_paraminline')
Модель содержит блоки, которые имеют эти числовые параметры:
Параметры Gain блоков Gain
Параметры Constant value блоков Constant
Наборы табличных данных и точек по оси Х блоков Интерполяционной таблицы n-D
Выходы блочного G2 и выходов блоков в восходящем направлении G2 изменяются только в том случае, если вы настраиваете значения параметров блока во время симуляции или во время выполнения кода. Когда вы обновляете диаграмму модели, эти блоки и сигнальные линии появляются пурпурно в цвете.
Несколько блоков используют Simulink.Parameter
объекты в базовом рабочем пространстве, чтобы задать значения их параметров. Все объекты параметров используют класс памяти Auto
, что означает, что вы можете сконфигурировать сгенерированный код, чтобы инлайновать значения параметров.
Создайте временную папку для процесса сборки и проверки.
currentDir = pwd; [~,cgDir] = rtwdemodir();
Отключите оптимизацию, задав для параметра Параметры Конфигурации > Default Tunable
.
set_param('rtwdemo_paraminline','DefaultParameterBehavior','Tunable')
Сгенерируйте код из модели.
slbuild('rtwdemo_paraminline')
### Starting build procedure for: rtwdemo_paraminline ### Successful completion of build procedure for: rtwdemo_paraminline Build Summary Top model targets built: Model Action Rebuild Reason ==================================================================================================== rtwdemo_paraminline 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 5.9972s
В отчете о генерации кода просмотрите исходный файл rtwdemo_paraminline_data.c
. Код определяет глобальную структуру, которая содержит параметры блоков значения. Каждые параметры блоков в модели, такой как массив интерполяционной таблицы, набор точек по оси Х или усиление, появляются как поле структуры.
cfile = fullfile(... cgDir,'rtwdemo_paraminline_grt_rtw','rtwdemo_paraminline_data.c'); rtwdemodbtype(cfile,'/* Block parameters (default storage) */', '};', 1, 1);
/* Block parameters (default storage) */ P_rtwdemo_paraminline_T rtwdemo_paraminline_P = { /* Variable: MAX_LIFT * Referenced by: '<Root>/Constant' */ 10.0, /* Variable: SLIDER_POS * Referenced by: '<Root>/Constant1' */ 0.0, /* Variable: T1Break * Referenced by: '<Root>/1D Lookup' */ { -5.0, -4.0, -3.0, -2.0, -1.0, 0.0, 1.0, 2.0, 3.0, 4.0, 5.0 }, /* Variable: T1Data * Referenced by: '<Root>/1D Lookup' */ { -1.0, -0.99, -0.98, -0.96, -0.76, 0.0, 0.76, 0.96, 0.98, 0.99, 1.0 }, /* Variable: T2Break * Referenced by: '<Root>/2D Lookup' */ { 1.0, 2.0, 3.0 }, /* Variable: T2Data * Referenced by: '<Root>/2D Lookup' */ { 4.0, 16.0, 10.0, 5.0, 19.0, 18.0, 6.0, 20.0, 23.0 }, /* Expression: 2 * Referenced by: '<Root>/G1' */ 2.0, /* Expression: -2 * Referenced by: '<Root>/G2' */ -2.0, /* Computed Parameter: uDLookup_maxIndex * Referenced by: '<Root>/2D Lookup' */ { 2U, 2U } };
Вы можете настроить поля структуры во время выполнения кода, потому что они занимают глобальную память. Однако на каждом шаге сгенерированного алгоритма код должен вычислить выход каждого блока, включая выходы блочного G2 и вышестоящих блоков. Просмотрите алгоритм в модели step
функция в файл rtwdemo_paraminline.c
.
cfile = fullfile(cgDir,'rtwdemo_paraminline_grt_rtw','rtwdemo_paraminline.c'); rtwdemodbtype(... cfile,'/* Model step function */','/* Model initialize function */',1,0);
/* Model step function */ void rtwdemo_paraminline_step(void) { /* Outport: '<Root>/Out1' incorporates: * Constant: '<Root>/Constant' * Constant: '<Root>/Constant1' * Gain: '<Root>/G1' * Gain: '<Root>/G2' * Inport: '<Root>/In1' * Lookup_n-D: '<Root>/1D Lookup' * Lookup_n-D: '<Root>/2D Lookup' * Sum: '<Root>/Sum' */ rtwdemo_paraminline_Y.Out1 = rtwdemo_paraminline_P.G1_Gain * rtwdemo_paraminline_U.In1 + rtwdemo_paraminline_P.G2_Gain * look2_binlx (rtwdemo_paraminline_P.MAX_LIFT, look1_binlx (rtwdemo_paraminline_P.SLIDER_POS, rtwdemo_paraminline_P.T1Break, rtwdemo_paraminline_P.T1Data, 10U), rtwdemo_paraminline_P.T2Break, rtwdemo_paraminline_P.T2Break, rtwdemo_paraminline_P.T2Data, rtwdemo_paraminline_P.uDLookup_maxIndex, 3U); }
Установите поведение параметра по умолчанию на Inlined
.
set_param('rtwdemo_paraminline','DefaultParameterBehavior','Inlined')
Сгенерируйте код из модели.
slbuild('rtwdemo_paraminline')
### Starting build procedure for: rtwdemo_paraminline ### Successful completion of build procedure for: rtwdemo_paraminline Build Summary Top model targets built: Model Action Rebuild Reason ========================================================================================= rtwdemo_paraminline Code generated and compiled Global variable MAX_LIFT has changed. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 5.3625s
В отчете о генерации кода просмотрите алгоритм в файле rtwdemo_paraminline.c
.
rtwdemodbtype(... cfile,'/* Model step function */','/* Model initialize function */',1,0);
/* Model step function */ void rtwdemo_paraminline_step(void) { /* Outport: '<Root>/Out1' incorporates: * Gain: '<Root>/G1' * Inport: '<Root>/In1' * Sum: '<Root>/Sum' */ rtwdemo_paraminline_Y.Out1 = 2.0 * rtwdemo_paraminline_U.In1 + 150.0; }
Код не выделяет память для параметров блоков или для объектов параметра, которые используют класс памяти Auto
. Вместо этого генератор кода использует значения параметров из модели и из объектов параметров, чтобы вычислить и встроить постоянный выход блочных G2, 150.0
. Генератор также вводит значение параметра Gain блочного G1 Gain, 2.0
.
При оптимизации сгенерированный код оставляет вычислительно дорогой алгоритмический код для блоков, таких как интерполяционные таблицы. Оптимизированный код вычисляет выход блока, только если выход может измениться во время выполнения. Для этой модели могут измениться только выходы блока In1 Inport, блока G1 Gain и блока Sum.
Закройте модель и отчет о генерации кода.
bdclose('rtwdemo_paraminline')
rtwdemoclean;
cd(currentDir)
Когда вы устанавливаете поведение параметра Default равным Inlined
, можно сохранить настраиваемость параметров блоков путем создания Simulink.Parameter
объекты для отдельных параметров. Можно сконфигурировать каждый объект, чтобы он появлялся в коде как настраиваемое поле структуры глобального параметра или как индивидуум глобальная переменная. Можно изменить значения параметров во время выполнения кода и сопроводить сгенерированный код собственным рукописным кодом. Для получения дополнительной информации смотрите Создание Настраиваемого Параметра Калибровки в Сгенерированном Коде.
Вы можете выбрать опцию генерации кода Inline invariant signals (которая также помещает постоянные значения в сгенерированный код), только когда вы устанавливаете поведение параметра Default равным Inlined
. См. «Входные инвариантные сигналы».
Поведение параметра по умолчанию