Поскольку асинхронная подсистема вызова функции может вытеснить или быть вытеснена другим типовым кодексом, несоответствие возникает, когда больше чем один элемент сигнала соединяется с асинхронным блоком. Проблема - то, что сигналы передали, и от вызова функции подсистема может быть в процессе того, чтобы быть записанным в или читать из того, когда вытеснение происходит. Таким образом некоторые старые и некоторые новые данные используются. Эта ситуация может также произойти со скалярными сигналами в некоторых случаях. Например, если сигнал является двойным (8 байтов), операция чтения или операция записи могут потребовать двух машинных команд.
Примечание
Методы интегрирования операционной системы, которые продемонстрированы в этом разделе, используют один или несколько блоков блоки в vxlib1
библиотека. Эти блоки обеспечивают примеры начальной точки, чтобы помочь вам разработать пользовательские блоки для своего целевого окружения.
Блок Simulink® Rate Transition спроектирован, чтобы иметь дело с проблемами вытеснения, которые происходят в передаче данных между блоками, запускающимися на различных уровнях. Эти вопросы обсуждаются в Основанном на времени Планировании и Генерации кода.
Можно обработать проблемы перехода уровня автоматически путем выбора модели configuratoin параметр Automatically handle rate transition for data transfer. Это избавляет вас от необходимости вручную вставить блоки Перехода Уровня, чтобы избежать недопустимых переходов уровня, включая недопустимые асинхронные-к-периодическому и асинхронные-к-асинхронному переходы уровня, в многоскоростных моделях. Для асинхронных задач механизм Simulink конфигурирует вставленные блоки для целостности данных, но не детерминизма во время передач данных.
Для асинхронных переходов уровня блок Rate Transition обеспечивает целостность данных, но не может обеспечить детерминизм. Поэтому, когда вы вставляете блоки Перехода Уровня явным образом, необходимо очистить параметры блоков Ensure deterministic data transfer (maximum delay).
Когда вы вставляете блок Rate Transition между двумя блоками, чтобы обеспечить целостность данных, и приоритеты присвоены задачам, сопоставленным с блоками, генератор кода принимает, что более высокая приоритетная задача может вытеснить более низкую приоритетную задачу, и более низкая приоритетная задача не может вытеснить более высокую приоритетную задачу. Если приоритет, сопоставленный с задачей или для блока, не присвоен или для приоритеты задач для обоих блоков, то же самое, генератор кода принимает, что любая задача может вытеснить другую задачу.
Приоритеты периодических задач присвоены механизмом Simulink, в соответствии с параметрами, заданными в разделе Solver selection панели Solver диалогового окна Configuration Parameters. Когда параметр Periodic sample time constraint устанавливается на Unconstrained
, приоритет базовой ставки модели установлен в 40
. Приоритеты для подуровней затем постепенно увеличиваются или постепенно уменьшаются 1
от приоритета базовой ставки, в зависимости от установки параметра Higher priority value indicates higher task priority.
Можно присвоить приоритеты вручную при помощи параметра Periodic sample time properties. Механизм Simulink не присваивает приоритет асинхронным блокам. Например, приоритет подсистемы вызова функции, которая соединяется назад с блоком Async Interrupt, присвоен блоком Async Interrupt.
Параметры блоков Simulink task priority блока Async Interrupt задает приоритетный уровень (требуемый) для каждого номера прерывания, ввели для параметра VME interrupt number(s). Приоритетный массив устанавливает приоритеты подсистем, соединенных с каждым прерыванием.
Для блока Task Sync, если пример RTOS (VxWorks®) является целью, ясные параметры блоков Higher priority value indicates higher task priority. Параметр Simulink task priority задает приоритет блока относительно связанных блоков (в дополнение к присвоению приоритета RTOS к сгенерированному коду задачи).
vxlib1
библиотека обеспечивает два типа блоков перехода уровня как удобство. Это просто предварительно сконфигурированные экземпляры встроенного блока Simulink Rate Transition:
Блок Protected Rate Transition: блок Rate Transition, который сконфигурирован с параметрами блоков выбранный Ensure data integrity during data transfers и очищенный Ensure deterministic data transfer.
Незащищенный блок Rate Transition: блок Rate Transition, который сконфигурирован с очищенным Ensure data integrity during data transfers.
Для переходов уровня, которые включают асинхронные задачи, можно обеспечить целостность данных. Однако вы не можете достигнуть детерминизма. У вас есть опция использования блока Rate Transition или целевых блоков перехода уровня.
Рассмотрите следующую модель, которая включает блок Rate Transition.
Можно использовать блок Rate Transition в любом из следующих режимов:
Обеспечьте целостность данных, никакой детерминизм
Незащищенный
В качестве альтернативы можно использовать целевые блоки перехода уровня. Следующие блоки доступны для примера RTOS (VxWorks):
Защищенный блок Rate Transition (читатель)
Защищенный блок Rate Transition (средство записи)
Незащищенный блок Rate Transition
Рассмотрите следующую модель, в которой две функции инициировали ту же подсистему.
Эти две задачи должны иметь равные приоритеты. Когда приоритеты являются тем же самым, результат зависит от того, стреляют ли они периодически или асинхронно, и также на диагностической установке. Следующая таблица и примечания описывают эти результаты:
Поддерживаемый шаг расчета и приоритет для подсистемы вызова функции с несколькими триггерами
Асинхронный приоритет = 1 | Асинхронный приоритет = 2 | Асинхронный незаданный приоритет | Периодический приоритет = 1 | Периодический приоритет = 2 | |
---|---|---|---|---|---|
Асинхронный приоритет = 1 | Поддерживаемый (1) | ||||
Асинхронный приоритет = 2 | Поддерживаемый (1) | ||||
Асинхронный незаданный приоритет | Поддерживаемый (2) | ||||
Периодический приоритет = 1 | Поддерживаемый | ||||
Периодический приоритет = 2 | Поддерживаемый |
Управляйте этими результатами при помощи модели configuratoin параметр Tasks with equal priority ; установите эту диагностику на 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#
(где #
ID задачи, сопоставленный с подсистемой). Эта переменная хранит абсолютное время для асинхронной задачи. Существует два способа синхронизировать, может быть обработан:
Если источник времени установлен в SS_TIMESOURCE_BASERATE
, генератор кода производит код таймера в подсистеме вызова функции, обновляя переменную такта системных часов из такта системных часов базовой ставки. Целостность данных обеспечена, если тот же приоритет присвоен TriggerA и TriggerB.
Если источником времени является SS_TIMESOURCE_SELF
, сгенерированный код и для TriggerA и для TriggerB обновляет ту же переменную такта системных часов из аппаратных часов.
Размер слова переменной такта системных часов может быть установлен непосредственно или установлен согласно установке параметра конфигурации модели Application lifespan (days) и разрешение таймера, установленное S-функциями TriggerA и TriggerB (который должен быть тем же самым). Смотрите Таймеры в Асинхронных Задачах и Выделении Управляющей памяти для Счетчиков времени для получения дополнительной информации.
volatile
Ключевое словоКогда вы выбираете параметры блоков Ensure data integrity during data transfer, код, сгенерированный для блока Rate Transition, задает volatile
глобальные буферы и семафоры и используют их, чтобы защитить целостность переданных данных. Для дополнительной защиты, или для защиты без блока Rate Transition, можно явным образом применить volatile
к переданным данным. Для получения дополнительной информации смотрите, Защищают Глобальные данные с const и энергозависимыми Спецификаторами Типа.