В этом примере показано, как оптимизировать сгенерированный код путем встраивания числовых значений параметров блоков. Параметры блоков включают параметр Усиления блока Gain и табличных данных и устанавливают точки останова наборы n-D блока Lookup Table.
Эта оптимизация определяет, занимают ли числовые параметры блоков глобальную память в сгенерированном коде. Оптимизация может:
Улучшите скорость выполнения.
Уменьшайте потребление ROM и RAM.
Откройте модель rtwdemo_paraminline
в качестве примера и сконфигурируйте его, чтобы показать сгенерированные имена блоков.
load_system('rtwdemo_paraminline') set_param('rtwdemo_paraminline','HideAutomaticNames','off') open_system('rtwdemo_paraminline')
Модель содержит блоки, которые имеют эти числовые параметры:
Параметры Усиления блоков Усиления
Параметры Постоянного значения блоков Константа
Табличные данные и наборы точки останова n-D блоков Интерполяционной таблицы
Выход блока G2 и выходные параметры блоков в восходящем направлении G2, изменяются, только если вы настраиваете значения параметров блоков в процессе моделирования или во время выполнения кода. Когда вы обновляете диаграмму модели, эти блоки и сигнальные линии кажутся пурпурными в цвете.
Несколько блоков используют Simulink.Parameter
объекты в базовом рабочем пространстве, чтобы установить значения их параметров. Объекты параметра все использование класс памяти Auto
, что означает, что можно сконфигурировать сгенерированный код, чтобы встроить значения параметров.
Создайте временную папку для сборки и инспекционного процесса.
currentDir = pwd; [~,cgDir] = rtwdemodir();
Отключите оптимизацию поведением параметра установки Configuration Parameters> Default к Tunable
.
set_param('rtwdemo_paraminline','DefaultParameterBehavior','Tunable')
Сгенерируйте код из модели.
rtwbuild('rtwdemo_paraminline')
### Starting build procedure for model: rtwdemo_paraminline ### Successful completion of build procedure for model: rtwdemo_paraminline
В отчете генерации кода просмотрите исходный файл 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')
Сгенерируйте код из модели.
rtwbuild('rtwdemo_paraminline')
### Starting build procedure for model: rtwdemo_paraminline ### Successful completion of build procedure for model: rtwdemo_paraminline
В отчете генерации кода просмотрите алгоритм в файле 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
. Генератор также встраивает значение параметра Усиления блока G1 Gain, 2.0
.
С оптимизацией сгенерированный код не учитывает в вычислительном отношении дорогой алгоритмический код для блоков, таких как интерполяционные таблицы. Оптимизированный код вычисляет выход блока, только если выход может измениться во время выполнения. Для этой модели только могут измениться выходные параметры блока In1 Inport, блока G1 Gain и блока Sum.
Закройте модель и отчет генерации кода.
bdclose('rtwdemo_paraminline')
rtwdemoclean;
cd(currentDir)
Когда вы устанавливаете поведение параметра По умолчанию на Inlined
, можно сохранить приспособляемость параметров блоков путем создания Simulink.Parameter
объекты для отдельных параметров. Можно сконфигурировать каждый объект появиться в коде как настраиваемое поле глобальной структуры параметра или как отдельная глобальная переменная. Можно изменить значения параметров во время выполнения кода и соединить интерфейсом со сгенерированным кодом с собственным рукописным кодом. Для получения дополнительной информации смотрите, Создают Настраиваемый Калибровочный Параметр в Сгенерированном коде (Simulink Coder).
Можно выбрать Встроенную инвариантную опцию генерации кода сигналов (который также помещает постоянные значения в сгенерированный код), только, когда вы устанавливаете поведение параметра По умолчанию на Inlined
. Смотрите встроенные инвариантные сигналы (Simulink Coder).
Поведение параметра по умолчанию