В этом примере показано, как сконфигурировать атомарную подсистему для генерации повторно используемого кода. Чтобы указать, что код, сгенерированный для подсистемы, выполняется как атомарный модуль, в диалоговом окне Параметры Блоков выберите параметр Treat as atomic unit. Этот параметр включает параметр Function Packaging на вкладке Генерация Кода. Параметр Function Packaging имеет следующие четыре настройки:
Inline
: Введите код подсистемы
Nonreusable function
: Функция с ввод-вывод, переданная как глобальные данные
Reusable function
: Функция с вводом-выводом передается как аргументы функции
Auto
: Позвольте Simulink Coder оптимизировать на основе контекста
The Reusable function
и Auto
настройки позволяют генератору кода повторно использовать код подсистемы. The Reusable function
и Nonreusable function
включить параметры Function name, Function name и File name.
Если у вас есть лицензия Embedded Coder, можно настроить неиспользуемую подсистему, чтобы принимать аргументы.
The rtwdemo_ssreuse
модель содержит две одинаковые подсистемы, SS1
и SS2
. Для этих подсистем параметр Function packaging устанавливается в Reusable
function
, и параметр имя функции myfun
. Подсистемы являются параметризованными маскированными подсистемами. Чтобы увидеть содержимое маскированных подсистем, щелкните правой кнопкой мыши блоки подсистемы и выберите «Маска» > «Смотреть под маской».
model = 'rtwdemo_ssreuse';
open_system(model);
Создайте временную папку для процесса сборки и проверки. Откройте приложение Simulink Coder или Embedded Coder. Затем сгенерируйте и проверьте код.
currentDir=pwd; [~,cgDir]=rtwdemodir(); slbuild(model)
### Starting build procedure for: rtwdemo_ssreuse ### Successful completion of build procedure for: rtwdemo_ssreuse Build Summary Top model targets built: Model Action Rebuild Reason ================================================================================================ rtwdemo_ssreuse 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 7.9372s
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_P.T1Data, rtwdemo_ssreuse_P.T1Break, &rtwdemo_ssreuse_B.SS1); /* 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_P.T2Data, rtwdemo_ssreuse_P.T2Break, &rtwdemo_ssreuse_B.SS2); /* End of Outputs for SubSystem: '<Root>/SS2' */ /* Outport: '<Root>/Out2' */ rtwdemo_ssreuse_Y.Out2 = rtwdemo_ssreuse_B.SS2.LookupTable; }
В функции шага модели существует два вызова переиспользуемой функции myfun
. Параметры маски, T1Break
, T1Data
, T2Break
, и T2Data
, являются аргументами функции.
Измените параметр Function Packaging на Inline
.
set_param('rtwdemo_ssreuse/SS1','RTWSystemCode','Inline') set_param('rtwdemo_ssreuse/SS2','RTWSystemCode','Inline')
Сгенерируйте и проверьте код.
slbuild(model)
### Starting build procedure for: rtwdemo_ssreuse ### Successful completion of build procedure for: rtwdemo_ssreuse Build Summary Top model targets built: Model Action Rebuild Reason =============================================================================== rtwdemo_ssreuse 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 6.3775s
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' */ }
В функции шага модели вставляется код подсистемы.
Измените параметр Function Packaging на 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')
Сгенерируйте и проверьте код.
slbuild(model)
### Starting build procedure for: rtwdemo_ssreuse ### Successful completion of build procedure for: rtwdemo_ssreuse Build Summary Top model targets built: Model Action Rebuild Reason =============================================================================== rtwdemo_ssreuse 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 6.3979s
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
. Эти функции имеют пустой интерфейс.
Измените параметр Function Packaging на Auto
.
set_param('rtwdemo_ssreuse/SS1','RTWSystemCode','Auto') set_param('rtwdemo_ssreuse/SS2','RTWSystemCode','Auto')
Для auto
Simulink Coder выбирает оптимальный формат. Для этой модели оптимальным форматом является переиспользуемая функция.
Закройте модель и очистите.
bdclose(model) rtwdemoclean; cd(currentDir)