В этом примере показано, как сконфигурировать атомарную подсистему для генерации повторно используемого кода. Чтобы указать, что код, сгенерированный для подсистемы, выполняется как атомарный модуль, в диалоговом окне Параметры Блоков выберите параметр 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)