Модель выполнения на одноядерной многозадачной платформе

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

Периодическая многоскоростная модель для выполнения в многозадачном режиме

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

  • Шаги расчета для блоков Inport In1_1s и In2_2s устанавливаются равные 1 и 2 секунды, соответственно.

  • Чтобы обеспечить четкое разбиение скоростей, шаги расчета для подсистем SS1 и SS2 имеют значение 1.

  • Блок Rate Transition моделирует явный переход скорости. Кроме того, инструктируйте Simulink вставить блоки Rate Transition для вас, выбрав параметр конфигурации модели Автоматически обрабатывайте переход скорости для передачи данных.

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

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

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

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

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

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

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

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

Преимущества неявной группировки ставок:

  • Simulink не накладывает архитектурные ограничения на модель. Создайте модель, не накладывая ограничений программной архитектуры в модели.

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

  • Генератор кода оптимизирует код через скорости на основе семантики выполнения многозадачности.

Simulink применяет ограничения передачи данных, чтобы достичь монотонного планирования скорости:

  • Передача данных происходит между одной задачей чтения и одной задачей записи.

  • Когда передача данных между двумя задачами, только одна задача может остановить другую задачу.

  • Для периодических задач задача с более высокой частотой имеет более высокий приоритет, чем задача с более низкой частотой. В сложение задача с более высокой частотой упреждает задачу с более низкой частотой.

  • Задачи выполняются на одном процессоре.

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

  • Процессы не аварийно завершаются и не перезапускаются, особенно во время передачи данных между задачами.

  • Использования чтения и записи переменных размером в байт являются атомарными.

Ваша среда выполнения взаимодействует с внешними устройствами для чтения и записи входов модели. Для примера модели внешние устройства с помощью блоков Simulink S-Function. Сгенерируйте код для этих блоков с остальной частью алгоритма.

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

Откройте приложение Embedded Coder, затем сгенерируйте код и отчет генерации кода. Пример модели генерирует отчет.

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

Из отчета генерации кода проверьте сгенерированный код.

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

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

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

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

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

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

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

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

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

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

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

  • rtU.In1_1s типа данных real_T с размерностью 1

  • rtU.In2_2s типа данных real_T с размерностью 1

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

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

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

  • Выход и обновление функции точки входа, void rtwdemo_multirate_multitasking_step1(void). Периодически вызывайте эту функцию на второй самой быстрой скорости в модели. Для этой модели вызывайте функцию каждые две секунды. Чтобы добиться выполнения в реальном времени, присоедините эту функцию к таймеру.

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

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

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

Подробнее о