Используйте Simulink® основанное на времени, многозадачное планирование симулировать и сгенерировать код для алгоритма приложения, полученного в одной иерархии модели. Модель спроектирована и сконфигурирована для встраиваемой системы, предназначенной, чтобы выполниться на симметричной многожильной, многозадачной платформе.
Откройте модель в качестве примера rtwdemo_concurrent_execution. Модель сконфигурирована, чтобы отобразить шаги расчета, на которые наносят цветную маркировку, с аннотациями. Чтобы видеть их, после открытия модели, обновляют схему путем нажатия Ctrl+D. Чтобы отобразить легенду, нажмите Ctrl+J.
Simulink поддерживает симуляцию параллельного выполнения задач путем присвоения разделов модели к задачам, которые вы определяете, чтобы запуститься одновременно на многожильном оборудовании. Используйте неявный или явный подход к обозначению разделов.
Simulink неявное разделение:
Делит основанное на модели на шагах расчета, заданных в модели.
Присваивает задачу каждой частоте дискретизации и называет это задачами запущенный одновременно.
Управляет гранулярностью разделов. Например, вы не можете разделить частоту дискретизации в несколько задач.
Не налагает ограничения моделирования.
Обеспечивает готовые к использованию аппаратные решения, такие как решения, которые производит продукт Simulink® Real-Time™.
Не относится к автономной генерации производственного кода из-за отсутствия управления гранулярностью раздела.
Явное разделение:
Используйте Модель и блоки Subsystem, чтобы разделить модель.
Создайте произвольное число задач.
Simulink присваивает каждый раздел задаче.
Simulink налагает ограничения моделирования.
Управляйте гранулярностью разделов.
Разделите частоту дискретизации в несколько задач.
Присвойте разделы различным ядрам процессора.
Для автономной генерации производственного кода из-за уровня контроля, который вы имеете над гранулярностью разделов.
Этот пример показывает явное разделение.
Рассмотрите следующую периодическую многоскоростную модель, которая настраивается для многозадачного выполнения.
Шаги расчета для Inport блоков In1_1s
и In2_2s
установлены в 1 и 2 секунды, соответственно.
Обеспечить ясное разделение уровней, шагов расчета для моделей SS1
и SS2
установлены в 1.
Блок Rate Transition явным образом моделирует смену частоты дискретизации.
Чтобы поддержать параллельное выполнение задач в многожильной среде выполнения, предыдущая модель была изменена:
Блок Integrator находится в блоке Model, сконфигурированном с фиксированным шагом дискретный решатель и размер шага двух секунд.
Подсистемы SS1
и SS2
были преобразованы в блоки Model, сконфигурированные с фиксированным шагом дискретный решатель и размер шага одной секунды.
Блок Sum находится в блоке Model, сконфигурированном с фиксированным шагом дискретный решатель и размер шага одной секунды. Другая опция для блока Sum должна поместить его в SS1
или SS2
и вычислите его значение, совпадающее с блоком Model. Для параллельного выполнения задач только блоки связи, блоки Model и блоки Subsystem могут быть на корневом уровне модели.
Блок Rate Transition был удален.
Введите набор к Fixed-step
.
Набор решателя к discrete (no continuous states)
.
Обработайте каждый дискретный уровень как отдельную выбранную задачу.
Автоматически обработайте переход уровня для выбранной передачи данных. Необходимый, потому что блок Rate Transition был удален.
Позвольте задачам выполниться одновременно на выбранной цели.
Откройте диалоговое окно Concurrent Execution путем нажатия на Configure Tasks на панели Решателя Параметров конфигурации. Выбор параметра Позволяет задачам выполниться одновременно на цели, включает кнопку Configure Tasks.
Когда выбрано, параметр Включают явное разделение модели для параллельного поведения, включает опции параллельного выполнения для модели верхнего уровня.
Нажмите Tasks и Mapping, чтобы рассмотреть задачи и отображение.
Simulink создает отображение значения по умолчанию для каждого раздела (блок Model) путем присвоения каждого раздела отдельной задаче. Simulink определяет тот каждый раздел, выполняется одновременно и симулирует эффекты задержки, которые налагает передача данных между ядрами процессора. Это диалоговое окно отображается отображение, состоящее из распространения разделов через два независимых периодических триггера: SS1
, SS2
, и Sum
сопоставленный с периодическим триггером 1 и Integrator
сопоставленный с периодическим триггером 2.
Simulink® симулирует модель, основываясь на настройке модели. Код, сгенерированный из модели, реализует ту же семантику выполнения. Simulink распространяет и использует шаги расчета блока Inport, чтобы заказать выполнение блока на основе многожильной, многозадачной платформы выполнения.
Для этой модели легенда шага расчета показывает неявную группировку частот. Красный представляет самую быструю частоту дискретизации. Зеленый представляет вторую самую быструю частоту дискретизации.
Сгенерированный код планирует подуровни в модели. В этом примере, уровне для Inport блока In2_2s
, зеленый уровень, подуровень. Сгенерированный код правильно передает данные между уровнями.
Преимущества неявной группировки уровня Simulink:
Simulink не налагает архитектурные ограничения на модель. Создайте модель, не налагая ограничения программной архитектуры в нем.
Ваша среда выполнения не требует деталей о базовом функциональном планировании и передачах данных между уровнями. Поэтому требования интерфейса модели упрощены. Использование среды выполнения сгенерированный интерфейсный код, чтобы записать вход, вызовите функцию шага расчета модели и считайте выход.
Генератор кода оптимизирует код через уровни, на основе многозадачной семантики выполнения.
Simulink осуществляет ограничения передачи данных:
Передачи данных находятся между одной задачей чтения и одной задачей записи.
Задачи работают на одном процессоре.
Процессы не останавливают или перезапускают, особенно во время передач данных между задачами.
Операции чтения и операции записи на переменных размера байта являются атомарными.
Ваша среда выполнения может связаться с внешними устройствами для чтения и записи входа модели. Например, внешние устройства модели при помощи Блоков s-function Simulink. Сгенерируйте код для тех блоков с остальной частью алгоритма.
Сгенерируйте код и отчет генерации кода. Модель в качестве примера генерирует отчет.
Из отчета генерации кода рассмотрите сгенерированный код.
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
содержит определения типа для синхронизации мостов. Эти определения типа сгенерированы для цели модели-ссылки или модели, содержащей блоки Model.
rtw_windows.h
объявляет взаимное исключение и семафорных прототипов функции, которых сгенерированный код использует для параллельного выполнения на платформах Microsoft® Windows®.
rtwtypes.h
задает типы данных, структуры и макросы, которых требует сгенерированный код.
Откройте и рассмотрите Отчет Интерфейса Кода. Используйте информацию в том отчете записать интерфейсный код для вашей среды выполнения:
Включайте сгенерированный заголовочный файл путем добавления направляющего #include rtwdemo_concurrent_execution.h
.
Запишите входные данные в сгенерированный код для Inport блоков модели.
Вызовите сгенерированные функции точки входа.
Считайте данные из сгенерированного кода для блоков модели Outport.
Input port:
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