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

Разверните встраиваемый системный код из моделей Simulink ® путем разбиения модели на несколько атомарных подсистем, которые вы создаете отдельно .

Атомарная подсистема

Откройте пример модели rtwdemo_explicitinvocation_atomicsubsys. Модель сконфигурирована так, чтобы отображать закодированные в цвете шаги расчета с аннотациями. Чтобы увидеть их, после открытия модели обновите схему нажатием Ctrl + D. Для отображения легенды нажмите Ctrl + J.

Эта модель разделяет алгоритм на две атомарные подсистемы: Rate1s и Rate2s. Подсистема Rate1s сконфигурировано со шаг расчета 1 секунду. Подсистема Rate2s сконфигурировано со шаг расчета 2 секунды.

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

  • Введите значение Fixed-step.

  • Для решателя задано значение discrete (no continuous states).

  • Обработайте каждую дискретную скорость как отдельную задачу, удаленную.

Планирование

Simulink ® моделирует модель на основе строения модели. Simulink распространяет и использует шаги расчета блоков Inport, чтобы упорядочить выполнение блоков на основе одноядерной, однозадачной платформы выполнения.

В данном примере условное обозначение шага расчета показывает неявную группировку скоростей. Красный цвет представляет самую быструю дискретную скорость. Green представляет вторую самую быструю дискретную скорость.

На основе однотонного планирования скорости ваш код приложения (среда выполнения) должен передавать данные между подсистемами Rate2s и Rate1s с частотой 2 секунды с приоритетом 1 секунду. То есть сгенерированная функция переносит данные в 1-секундной задаче каждый раз перед выполнением кода для подсистемы Rate1s.

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

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

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

  1. Откройте приложение Embedded Coder.

  2. Щелкните правой кнопкой мыши блок подсистемы.

  3. Выберите C/C + + код > Build This Subsystem.

  4. В диалоговом окне код for Subsystem нажмите нажатие кнопки.

Пример модели генерирует отчет.

Просмотр сгенерированного кода

Просмотрите сгенерированный код в представлении кода или отчете о генерации кода.

  • ert_main.c является примером основной программы (среды выполнения) для подсистемы. Этот код управляет выполнением кода модели, вызывая функцию точки входа Rate1s_step или Rate2s_step. Используйте этот файл в качестве начальной точки для кодирования среды выполнения.

  • Rate1s.c и Rate2s.c содержат точки входа для кода, который реализует подсистему Rate1s и Rate2s, соответственно. Этот файл включает скорость и код планирования задач.

  • Rate1s.h и Rate2s.h объявить структуры данных моделей и открытый интерфейс для точек входа подсистемы и структур данных.

  • rtwtypes.h определяет типы данных, структуры и макросы, которые требуются сгенерированному коду.

Интерфейс кода

Откройте и проверьте отчет по интерфейсам кода. Используйте информацию в этом отчете, чтобы записать код интерфейса для вашей среды выполнения:

  1. Включите сгенерированный заголовочный файл путем добавления директивы #include rtwdemo_explicitinvocation_atomicsusys.h.

  2. Запишите входные данные в сгенерированный код для блоков Inport модели.

  3. Вызовите сгенерированные функции точки входа.

  4. Считайте данные из сгенерированного кода для блоков Outport модели.

Входные порты, Rate1s:

  • rtU.In1 типа real_T с размерностью 1

  • rtU.In2 типа real_T с размерностью 1

Функции точки входа, Rate1s:

  • Инициализируйте функцию точки входа, void Rate1s_initialize(void). При запуске вызовите эту функцию один раз.

  • Выход и обновление функции точки входа (шага), void Rate1s_step(void). Вызывайте эту функцию периодически, каждую секунду.

  • Функция завершения, void Rate1s_terminate(void). Вызовите эту функцию один раз из кода завершения работы.

Выходные порты, Rate1s:

  • rtY.Out1 типа real_T с размерностью 1

  • rtY.Out2 типа real_T с размерностью 1

Входные порты, Rate2s:

  • rtU.In1 типа real_T с размерностью 1

Функции точки входа, Rate2s:

  • Инициализируйте функцию точки входа, void Rate2s_initialize(void). Вызовите эту функцию один раз при запуске.

  • Выход и обновление точки входа (шаг), void Rate2s_step(void). Вызывать эту функцию периодически, каждые 2 секунды.

  • Функция завершения, void Rate2s_terminate(void). Вызовите эту функцию один раз из кода завершения работы.

Выходные порты, Rate2s:

  • rtY.Out1 типа real_T с размерностью 1

Подробнее о