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