Этот пример показывает, как сконфигурировать атомарную подсистему для генерации кода. Чтобы указать, что код подсистемы выполняется как атомарный модуль, выберите Treat как атомарный модульный параметр на диалоговом окне параметров блоков. Этот параметр включает Функции Упаковочный параметр вкладки Code Generation. Функция Упаковочный параметр имеет эти четыре настройки:
Встроенный:
Встройте код подсистемы
Nonreusable function
: Функция с вводом-выводом, переданным как глобальные данные
Reusable function
: Функция с вводом-выводом, переданным как аргументы функции
'auto':
Позвольте Simulink Coder оптимизировать на основе контекста
Настройки Reusable function
и Auto
разрешают генератору кода снова использовать код подсистемы. Настройки Reusable function
и Nonreusable function
включают опции Имени функции, Имя функции и параметры опций Имени файла.
Если у вас есть лицензия Embedded Coder, можно сконфигурировать подсистему одноразового использования, чтобы принять аргументы.
Модель rtwdemo_ssreuse
содержит две идентичных подсистемы, SS1
и SS2
. Для этих подсистем Функция упаковочный параметр устанавливается на Reusable
function
, и параметром Имени функции является myfun
. Подсистемы параметризованы замаскированные подсистемы. Чтобы видеть содержимое подсистем маскированных, щелкните правой кнопкой по блокам подсистемы и выберите Mask> Look Under Mask.
model = 'rtwdemo_ssreuse';
open_system(model);
Создайте временную папку для сборки и инспекционного процесса.
currentDir=pwd; [~,cgDir]=rtwdemodir();
Создайте модель.
rtwbuild(model)
### Starting build procedure for model: rtwdemo_ssreuse ### Successful completion of build procedure for model: rtwdemo_ssreuse
cfile=fullfile(cgDir, 'rtwdemo_ssreuse_grt_rtw', 'rtwdemo_ssreuse.c'); rtwdemodbtype(cfile, '/* Model step', '/* Model initialize', 1, 0);
/* Model step function */ void rtwdemo_ssreuse_step(void) { /* Outputs for Atomic SubSystem: '<Root>/SS1' */ /* Inport: '<Root>/In1' incorporates: * Inport: '<Root>/In2' */ myfun(rtwdemo_ssreuse_U.In1, rtwdemo_ssreuse_U.In2, &rtwdemo_ssreuse_B.SS1, rtwdemo_ssreuse_P.T1Data, rtwdemo_ssreuse_P.T1Break); /* End of Outputs for SubSystem: '<Root>/SS1' */ /* Outport: '<Root>/Out1' */ rtwdemo_ssreuse_Y.Out1 = rtwdemo_ssreuse_B.SS1.LookupTable; /* Outputs for Atomic SubSystem: '<Root>/SS2' */ /* Inport: '<Root>/In1' incorporates: * Inport: '<Root>/In2' */ myfun(rtwdemo_ssreuse_U.In1, rtwdemo_ssreuse_U.In2, &rtwdemo_ssreuse_B.SS2, rtwdemo_ssreuse_P.T2Data, rtwdemo_ssreuse_P.T2Break); /* End of Outputs for SubSystem: '<Root>/SS2' */ /* Outport: '<Root>/Out2' */ rtwdemo_ssreuse_Y.Out2 = rtwdemo_ssreuse_B.SS2.LookupTable; }
В образцовой ступенчатой функции существует два вызова допускающей повторное использование функции, myfun
. Параметры маски, T1Break
, T1Data
, T2Break
, и T2Data
, являются аргументами функции.
Измените Функцию Упаковочный параметр на Inline
.
set_param('rtwdemo_ssreuse/SS1','RTWSystemCode','Inline') set_param('rtwdemo_ssreuse/SS2','RTWSystemCode','Inline')
Создайте модель.
rtwbuild(model)
### Starting build procedure for model: rtwdemo_ssreuse ### Successful completion of build procedure for model: rtwdemo_ssreuse
cfile=fullfile(cgDir, 'rtwdemo_ssreuse_grt_rtw', 'rtwdemo_ssreuse.c'); rtwdemodbtype(cfile, '/* Model step', '/* Model initialize', 1, 0);
/* Model step function */ void rtwdemo_ssreuse_step(void) { real_T Out1_tmp; /* Outputs for Atomic SubSystem: '<Root>/SS2' */ /* Outputs for Atomic SubSystem: '<Root>/SS1' */ /* Sum: '<S1>/Sum' incorporates: * Inport: '<Root>/In1' * Inport: '<Root>/In2' * Sum: '<S2>/Sum' */ Out1_tmp = rtwdemo_ssreuse_U.In1 + rtwdemo_ssreuse_U.In2; /* End of Outputs for SubSystem: '<Root>/SS2' */ /* Outport: '<Root>/Out1' incorporates: * Lookup_n-D: '<S1>/Lookup Table' * Sum: '<S1>/Sum' */ rtwdemo_ssreuse_Y.Out1 = look1_binlx(Out1_tmp, rtwdemo_ssreuse_P.T1Break, rtwdemo_ssreuse_P.T1Data, 10U); /* End of Outputs for SubSystem: '<Root>/SS1' */ /* Outputs for Atomic SubSystem: '<Root>/SS2' */ /* Outport: '<Root>/Out2' incorporates: * Lookup_n-D: '<S2>/Lookup Table' */ rtwdemo_ssreuse_Y.Out2 = look1_binlx(Out1_tmp, rtwdemo_ssreuse_P.T2Break, rtwdemo_ssreuse_P.T2Data, 10U); /* End of Outputs for SubSystem: '<Root>/SS2' */ }
В образцовой ступенчатой функции код подсистемы встроен.
Измените Функцию Упаковочный параметр на Nonreusable function
. Для SS2
, изменение параметр Имени функции к myfun2
.
set_param('rtwdemo_ssreuse/SS1','RTWSystemCode','Nonreusable function') set_param('rtwdemo_ssreuse/SS2','RTWSystemCode','Nonreusable function') set_param('rtwdemo_ssreuse/SS2','RTWFcnName','myfun2')
Создайте модель.
rtwbuild(model)
### Starting build procedure for model: rtwdemo_ssreuse ### Successful completion of build procedure for model: rtwdemo_ssreuse
cfile=fullfile(cgDir, 'rtwdemo_ssreuse_grt_rtw', 'rtwdemo_ssreuse.c'); rtwdemodbtype(cfile, '/* Model step', '/* Model initialize', 1, 0);
/* Model step function */ void rtwdemo_ssreuse_step(void) { /* Outputs for Atomic SubSystem: '<Root>/SS1' */ myfun(); /* End of Outputs for SubSystem: '<Root>/SS1' */ /* Outputs for Atomic SubSystem: '<Root>/SS2' */ myfun2(); /* End of Outputs for SubSystem: '<Root>/SS2' */ }
Образцовая ступенчатая функция содержит вызовы функций myfun
и myfun2
. Эти функции имеют пустой пустотой интерфейс.
Измените Функцию Упаковочный параметр на Auto
.
set_param('rtwdemo_ssreuse/SS1','RTWSystemCode','Auto') set_param('rtwdemo_ssreuse/SS2','RTWSystemCode','Auto')
Для установки auto
Simulink Coder выбирает оптимальный формат. Для этой модели оптимальный формат является допускающей повторное использование функцией.
Закройте модель и вымойтесь.
bdclose(model) rtwdemoclean; cd(currentDir)