Переходы уровня и асинхронные блоки

Поскольку асинхронная подсистема вызова функции может вытеснить или быть вытеснена другим типовым кодексом, несоответствие возникает, когда больше чем один элемент сигнала соединяется с асинхронным блоком. Проблема - то, что сигналы передали, и от вызова функции подсистема может быть в процессе того, чтобы быть записанным в или читать из того, когда вытеснение происходит. Таким образом некоторые старые и некоторые новые данные используются. Эта ситуация может также произойти со скалярными сигналами в некоторых случаях. Например, если сигнал является двойным (8 байтов), операция чтения или операция записи могут потребовать двух машинных команд.

Примечание

Методы интегрирования операционной системы, которые продемонстрированы в этом разделе, используют один или несколько блоков блоки в библиотеке vxlib1 (Simulink Coder). Эти блоки обеспечивают примеры отправной точки, чтобы помочь вам разработать авторские блоки для своего целевого окружения.

О переходах уровня и асинхронных блоках

Блок Simulink® Rate Transition разработан, чтобы иметь дело с проблемами вытеснения, которые происходят в передаче данных между блоками, запускающимися на различных уровнях. Эти вопросы обсуждаются в Основанном на времени Планировании и Генерации кода (Simulink Coder).

Можно обработать проблемы перехода уровня автоматически путем выбора параметра Automatically handle rate transition for data transfer на панели Solver диалогового окна Configuration Parameters. Это избавляет вас от необходимости вручную вставить блоки Перехода Уровня, чтобы избежать недопустимых переходов уровня, включая недопустимые асинхронные-к-периодическому и асинхронные-к-асинхронному переходы уровня, в многоскоростных моделях. Для асинхронных задач механизм Simulink конфигурирует вставленные блоки для целостности данных, но не детерминизма во время передач данных.

Для асинхронных переходов уровня блок Rate Transition обеспечивает целостность данных, но не может обеспечить детерминизм. Поэтому, когда вы вставляете блоки Перехода Уровня явным образом, необходимо снять флажок Ensure data determinism в диалоговом окне Block Parameters.

Когда вы вставляете блок Rate Transition между двумя блоками, чтобы поддержать целостность данных, и приоритеты присвоены задачам, сопоставленным с блоками, генератор кода принимает, что более высокая приоритетная задача может вытеснить более низкую приоритетную задачу, и более низкая приоритетная задача не может вытеснить более высокую приоритетную задачу. Если приоритет, сопоставленный с задачей или для блока, не присвоен или для приоритеты задач для обоих блоков, то же самое, генератор кода принимает, что любая задача может вытеснить другую задачу.

Приоритеты периодических задач присвоены механизмом Simulink, в соответствии с опциями, заданными в разделе Solver selection панели Solver диалогового окна Configuration Parameters. Когда поле опции Periodic sample time constraint Solver selection установлено в Unconstrained, приоритет базовой ставки модели установлен в 40. Приоритеты для подуровней затем постепенно увеличиваются или постепенно уменьшаются 1 от приоритета базовой ставки, в зависимости от установки Higher priority value indicates higher task priority option.

Можно присвоить приоритеты вручную при помощи поля 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

    

Поддерживаемый

  1. Управляйте этими результатами с помощью опции Tasks with equal priority в панели Diagnostics диалогового окна Configuration Parameters; установите эту диагностику на none, если задачи равного приоритета не могут вытеснить друг друга в целевой системе.

  2. Для этого случая следующее предупреждающее сообщение выпущено безусловно:

    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) (Simulink) и разрешению таймера, установленному S-функциями TriggerA и TriggerB (который должен быть тем же самым). Смотрите Таймеры в Асинхронных Задачах и Выделении Управляющей памяти для Счетчиков времени для получения дополнительной информации.

Защитите целостность данных с ключевым словом volatile

Когда вы выбираете Ensure data integrity during data transfer, код, сгенерированный для блока Rate Transition, задает глобальные буферы volatile и семафоры и использует их, чтобы защитить целостность переданных данных. Для дополнительной защиты, или для защиты без блока Rate Transition, можно явным образом применить volatile к переданным данным. Для получения дополнительной информации смотрите, Защищают Глобальные данные с const и энергозависимыми Спецификаторами Типа.

Похожие темы