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

В этом примере показано, как сконфигурировать атомарную подсистему для генерации повторно используемого кода. Чтобы указать, что код, сгенерированный для подсистемы, выполняется, как, атомарный модуль, на диалоговом окне Block Parameters, выбирает Treat как атомарный модульный параметр. Тот параметр включает Функции Упаковочный параметр на вкладке Code Generation. Функция Упаковочный параметр имеет эти четыре настройки:

  • Inline: Встройте код подсистемы

  • 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);

Сгенерируйте и смотрите код

Создайте временную папку для сборки и инспекционного процесса. Откройте приложение Embedded Coder или Simulink Coder. Затем сгенерируйте и смотрите код.

currentDir=pwd;
[~,cgDir]=rtwdemodir();
rtwbuild(model)
### Starting build procedure for: rtwdemo_ssreuse
### Successful completion of build procedure for: 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: rtwdemo_ssreuse
### Successful completion of build procedure for: 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: rtwdemo_ssreuse
### Successful completion of build procedure for: 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)