Функциональное повторное использование в сгенерированном коде

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