Можно уменьшить количество кода, создаваемого генератором кода для идентичных атомных подсистем, настроив подсистемы как многократно используемые функции, передающие данные в качестве аргументов (например, rtB_* для блочного ввода и вывода, rtDW_* для непрерывных состояний, и rtP_* для параметров). По умолчанию генератор кода создает код подсистемы, который взаимодействует с другим кодом посредством совместного доступа к глобальным структурам данных, которые находятся в общей памяти. Передавая данные в качестве аргументов, код может быть введен повторно. Каждый экземпляр кода сохраняет свои уникальные данные.
Чтобы настроить подсистемы для повторного использования и повторного входа, настройте параметры маски и блоков идентичных подсистем одинаково. Генератор кода выполняет контрольную сумму для определения идентичности подсистем и возможности повторного использования кода. Если код повторно используется, генератор кода создает один экземпляр повторно используемого кода функции повторного ввода.
Для конфигурирования параметров блока подсистемы:
Если подсистема является виртуальной, выберите параметр блока Treat as atomic unit, чтобы включить параметры упаковки функций.
Установите для параметра блока Function packaging значение Reusable function. Генератор кода создает отдельную функцию с аргументами для каждой подсистемы. Выбор Reusable function также включает дополнительные параметры, которые можно использовать для управления именами функций и файлов, создаваемых генератором кода для кода подсистемы.
Выберите значение параметра блока Параметры имени функции. Чтобы создать повторно используемый, повторно вводимый код, укажите один и тот же параметр для идентичных подсистем.
Чтобы дать генератору кода определить имя функции, выберите Auto.
Чтобы использовать имя подсистемы или, для блока библиотеки, имя блока библиотеки, выберите Use subsystem name.
Чтобы отобразить параметр блока Имя функции и ввести уникальное допустимое имя функции C/C + +, выберитеUser specified.
Если в иерархии ссылок модели существует несколько экземпляров идентичной подсистемы, выберите Auto.
При использовании Embedded Coder ® можно использовать элементы управления форматом идентификатора. См. раздел Управление форматом идентификатора (встроенный кодер).
Задать параметры имени файла. Чтобы создать повторно используемый, повторно вводимый код, укажите один и тот же параметр для идентичных подсистем.
Чтобы дать генератору кода определить имя файла, выберите Auto.
Для использования имени подсистемы или для блока библиотеки выберите имя блока библиотеки. Use subsystem name.
Чтобы использовать имя функции, как указано параметром блока Параметры имени функции выберите Use function name.
Отображение параметра блока Имя файла (без расширения) и ввод имени файла, исключая расширение (например, .c или .cpp) выберите User specified.
Другие соображения:
Если в иерархии ссылок модели существует несколько экземпляров идентичной подсистемы, выберите Auto.
Если генератор кода не генерирует отдельный файл для подсистемы, код функции помещается в файл, созданный из родительской системы подсистемы. Если родительским элементом является сама модель, генератор кода помещает код функции в или model.c.model.cpp
Если созданный код находится в системе управления версиями, укажите значение, отличное от Auto. Эта спецификация предотвращает изменение имени созданного файла при изменении и перестроении модели.
При выборе Use subsystem name, генератор кода управляет именем файла подсистемы, если модель содержит блоки модели или если для модели создается цель ссылки на модель. В этих ситуациях генератор кода использует имя файла modelsubsystem.c.
Если подсистема A имеет параметр маски b и K и подсистема B имеет параметры маски c и K, повторное использование кода невозможно. Генератор кода создает отдельные функции для подсистем A и B. Если параметры блока для подсистем A и B устанавливаются по-разному, повторное использование кода невозможно.
В этом примере показано, как настроить атомарную подсистему для создания многократно используемого кода. Чтобы указать, что код, созданный для подсистемы, выполняется как атомарная единица, в диалоговом окне Параметры блока (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)
Генератор кода использует контрольную сумму для определения идентичности и возможности повторного использования подсистем. Код подсистемы не используется повторно, если:
В блоках и объектах данных для задания размеров используются обозначения.
Порт имеет различное время выборки, типы данных, сложность, состояние кадра или размеры в подсистемах.
Выходной сигнал подсистемы помечается как глобальный сигнал.
Подсистемы содержат идентичные блоки с различными именами или настройками параметров.
Выход подсистемы соединен с блоком Merge, а выход блока Merge сконфигурирован с пользовательским классом хранения, который реализован в коде C в виде неадресуемой памяти (например, BitField).
Вход подсистемы не является скалярным и конфигурируется с пользовательским классом хранения, который реализуется в коде C в качестве неадресуемой памяти.
Маскированная подсистема имеет нескалярный параметр и сконфигурирована с пользовательским классом хранения, который реализован в коде C в качестве неадресуемой памяти.
Подсистема вызова функций использует параметры маски, если для параметра конфигурации модели Поведение параметра по умолчанию (Default parameter behavior) задано значение Tunable. Для повторного использования маскированной подсистемы вызова функций поместите ее в новую атомарную подсистему без маски. Затем переместите блок триггера из маскированной подсистемы в атомарную подсистему.
Блок в подсистеме использует частично настраиваемое выражение. Некоторые частично настраиваемые выражения отключают повторное использование кода.
Частично настраиваемые выражения - это выражения, содержащие одну или несколько настраиваемых переменных, а также выражения, которые не поддаются настройке. Например, предположим, что создается настраиваемая переменная K со значением 15.23 и настраиваемой переменной P со значением [5;7;9]. Выражение K+P' является частично настраиваемым выражением, поскольку выражение P' не может быть настроен. Дополнительные сведения об настраиваемых ограничениях выражения см. в разделе Настраиваемые ограничения выражения.
Для подсистем, содержащих S-функциональные блоки, которые могут использоваться повторно, эти блоки должны соответствовать требованиям, перечисленным в разделе S-Функции для повторного использования кода.
При выборе Reusable functionи генератор кода определяет, что вы не можете повторно использовать код для подсистемы, он создает отдельную функцию, которая не используется повторно. Отчет о создании кода может показать, что отдельная функция может использоваться повторно, даже если ее использует только одна подсистема. Если вы предпочитаете, чтобы в таких случаях код встроенной подсистемы генератора кода (а не развертывался в качестве функций), установите для функции Function packaging значение Auto.
Если в многоразовой подсистеме используется общее локальное хранилище данных и для элементов данных модели настраивается сопоставление по умолчанию, оставьте для категории Общие локальные хранилища данных сопоставление класса хранения по умолчанию равным Default.
Использование этих блоков в подсистеме может предотвратить повторное использование кода подсистемы:
Блоки области (с включенным протоколированием данных)
S-Функциональные блоки, которые не удовлетворяют определенным критериям (см. S-Функции для повторного использования кода)
В блоки файлов (с включенным протоколированием данных)
В блоки рабочей области (с включенным протоколированием данных)
Для повторно используемых библиотечных подсистем (подсистем, общих для ссылочных моделей) генератор кода использует контрольную сумму для определения идентичности подсистем. Генератор кода помещает повторно используемый код библиотечной подсистемы в папку общих утилит, а повторно используемый код не зависит от созданного кода модели верхнего уровня или ссылочной модели. Например, повторно используемый код библиотечной подсистемы не включает или model.h.model_types.h
Повторно используемый код, который генератор кода помещает в папку общих утилит и зависит от кода модели, не компилируется. Если генератор кода определяет, что повторно используемый код библиотечной подсистемы зависит от кода модели, повторно используемый код подсистемы не помещается в папку общих утилит. Генератор кода создает код, который зависит от кода модели, когда повторно используемая библиотечная подсистема:
Содержит блок, который использует связанные со временем функциональные возможности, такие как блок Step, или непрерывные временные или многоскоростные блоки.
Содержит один или несколько блоков модели.
Содержит подсистему, не встроенную или повторно используемую библиотечную подсистему.
Содержит сигнал или параметр с классом хранения, помещающим объявление данных в файл model_ert_rtw (Например, ExportedGlobal класс хранения помещает данные в model.c)
Содержит определяемый пользователем класс хранения, такой как Enumeration, Simulink.Signal, Simulink.Parameter и т. д., где для области данных не задано значение Exported. Генератор кода может поместить определение типа в .model_types.h
Является вариационной подсистемой, которая генерирует условия препроцессора. Генератор кода размещает директивы препроцессора, которые определяют объекты исполнения в model_types.h
Нельзя повторно использовать подсистему, если в модели имеется несколько экземпляров одной и той же подсистемы, и одна подсистема питается блоком константы, но другая подсистема не является. Чтобы обойти это ограничение, вставьте блок преобразования сигнала перед подсистемами.
Две повторно используемые подсистемы, имеющие разные контрольные суммы, не могут использовать одну и ту же функцию в сгенерированном коде. При указании одинакового имени функции для обеих подсистем в меню Параметры блока (подсистема) > Создание кода > Имя функции:
Если подсистемы связаны с библиотекой, генератор кода управляет именем функции для создания уникальных имен функций. Генератор кода использует правила именования подсистем для генерации имен функций.
Если подсистемы не связаны с библиотекой, генератор кода выдает ошибку.
Предыдущие ограничения также применяются для создания кода на основе библиотеки. Дополнительные сведения см. в разделе Создание библиотечного кода для повторно используемых библиотечных подсистем (встроенный кодер).