Основанная на библиотеке генерация кода для допускающих повторное использование подсистем библиотеки

Основанная на библиотеке генерация кода обеспечивает способ сгенерировать код для набора допускающих повторное использование компонентов, которые могут совместно использовать модели. Для каждой допускающей повторное использование подсистемы библиотеки верхнего уровня вы задаете набор функциональных интерфейсов, которые блокируют вниз интерфейс подсистемы. Функциональный интерфейс состоит из настроек параметров блоков ввода и вывода подсистемы и настроек параметра конфигурации модели.

Функциональные интерфейсы являются независимыми моделями, которые вы сохраняете с сопроводительной библиотекой. Прежде, чем сгенерировать код для модели, содержащей экземпляры допускающей повторное использование подсистемы библиотеки, вы генерируете код для библиотеки. Основанная на библиотеке генерация кода делает библиотеку владельцем кода. Чтобы сделать отдельные модели владельцем кода, можно сгенерировать код для допускающих повторное использование подсистем библиотеки к разделяемой сервисной папке. Для получения дополнительной информации смотрите, Генерируют Повторно используемый код от Подсистем Библиотеки, Разделяемых Через Модели.

Модель в качестве примера и библиотека

Чтобы показать, как использовать функциональные интерфейсы и основанную на библиотеке генерацию кода, этот пример использует модель rtwdemo_libcodegen_mdl и библиотека rtwdemo_libcodegen_lib. Модель содержит два экземпляра допускающей повторное использование подсистемы библиотеки Atomic_Controller. Для Atomic_Controller_Single, типом данных входного сигнала является single. Для Atomic_Controller_Double, типом данных входного сигнала является double. Открыть модель и файлы библиотеки, в командной строке MATLAB, введите:

rtwdemo_libcodegen_mdl
rtwdemo_libcodegen_lib

Сконфигурируйте допускающие повторное использование подсистемы библиотеки

Чтобы выполнить основанную на библиотеке генерацию кода, необходимо сконфигурировать подсистему библиотеки как допускающую повторное использование.

  1. В диалоговом окне параметров блоков Subsystem выберите Treat как атомарный модуль (Simulink).

  2. В диалоговом окне параметров блока Subsystem, на вкладке Code Generation, устанавливает Функцию, упаковочную (Simulink) параметр к Reusable function.

Задайте уникальные функциональные интерфейсные имена

Каждый функциональный интерфейс, соответствующий той же допускающей повторное использование подсистеме библиотеки, должен иметь уникальное имя. Чтобы задать уникальное имя, выполните эти шаги:

  1. В диалоговом окне параметров блоков Subsystem, на вкладке Code Generation, устанавливает параметр Function name options на User specified.

  2. Для параметра Function name задайте $R и $N лексемы. $R лексема представляет функциональное интерфейсное имя. $N лексема представляет имя подсистемы.

  3. В диалоговом окне Create Function Interface, для параметра Name, задают имя, которое описывает контекст.

  4. Установите параметр File name option на Auto или Use function name.

Сконфигурируйте и управляйте функциональными интерфейсами

Модель rtwdemo_libcodegen_mdl содержит два экземпляра допускающей повторное использование подсистемы библиотеки Atomic_Controller. Каждый экземпляр представляет функциональный интерфейс. В библиотеке rtwdemo_libcodegen_lib, щелкните правой кнопкой по значку по более низкой самой правой стороне допускающей повторное использование подсистемы библиотеки Atomic_Controller. Выберите Manage Function Interfaces. Два функциональных интерфейса имеют имена Single и Double потому что Atomic_Controller берет single и double типы данных.

Чтобы создать функциональные интерфейсы, в библиотеке, щелкают правой кнопкой по подсистеме и выбирают C/C++ Function Interfaces > Create Function Interface. Задайте функциональный интерфейс Name.

Затем чтобы сконфигурировать функциональные интерфейсы, выберите один из следующих методов.

Задайте функциональный интерфейс из модели

Создать функциональные интерфейсы из соединенных экземпляров допускающей повторное использование подсистемы библиотеки:

  1. В библиотеке щелкните правой кнопкой по значку по более низкой самой правой стороне допускающей повторное использование подсистемы библиотеки и выберите Create Function Interface. В диалоговом окне выберите параметр Specify library block instance to create function interface.

  2. Для параметра Simulink model with instance выберите модель, которая содержит подсистему.

  3. Для параметра Library block instance name выберите подсистему.

  4. Нажмите OK и закройте диалоговое окно Create Function Interface.

  5. Для каждого функционального интерфейса повторите предыдущие шаги.

Примечание

Можно создать функциональный интерфейс из модели, которая содержит экземпляр соединенной допускающей повторное использование подсистемы библиотеки. Необходимо быть в перспективе Кода. Чтобы открыть перспективу Кода, в меню apps, выбирают Embedded Coder. Если подсистема имеет функциональные интерфейсы, значок появляется в нижнем правом углу подсистемы. Щелкните правой кнопкой по значку и выберите Create Function Interface. Если подсистема не имеет функциональных интерфейсов, щелкните правой кнопкой по подсистеме и выберите C/C++ Function Interfaces> Create Function Interface.

Экспортируйте и сконфигурируйте существующий функциональный интерфейс

Экспортировать и конфигурировать функциональный интерфейс как независимую модель:

  1. В библиотеке щелкните правой кнопкой по значку по более низкой самой правой стороне допускающей повторное использование подсистемы библиотеки и выберите Manage Function Interfaces.

  2. Выберите функциональные интерфейсы, которые вы хотите изменить.

  3. Нажмите Export.

  4. В окне Save As задайте текущую рабочую папку. Экспортируемый функциональный интерфейс является .slx файлом, который имеет функциональное интерфейсное имя плюс приложение _export.

  5. Откройте экспортируемую модель. Внесите свои изменения в настройки параметров блоков ввода и вывода подсистемы и настройки параметра конфигурации модели. Сохраните модель.

  6. В библиотеке щелкните правой кнопкой по допускающей повторное использование подсистеме библиотеки и выберите C/C++ Function Interfaces > Create Function Interface. Задайте функциональный интерфейс Name.

  7. Для параметра Simulink model with instance выберите экспортируемую модель, которая находится в текущей рабочей папке.

  8. Для параметра Library block instance name выберите подсистему.

  9. Нажмите OK и закройте диалоговое окно Create Function Interface.

Сконфигурируйте функциональные интерфейсы из библиотеки

  1. В библиотеке щелкните правой кнопкой по значку по более низкой самой правой стороне подсистемы и выберите Configure Function Interface.

  2. В диалоговом окне Configure Function Interface, для вводов и выводов подсистемы, задают значения для Data Type, Dimensions и параметров Signal Type. Чтобы изменить другие установки параметров ввода и вывода подсистемы, следуйте методу экспорта в предыдущем разделе.

  3. Чтобы изменить параметры конфигурации модели, нажмите кнопку механизма и внесите изменения. Нажмите Apply. Закройте диалоговое окно Configuration Parameters.

  4. Чтобы заменить функциональный интерфейс на существующий из модели экземпляра, выберите Regenerate Using Instance.

  5. Задайте значения для параметров Library block instance name и Simulink model with instance. Нажмите Regenerate.

  6. Нажмите Apply и закройте диалоговое окно Configure Function Interface.

Создайте библиотеку

После того, как вы задаете функциональные интерфейсы для подсистем в вашей библиотеке, генерируете код для библиотеки. Прежде, чем сгенерировать код для вашей модели, необходимо сгенерировать код для библиотеки. Генератор кода группирует код библиотеки как отдельную библиотеку C. Сгенерированный код для библиотеки находится в папке, соответствующей вашим аппаратным настройкам (например, IntelWin64). Папка библиотеки кода имеет то же имя как библиотека и должна быть на том же иерархическом уровне как библиотека.

Чтобы сгенерировать код, проверяйте, что библиотека разблокирована. Откройте приложение Embedded Coder и нажмите Build Library.

Когда вы генерируете код для rtwdemo_libcodegen_lib библиотека, rtwdemo_libcodegen_lib папка содержит их .c и .h файлы:

  • Atomic_Controller_Single.h

  • Atomic_Controller_Single.c

  • Atomic_Controller_Double.h

  • Atomic_Controller_Double.c

Эти имена функций являются представительными для $N$R спецификация для Function name options и параметров Function name на диалоговом окне параметров блока Subsystem.

_shared папка содержит код для разделяемых утилит (например, утилит фиксированной точки и Интерполяционной таблицы и блоков MATLAB function), дополнительные файлы, и экспортируемые параметры и типы.

Когда вы генерируете код для модели, которая содержит экземпляр допускающей повторное использование подсистемы библиотеки, которая может использовать предсгенерированный код библиотеки, ссылки модели на код библиотеки. Генератор кода использует контрольную сумму, чтобы определить возможность многократного использования. Сгенерированный код для модели должен быть в той же папке как библиотека. В командной строке MATLAB, введите:

Simulink.fileGenControl('set', 'CodeGenFolderStructure',...
 Simulink.filegen.CodeGenFolderStructure.TargetEnvironmentSubfolder);
Для получения дополнительной информации смотрите Simulink.fileGenControl.

Если модель не может использовать код библиотеки, можно задать, производит ли Embedded Coder предупреждение или ошибку во время генерации кода. В диалоговом окне Configuration Parameters, устанавливает Поведение, когда предсгенерированный код подсистемы библиотеки пропускает диагностическую установку параметра.

Можно сгенерировать код для библиотеки, но не выполнить make-файл путем ввода этих команд:

library='rtwdemo_libcodegen_lib'
set_param(library, 'GenCodeOnly', 'on')
rtwbuild(library)

Примечание

Можно сгенерировать код для библиотеки, состоящей из допускающих повторное использование подсистем, которые содержат S-функции. Чтобы избежать некомпилируемого кода, в соответствии функции TLC S-функции, стараются не направлять генератор кода, чтобы взаимодействовать с файлами модели, такими как model.c, model.h, и model_types.h.

Сгенерируйте код из модели, содержащей допускающий повторное использование экземпляр подсистемы библиотеки

Чтобы сгенерировать код из модели, которая содержит экземпляр допускающей повторное использование подсистемы библиотеки, в которой вы хотите использовать код библиотеки:

  1. Установите параметр конфигурации модели Shared code placement на Shared location.

  2. Задайте установку для Поведения, когда предсгенерированный код подсистемы библиотеки пропускает (Simulink) параметр, или оставьте настройку по умолчанию, которая предупреждает.

  3. В диалоговом окне Configuration Parameters установки параметров на панелях Code Generation должны все быть идентичны друг другу. Если настройки отличаются, вы можете получить предупреждение, ошибку или ни одного в зависимости от установки параметра Behavior when pregenerated library subsystem code is missing.

  4. Если допускающая повторное использование подсистема библиотеки использует разделяемое локальное хранилище данных, и вы конфигурируете отображение значения по умолчанию для элементов данных модели, оставляете отображение класса памяти по умолчанию для категории набор Shared local data stores к Default.

Вот сгенерированный код C для rtwdemo_libcodegen_mdl.

/* Model step function */
void rtwdemo_libcodegen_mdl_step(void)
{
  /* Outputs for Atomic SubSystem: '<Root>/Atomic_Controller_Double' */

  /* Inport: '<Root>/pos_rqst' incorporates:
   *  Inport: '<Root>/fbk_1'
   *  Outport: '<Root>/pos_cmd_one'
   */
  Atomic_Controller_Double(pos_rqst1, rtU.fbk_1, &rtY.pos_cmd_one,
    &rtDW.Atomic_Controller_Double);

  /* End of Outputs for SubSystem: '<Root>/Atomic_Controller_Double' */

  /* Outputs for Atomic SubSystem: '<Root>/Atomic_Controller_Single' */

  /* Inport: '<Root>/pos_rqst1' incorporates:
   *  Inport: '<Root>/fbk_2'
   *  Outport: '<Root>/pos_cmd_two'
   */
  Atomic_Controller_Single(pos_rqst2, rtU.fbk_2, &rtY.pos_cmd_two,
    &rtDW.Atomic_Controller_Single);

  /* End of Outputs for SubSystem: '<Root>/Atomic_Controller_Single' */
}

Код содержит вызовы Atomic_Controller_Single и Atomic_Controller_Double функции. Сгенерированный код вытягивает функциональные определения из предсгенерированного кода библиотеки.

Ограничения

Поскольку генератор кода использует контрольную сумму, чтобы определить возможность многократного использования, те же ограничения, которые применяются к генерации кода за модели, которые совместно используют допускающие повторное использование подсистемы библиотеки, применяются к основанной на библиотеке генерации кода. Смотрите Ограничения. Эти ограничения также применяются:

  • Вы не можете задать функциональный интерфейс на допускающей повторное использование подсистеме библиотеки, которая является в другой допускающей повторное использование подсистеме библиотеки.

  • Только ERT и ERT-выведенные системные конечные файлы основанная на вспомогательной библиотеке генерация кода.

  • Каждый функциональный интерфейс, который соответствует той же допускающей повторное использование подсистеме библиотеки, должен быть уникальным.

  • На платформе Windows постарайтесь не называть библиотеку lib.slx когда выполнение так может вмешаться в статический процесс компиляции библиотеки.

  • Когда вы генерируете код от библиотеки, генератор кода только генерирует код для допускающих повторное использование подсистем верхнего уровня в библиотеке. Подсистема библиотеки верхнего уровня можно инстанцировать на любом уровне в клиентской модели и экземпляре в клиентском коде библиотеки повторных использований модели, если это находит кого-либо.

  • Подсистема библиотеки не может снова использовать код, если это в блоке Enabled Subsystem с Разрешать параметрами блоков, States when enabling, набором к reset.

Похожие темы