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

Simulink поддерживает моделирование параллельного выполнения задач путем назначения разделов модели задачам, которые должны выполняться одновременно на многоядерном оборудовании. Использование неявного или явного подхода к назначению разделов.
Имитация неявного разбиения:
Секционирование модели на основе времени образца, указанного в модели.
Назначает задачу каждой выборочной частоте и указывает, что задачи выполняются одновременно.
Управляет детализацией разделов. Например, нельзя разбить частоту выборки на несколько задач.
Не накладывает ограничения моделирования.
Предоставляет готовые к использованию аппаратные решения, такие как решения, которые производит продукт Simulink ® Real-Time™.
Не имеет отношения к автономному созданию производственного кода из-за отсутствия контроля за детализацией разделов.
Явное разбиение:
Используйте блоки «Модель» и «Подсистема» для разделения модели.
Создайте произвольное число задач.
Simulink назначает каждому разделу задачу.
Simulink накладывает ограничения моделирования.
Управление детализацией разделов.
Разбить частоту выборки на несколько задач.
Назначение разделов разным ядрам процессора.
Предназначен для автономного создания производственного кода из-за уровня контроля над гранулярностью разделов.
В этом примере показано явное разбиение.
Рассмотрим следующую периодическую многоскоростную модель, настроенную для многозадачного выполнения.

Примеры времени для блоков ввода In1_1s и In2_2s установлены на 1 и 2 секунды соответственно.
Чтобы обеспечить четкое разделение скоростей, время выборки для моделей SS1 и SS2 имеют значение 1.
Блок Rate Transition явно моделирует переход скорости.
Для поддержки одновременного выполнения задач в многоядерной среде выполнения была изменена предыдущая модель:
Блок интегратора находится в блоке модели, сконфигурированном с дискретным решателем с фиксированным шагом и размером шага в две секунды.
Подсистемы SS1 и SS2 были преобразованы в блоки модели, сконфигурированные с дискретным решателем с фиксированным шагом и размером шага в одну секунду.
Блок Сумма (Sum) находится в блоке Модель (Model), сконфигурированном с дискретным решателем с фиксированным шагом и размером шага в одну секунду. Другой вариант блока «Сумма» - поместить его в SS1 или SS2 и вычислить его значение, совпадающее с блоком модели. Для одновременного выполнения задач только блоки соединений, блоки модели и блоки подсистемы могут находиться на корневом уровне модели.
Блок «» Переход скорости «» удален.
Тип имеет значение Fixed-step.
Решатель имеет значение discrete (no continuous states).
Каждая дискретная скорость рассматривается как отдельная выбранная задача.
Автоматически обрабатывать переход скорости для передачи выбранных данных. Необходимо, так как блок «» Переход скорости «» удален.
Разрешить одновременное выполнение задач на выбранном целевом объекте.
Откройте диалоговое окно Параллельное выполнение (Concurrent Execution), щелкнув Настроить задачи (Configure Tasks) на панели Решатель параметров конфигурации (Configuration Parameters Solver). При выборе параметра Разрешить одновременное выполнение задач в целевом объекте включается кнопка Настроить задачи.
Если этот параметр выбран, параметр Включить явное разбиение модели для параллельного поведения включает параметры параллельного выполнения для модели верхнего уровня.
Щелкните Задачи и сопоставление (Tasks and Mapping), чтобы просмотреть задачи и сопоставление.

Simulink создает сопоставление по умолчанию для каждой секции (блок модели), назначая каждую секцию отдельной задаче. Simulink указывает, что каждый раздел выполняется одновременно, и моделирует эффекты задержки, которые оказывает обмен данными между ядрами процессора. В этом диалоговом окне отображается сопоставление, состоящее из разделов, распределенных по двум независимым периодическим триггерам: SS1, SS2, и Sum сопоставлено периодическому триггеру 1 и Integrator сопоставлено периодическому триггеру 2.
Simulink ® моделирует модель на основе конфигурации модели. Код, созданный из модели, реализует ту же семантику выполнения. Simulink распространяет и использует время выборки блоков Inport для заказа выполнения блоков на основе многоядерной многозадачной платформы выполнения .
Для этой модели условное обозначение времени выборки показывает неявную группировку скорости. Красный - самая быстрая дискретная скорость. Зеленый цвет представляет вторую самую быструю дискретную скорость.
Сгенерированные спецификации кода подрейты в модели. В этом примере скорость для блока Inport In2_2sзеленая скорость является субскоростью. Сгенерированный код правильно передает данные между скоростями.
Преимущества неявной группировки скорости Simulink:
Simulink не накладывает архитектурных ограничений на модель. Создание модели без наложения на нее ограничений архитектуры программного обеспечения.
Инфраструктура выполнения не требует подробных данных о базовом планировании функций и переносе данных между тарифами. Таким образом, упрощаются требования к интерфейсу модели. Среда выполнения использует сгенерированный код интерфейса для записи входных данных, вызова функции шага модели и считывания выходных данных.
Генератор кода оптимизирует код по скоростям на основе семантики выполнения многозадачности.
Simulink обеспечивает ограничение передачи данных:
Передача данных происходит между одной задачей чтения и одной задачей записи.
Задачи выполняются на одном процессоре.
Процессы не останавливаются и не перезапускаются, особенно во время передачи данных между задачами.
Операции чтения и записи для переменных байтового размера являются атомарными.
Среда выполнения может взаимодействовать с внешними устройствами для чтения и записи входных данных модели. Например, моделируйте внешние устройства с помощью блоков Simulink S-Function. Создайте код для этих блоков с остальной частью алгоритма.
Создание кода и отчета о создании кода. Пример модели создает отчет.
Просмотрите созданный код из отчета о создании кода.
ert_main.c является примером основной программы (инфраструктуры выполнения) для модели. Этот код управляет выполнением кода модели путем косвенного вызова функций точки входа PeriodicTrigger1_OneSecond_step, PeriodicTrigger1_TwoSecond_step, и PeriodicTrigger2_OneSecond_step с функцией rtwdemo_concurrent_execution_step. Используйте этот файл в качестве отправной точки для кодирования среды выполнения.
rtwdemo_concurrent_execution.c содержит точки входа для кода, реализующего алгоритм модели. Этот файл содержит код планирования скорости и задач.
rtwdemo_concurrent_execution.h объявляет структуры данных модели и открытый интерфейс с точками входа модели и структурами данных.
model_reference_types.h содержит определения типов для мостов синхронизации. Эти определения типов создаются для целевого объекта привязки модели или модели, содержащей блоки модели.
rtw_windows.h объявляет прототипы функций мьютекса и семафора, которые генерируемый код использует для параллельного выполнения на платформах Microsoft ® Windows ®.
rtwtypes.h определяет типы данных, структуры и макросы, необходимые для созданного кода.
Откройте и просмотрите отчет по кодовому интерфейсу. Используйте информацию в этом отчете для написания кода интерфейса для среды выполнения:
Включить созданный файл заголовка путем добавления директивы #include rtwdemo_concurrent_execution.h.
Запись входных данных в созданный код для блоков ввода модели.
Вызовите сгенерированные функции точки входа.
Считывание данных из созданного кода для блоков Outport модели.
Входные порты:
In1_1s типа данных real_T с размером 1
In2_2s типа данных real_T с размером 1
Функции точки входа:
Инициализация функции начальной точки, void rtwdemo_concurrent_execution_initialize(void). При запуске вызовите эту функцию один раз.
Функция вывода и обновления точки входа (шаг), void PeriodicTrigger1_OneSecond_step(void). Периодически вызывайте эту функцию для одной из двух задач, требующих планирования с самой высокой скоростью в модели. Для этой модели вызовите функцию каждую секунду.
Вывод и обновление функции начального уровня, void PeriodicTrigger1_TwoSecond_step(void). Периодически вызывайте эту функцию со второй самой быстрой скоростью в модели. Для этой модели вызовите функцию каждые две секунды.
Вывод и обновление функции начального уровня, void PeriodicTrigger2_OneSecond_step(void). Вызовите эту функцию периодически для второй задачи, требующей планирования с самой высокой скоростью в модели. Для этой модели вызовите функцию каждую секунду.
Чтобы обеспечить выполнение в реальном времени, определите задачу или поток для каждой функции шага начальной точки. Запуск выполнения каждой функции на основе таймера с той же скоростью, что и у данной функции. Операционная система планирует задачи между ядрами динамически или на основе сопоставления задач с ядрами.
Выходные порты:
Out1_1s типа данных real_T с размером 1
Out2_1s типа данных real_T с размером 1