В этом примере показано, как настроить атомарную подсистему для создания многократно используемого кода. Чтобы указать, что код, созданный для подсистемы, выполняется как атомарная единица, в диалоговом окне Параметры блока (Block Parameters) выберите параметр Обработать как атомарную единицу (Treat as atomic unit). Этот параметр активирует параметр Function Packaging на закладке Code Generation. Параметр Function Packaging имеет следующие четыре настройки:
Inline: Встроить код подсистемы
Nonreusable functionФункция с вводом-выводом, передаваемая в виде глобальных данных
Reusable function: Функция с вводом-выводом, переданная в качестве аргументов функции
Auto: Позвольте Simulink Coder оптимизировать на основе контекста
Reusable function и Auto настройки позволяют генератору кода повторно использовать код подсистемы. Reusable function и Nonreusable function настройки включают параметры «Имя функции», «Имя функции» и «Имя файла».
При наличии лицензии Embedded Coder можно настроить неиспользуемую подсистему для принятия аргументов.
rtwdemo_ssreuse модель содержит две идентичные подсистемы, SS1 и SS2. Для этих подсистем параметр Function packaging имеет значение Reusable function, а параметр Function name имеет значение 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 , измените параметр Function name на 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. Эти функции имеют интерфейс void-void.
Измените параметр 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)