Поскольку подсистема асинхронного вызова функций может вытеснять или вытеснять другой код модели, несогласованность возникает, когда к асинхронному блоку подключено более одного сигнального элемента. Проблема заключается в том, что сигналы, передаваемые в подсистему вызова функций и исходящие из нее, могут быть записаны или считаны, когда происходит вытеснение. Таким образом, используются некоторые старые и некоторые новые данные. Эта ситуация также может происходить со скалярными сигналами в некоторых случаях. Например, если сигнал является двойным (8 байт), операция чтения или записи может потребовать двух машинных команд.
Примечание
Методы интеграции операционной системы, показанные в этом разделе, используют один или несколько блоков в vxlib1 библиотека. Эти блоки содержат начальные примеры, помогающие разрабатывать пользовательские блоки для целевой среды.
Блок Simulink ® Rate Transition предназначен для решения проблем вытеснения, возникающих при передаче данных между блоками, работающими на разных скоростях. Эти вопросы обсуждаются в планировании на основе времени и создании кода.
Проблемы изменения скорости можно обрабатывать автоматически, выбрав параметр конфигурации модели Автоматически обрабатывать изменение скорости для передачи данных. Это избавляет вас от необходимости вручную вставлять блоки Rate Transition, чтобы избежать недопустимых переходов скорости, включая недопустимые переходы асинхронной скорости к периодической и асинхронной скорости к асинхронной скорости, в многоскоростных моделях. Для асинхронных задач модуль Simulink настраивает вставленные блоки на целостность данных, но не на детерминизм при передаче данных.
Для асинхронных переходов скорости блок Rate Transition обеспечивает целостность данных, но не может обеспечить детерминизм. Поэтому при явной вставке блоков Rate Transition необходимо очистить параметр блока Обеспечить детерминированную передачу данных (максимальная задержка).
При вставке блока Rate Transition между двумя блоками для поддержания целостности данных, и приоритеты назначаются задачам, связанным с блоками, генератор кода предполагает, что задача с более высоким приоритетом может вытеснить задачу с более низким приоритетом, а задача с более низким приоритетом не может вытеснить задачу с более высоким приоритетом. Если приоритет, связанный с задачей для любого блока, не назначен или приоритеты задач для обоих блоков одинаковы, генератор кода предполагает, что любая задача может вытеснить другую задачу.
Приоритеты периодических задач назначаются механизмом Simulink в соответствии с параметрами, заданными в разделе Выбор решателя (Solver selection) панели Решатель (Solver) диалогового окна Параметры конфигурации (Configuration Parameters). Если для параметра Периодическое ограничение по времени выборки установлено значение Unconstrained, приоритет базовой скорости модели установлен в 40. Приоритеты для субрейтов затем увеличиваются или уменьшаются на 1 от приоритета базовой скорости, в зависимости от установки параметра Более высокое значение приоритета указывает на более высокий приоритет задачи.
Приоритеты можно назначить вручную с помощью параметра Периодические свойства времени выборки. Модуль Simulink не назначает приоритет асинхронным блокам. Например, приоритет подсистемы вызова функции, которая подключается обратно к блоку асинхронного прерывания, назначается блоком асинхронного прерывания.
Параметр блока Приоритет задачи Simulink блока асинхронного прерывания определяет уровень приоритета (обязательный) для каждого номера прерывания, введенного для параметра Номер (ы) прерывания VME. Массив приоритетов устанавливает приоритеты подсистем, подключенных к каждому прерыванию.
Для блока Task Sync, если целью является пример RTOS (VxWorks ®), параметр clear block Higher priority value указывает более высокий приоритет задачи. Приоритет задачи Simulink определяет приоритет блока относительно подключенных блоков (в дополнение к назначению приоритета RTOS сгенерированному коду задачи).
vxlib1 библиотека предоставляет два типа блоков изменения скорости для удобства. Это просто предварительно настроенные экземпляры встроенного блока Simulink Rate Transition:
Блок перехода на защищенную скорость: Блок перехода на скорость, который сконфигурирован с параметром block Убедитесь в целостности данных во время передачи выбранных данных и Убедитесь, что детерминированная передача данных очищена.
Незащищенный блок изменения скорости: Блок изменения скорости, настроенный с очищенной функцией обеспечения целостности данных во время передачи данных.
Для переходов скорости, связанных с асинхронными задачами, можно поддерживать целостность данных. Однако детерминизма достичь нельзя. Имеется возможность использования блока Rate Transition или целевых блоков Rate Transition.
Рассмотрим следующую модель, которая включает блок Rate Transition.

Блок Rate Transition можно использовать в любом из следующих режимов:
Поддержание целостности данных, отсутствие детерминизма
Незащищенный
Кроме того, можно использовать специфичные для цели блоки изменения скорости. Для примера RTOS (VxWorks) доступны следующие блоки:
Блок перехода с защищенной скоростью (считыватель)
Блок перехода с защищенной скоростью (устройство записи)
Незащищенный блок изменения скорости
Рассмотрим следующую модель, в которой две функции запускают одну и ту же подсистему.

Эти две задачи должны иметь равные приоритеты. Когда приоритеты одинаковы, результат зависит от того, срабатывают ли они периодически или асинхронно, а также от настройки диагностики. В следующей таблице и примечаниях описаны эти результаты:
Поддерживаемый пример времени и приоритета для подсистемы вызова функции с несколькими триггерами
Асинхронный приоритет = 1 | Асинхронный приоритет = 2 | Не указан асинхронный приоритет | Периодический приоритет = 1 | Периодический приоритет = 2 | |
|---|---|---|---|---|---|
Асинхронный приоритет = 1 | Поддерживается (1) | ||||
Асинхронный приоритет = 2 | Поддерживается (1) | ||||
Не указан асинхронный приоритет | Поддерживается (2) | ||||
Периодический приоритет = 1 | Поддержанный | ||||
Периодический приоритет = 2 | Поддержанный |
Управление этими результатами с помощью параметра конфигурации модели Задачи с одинаковым приоритетом; установить для этой диагностики значение none если задачи с равным приоритетом не могут вытеснить друг друга в целевой системе.
В этом случае безусловно выдается следующее предупреждающее сообщение:
The function call subsystem <name> has multiple asynchronous triggers that do not specify priority. Data integrity will not be maintained if these triggers can preempt one another.
Пустые ячейки в приведенной выше таблице представляют несколько триггеров с различными приоритетами, которые не поддерживаются.
Генератор кода обеспечивает управление абсолютным временем для подсистемы вызова функции, подключенной к множеству прерываний в случае, когда настройки таймера для TriggerA и TriggerB (источник времени, разрешение) одинаковы.
Предположим, что для модели, показанной выше, выполняются все следующие условия:
Подсистема вызова функции запускается двумя асинхронными триггерами (TriggerA и TriggerB), имеющими одинаковые установки приоритета.
Каждый триггер задает источник атрибутов времени и таймера путем вызова функций ssSetTimeSource и ssSetAsyncTimerAttributes.
Запускаемая подсистема содержит блок, которому требуется прошедшее или абсолютное время (например, дискретный интегратор времени).
Подсистема асинхронного вызова функций имеет одну глобальную переменную, clockTick# (где # - идентификатор задачи, связанный с подсистемой). Эта переменная сохраняет абсолютное время для асинхронной задачи. Существует два способа обработки синхронизации:
Если для источника времени установлено значение SS_TIMESOURCE_BASERATE, генератор кода создает код таймера в подсистеме вызова функции, обновляя переменную такта из такта базовой скорости. Целостность данных поддерживается, если один и тот же приоритет присвоен TriggerA и TriggerB.
Если источник времени SS_TIMESOURCE_SELF, сгенерированный код как для TriggerA, так и для TriggerB обновляет одну и ту же переменную тактовых импульсов из аппаратных тактовых импульсов.
Размер слова переменной clock tick можно задать непосредственно или установить в соответствии с настройкой параметра конфигурации модели Application life (days) и разрешением таймера, установленным S-функциями TriggerA и TriggerB (которые должны быть одинаковыми). Дополнительные сведения см. в разделе Таймеры в асинхронных задачах и управление выделением памяти для счетчиков времени.
volatile Ключевое словоПри выборе параметра блока Обеспечение целостности данных во время передачи данных код, сгенерированный для блока перехода скорости, определяет volatile глобальные буферы и семафоры и используют их для защиты целостности передаваемых данных. Для дополнительной защиты или для защиты без блока Rate Transition можно явно применить volatile к переданным данным. Дополнительные сведения см. в разделе Защита глобальных данных с помощью квалификаторов типа const и volative (Embedded Coder).