Из-за того, что подсистема асинхронного вызова функции может прерывать или быть вытеснена другим модельным кодом, возникает несогласованность, когда более одного сигнального элемента соединяется с асинхронным блоком. Проблема заключается в том, что сигналы, переданные в и от подсистемы вызова функции, могут быть в процессе записи или чтения, когда происходит прерывание. Таким образом, используются некоторые старые и некоторые новые данные. Эта ситуация может также происходить со скалярными сигналами в некоторых случаях. Для примера, если сигнал является двойным (8 байт), операция чтения или записи может потребовать двух машинных команд.
Примечание
Методы интегрирования операционных систем, которые показаны в этом разделе, используют один или несколько блоков в vxlib1
библиотека. Эти блоки предоставляют примеры начальной точки, которые помогают вам разрабатывать пользовательские блоки для вашего целевого окружения.
Simulink® Блок Rate Transition предназначен для решения проблем упреждения, которые возникают при передаче данных между блоками, выполняющимися с различными скоростями. Эти вопросы рассматриваются в основанных на времени планировании и генерации кода.
Вы можете автоматически решить проблемы перехода скорости, выбрав Automatically handle rate transition for data transfer параметра configuratoin модели. Это избавляет вас от необходимости вручную вставлять блоки Rate Transition, чтобы избежать недопустимых переходов скорости, включая недопустимые асинхронные к периодическим и асинхронные к асинхронным переходам скорости, в многоскоростных моделях. Для асинхронных задач механизм Simulink конфигурирует вставленные блоки для целостности данных, но не для детерминизма во время передачи данных.
Для асинхронных переходов скорости блок Rate Transition обеспечивает целостность данных, но не может предоставить детерминизм. Поэтому при явной вставке блоков Rate Transition необходимо очистить Ensure deterministic data transfer (maximum delay) параметров блоков.
Когда вы вставляете блок Rate Transition между двумя блоками для поддержания целостности данных, и приоритеты назначаются задачам, сопоставленным с блоками, генератор кода принимает, что задача с более высоким приоритетом может превалировать задачу с более низким приоритетом, а задача с более низким приоритетом не может превентировать задачу с более высоким приоритетом. Если приоритет, связанный с задачей для блока, не присвоен, или приоритеты задач для обоих блоков одинаковы, генератор кода принимает, что любая задача может превентировать другую задачу.
Приоритеты периодических задач присваиваются механизмом Simulink в соответствии с параметрами, заданными в Solver selection разделе панели Solver диалогового окна Параметры конфигурации. Когда параметр 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 (VxWork®) - целевой, clear параметры блоков Higher priority value indicates higher task priority. Параметр Simulink task priority задает приоритет блока относительно связанных блоков (в дополнение к присвоению приоритета RTOS сгенерированному коду задачи).
The 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) доступны следующие блоки:
Защищенный блок перехода скорости (reader)
Защищенный блок перехода скорости (средство записи)
Незащищенный блок перехода скорости
Рассмотрим следующую модель, в которой две функции запускают одну и ту же подсистему.
Эти две задачи должны иметь равные приоритеты. Когда приоритеты одинаковы, результат зависит от того, запускаются ли они периодически или асинхронно, а также от настройки диагностики. В следующей таблице и примечаниях описываются эти результаты:
Поддерживаемые шаги расчета и приоритет для подсистемы вызова функции с несколькими триггерами
Асинхронный приоритет = 1 | Асинхронный приоритет = 2 | Асинхронный приоритет не задан | Периодический приоритет = 1 | Периодический приоритет = 2 | |
---|---|---|---|---|---|
Асинхронный приоритет = 1 | Поддерживается (1) | ||||
Асинхронный приоритет = 2 | Поддерживается (1) | ||||
Асинхронный приоритет не задан | Поддерживается (2) | ||||
Периодический приоритет = 1 | Поддержанный | ||||
Периодический приоритет = 2 | Поддержанный |
Управляйте этими результатами с помощью параметра Tasks with equal priority модели configuratoin; установите эту диагностику равной 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 обновляет одну и ту же переменную тактового сигнала от аппаратного синхроимпульса.
Размер слова переменной тактового сигнала может быть установлен непосредственно или установлен в соответствии с настройкой параметра конфигурации модели и разрешением таймера Application lifespan (days) заданным S-функциями TriggerA и TriggerB (которые должны быть одинаковыми). Дополнительные сведения см. в разделах Таймеры в асинхронных задачах и Управление выделением памяти для счетчиков времени.
volatile
Ключевое словоКогда вы выбираете параметры блоков Ensure data integrity during data transfer, код, сгенерированный для блока Rate Transition, определяет volatile
глобальные буферы и семафоры и использует их для защиты целостности переданных данных. Для дополнительной защиты или для защиты без блока Rate Transition можно явным образом применить volatile
к переданным данным. Для получения дополнительной информации смотрите Protect Global Data with const and volatile Type Qualifiers (Embedded Coder).