Simulink® модели выполняются с одними или несколькими шагами расчета. Продукт Simulink обеспечивает значительную гибкость в создании многоцелевых систем, то есть систем с более чем одним шагом расчета. Однако эта же гибкость также позволяет вам создавать модели, для которых генератор кода не может сгенерировать код в реальном времени для выполнения в многозадачном окружении. Чтобы многоскоростные модели работали должным образом в реальном времени (то есть, чтобы дать правильные ответы), вы иногда должны изменить свою модель или дать указание движку Simulink изменить модель для вас. В целом, изменения включают размещение блоков Rate Transition между блоками, которые имеют неравные шаги расчета. В следующих разделах рассматриваются проблемы, которые вы должны решить, чтобы использовать многоскоростную модель в многозадачном окружении. Подробное обсуждение шагов расчета, включая переходы скорости, смотрите в «Что такое период расчета?», «Периоды расчета в подсистемах», «Периоды расчета в системах», «Разрешение переходов скорости» и связанных с ними темах.
Для модели с фиксированным шагом существует два режима выполнения: однозадачный и многозадачный. Эти режимы доступны только для решателей с фиксированным шагом. Чтобы выбрать режим выполнения, выберите Treat each discrete rate as a separate task параметра конфигурации модели. Когда вы выбираете этот параметр, выполнение многозадачности применяется для многоскоростной модели. Когда вы очищаете этот параметр, применяется однозадачное выполнение.
Примечание
Модель, которая является многозадачной и использует многозадачность, не может ссылаться на многоскоростную модель, которая использует однозадачную.
Выполнение моделей в системе реального времени может быть сделано с помощью операционной системы реального времени, или это может быть сделано на голом-металлическом целевом компьютере, где модель запускается в контексте стандартной программы обслуживания прерывания (ISR).
Тот факт, что система (такая как The Open Group UNIX® или Microsoft® Windows® systems) многозадачность не означает, что ваша программа может выполняться в режиме реального времени. Это происходит из-за того, что при необходимости программа может не отдавать предпочтение другим процессам.
В операционных системах (таких как PC-DOS), где в установленный момент времени может существовать только один процесс, стандартная программа обслуживания прерывания (ISR) должна выполнить шаги сохранения контекста процессора, выполнения кода модели, сбора данных и восстановления контекста процессора.
Другие операционные системы, такие как POSIX-совместимые таковые, обеспечивают автоматическое переключение контекста и планирование задач. Это упрощает операции, выполняемые ISR. В этом случае ISR просто включает задачу выполнения модели, которая обычно блокируется. Следующий рисунок иллюстрирует это различие.
Чтобы сгенерировать код, который выполняется как ожидалось в реальном времени, вам (или движку Simulink) может потребоваться идентифицировать и обработать переходы частоты дискретизации в модели. В многозадачном режиме по умолчанию механизм Simulink помечает ошибки во время симуляции, если модель содержит недопустимые переходы скорости, хотя можно использовать параметр конфигурации <reservedrangesplaceholder1> модели, чтобы изменить это поведение. Single task rate transition параметра доступен для той же цели для однозадачного режима.
Чтобы избежать увеличения ошибок перехода скорости, вставьте блоки Rate Transition между задачами. Можно запросить автоматические переходы скорости указателя Simulink путем вставки скрытых блоков Rate Transition. Для получения объяснения этой опции смотрите раздел «Автоматический переход скорости».
Чтобы понять такие проблемы, сначала рассмотрим, чем симуляции Simulink отличаются от программ в реальном времени.
Прежде чем механизм Simulink симулирует модель, он упорядочивает блоки на основе их топологических зависимостей. Это включает расширение виртуальных подсистем в отдельные блоки, которые они содержат, и сведение всей модели в один список. После завершения этого шага каждый блок выполняется по порядку.
Ключ к этому процессу - упорядоченное расположение блоков. Блок, выход которого напрямую зависит от его входа (то есть блока с прямым сквозным соединением), не может выполняться, пока блок не будет управлять своим входом.
Некоторые блоки устанавливают свои выходы на основе значений, полученных в предыдущем временном шаге или из начальных условий, заданных как параметры блоков. Выход такого блока определяется значением, хранящимся в памяти, которое может обновляться независимо от его входа. Во время симуляции расчетов выполняются перед продвижением переменной, соответствующей времени. Это приводит к тому, что расчеты происходят мгновенно (то есть никакой вычислительной задержки).
Программа в реальном времени отличается от симуляции Simulink тем, что программа должна выполнять код модели синхронно с реальным временем. Каждое вычисление приводит к некоторой вычислительной задержке. Это означает, что интервалы расчета не могут быть сокращены или удлинены (так как они могут быть в симуляции Simulink), что приводит к менее эффективному выполнению.
Примите во внимание следующий временной рисунок.
Обратите внимание на неэффективность обработки в интервале расчета t1
. Этот интервал не может быть сжат, чтобы увеличить скорость выполнения, потому что, по определению, шаги расчета синхронизируются в реальном времени.
Вы можете обойти эту потенциальную неэффективность, используя многозадачный режим. Многозадачный режим определяет задачи с различными приоритетами, чтобы выполнить части кода модели, которые имеют различные частоты дискретизации.
Описание того, как это работает, смотрите в Multitasking и Pseudomultitasking Modes. Важно понять этот раздел, прежде чем продолжить здесь.
Однозадачные программы требуют больших интервалов расчета, потому что все расчеты должны выполняться в течение каждого тактового периода. Это может привести к неэффективному использованию доступного времени центрального процессора, как показано на предыдущем рисунке.
Многозадачный режим может улучшить эффективность вашей программы, если модель большая и имеет много блоков, выполняющихся с каждой скоростью.
Однако, если в вашей модели преобладает одна скорость, и только несколько блоков выполняются с меньшей скоростью, многозадачность может фактически снизить эффективность. В такой модели накладные расходы, связанные с переключением задачи, могут быть больше, чем время, необходимое для выполнения более медленных блоков. В этом случае эффективнее выполнять все блоки с доминирующей скоростью.
Если у вас есть модель, которая может извлечь пользу из выполнения многозадачности, вам может потребоваться изменить модель, добавив блоки Rate Transition (или проинструктируйте механизм Simulink), чтобы сгенерировать ожидаемые результаты.
Для получения дополнительной информации о двух режимах выполнения и примерах смотрите Моделирование для однозадачного выполнения и Моделирование для многозадачного выполнения.