Чтобы создать подпрограмму обслуживания прерываний (ISR), связанную с определенным уровнем прерывания VME для примера RTOS (VxWorks ®), используйте блок асинхронного прерывания. Блок асинхронного прерывания включает указанный уровень прерывания и устанавливает ISR, вызывающий подсистему вызова подключенной функции.
В моделировании можно также использовать блок асинхронного прерывания. Он предоставляет входной порт, который может быть активизирован и подключен к моделируемому источнику прерываний.
Примечание
Методы интеграции операционной системы, показанные в этом разделе, используют один или несколько блоков в vxlib1 библиотека. Эти блоки содержат начальные примеры, помогающие разрабатывать пользовательские блоки для целевой среды.
Чтобы создать ISR, подключите выход блока асинхронного прерывания к управляющему входу
Подсистема вызова функции
Вход блока синхронизации задач
Вход в диаграмму Stateflow ®, настроенную для события ввода вызова функции
На следующем рисунке показан блок асинхронных прерываний, сконфигурированный для обслуживания двух источников прерываний. Выходы (ширина сигнала 2) соединены с двумя подсистемами вызова функций.

Обратите внимание на следующие требования и ограничения:
Блок асинхронных прерываний поддерживает прерывания VME с 1 по 7.
Блок асинхронного прерывания использует следующие системные вызовы примера RTOS (VxWorks):
sysIntEnable
sysIntDisable
intConnect
intLock
intUnlock
tickGet
Выполнение больших подсистем на уровне прерываний может оказать значительное влияние на время отклика на прерывания для прерываний равного и более низкого приоритета в системе. Как правило, лучше всего сохранять ИСР как можно короче. Подключение к блоку асинхронного прерывания только подсистем вызова функций, содержащих небольшое количество блоков.
Лучшим решением для больших подсистем является использование блока синхронизации задач для синхронизации выполнения подсистемы вызова функций с задачей RTOS. Блок синхронизации задач размещается между блоком асинхронного прерывания и подсистемой вызова функции. Затем блок асинхронного прерывания устанавливает блок синхронизации задач в качестве ISR. ISR освобождает семафор синхронизации (выполняет semGive) к задаче и немедленно возвращается с уровня прерывания. Затем задача планируется и выполняется с помощью примера RTOS (VxWorks). Дополнительные сведения см. в разделе Запуск и синхронизация выполнения задачи RTOS.
В этом разделе описывается двухмодельный подход к разработке и внедрению систем реального времени, включающих ISR. В этом подходе разрабатывается одна модель, включающая завод и контроллер для моделирования, и другая модель, включающая только контроллер для генерации кода. С помощью библиотеки Simulink ® можно одновременно вносить изменения в обе модели. На следующем рисунке показано, как изменения, внесенные в установку или контроллер, оба из которых находятся в библиотеке, распространяются на модели.
Использование блока асинхронных прерываний в двух моделях для моделирования и генерации кода

Также возможен одномодельный подход. В этом подходе компонент Plant модели активен только при моделировании. Во время генерации кода компоненты установки эффективно выключаются из системы, и код генерируется только для блоков прерываний и управляющих частей модели. Пример этого подхода см. в rtwdemo_async модель.
Следующая блок-схема показывает простую модель, которая иллюстрирует двухмодельный подход к моделированию. Во время моделирования блоки генератора импульсов обеспечивают моделируемые сигналы прерывания.

Моделируемые сигналы прерывания направляются через входной порт блока асинхронного прерывания. Получив смоделированное прерывание, блок вызывает подключенную подсистему.
Во время моделирования подсистемы, подключенные к выходам блока асинхронных прерываний, выполняются в порядке их приоритета в примере RTOS (VxWorks). В случае, если два или более сигнала прерывания возникают одновременно, блок асинхронного прерывания выполняет нисходящие системы в порядке, заданном их уровнями прерывания (уровень 7 получает наивысший приоритет). Первый входной элемент соответствует первому выходному элементу.
Можно также использовать блок асинхронного прерывания в моделировании без включения ввода моделирования. В таком случае блок асинхронного прерывания наследует базовую скорость модели и вызывает подключенные подсистемы в порядке их приоритетов в RTOS. (В этом случае блок асинхронного прерывания ведет себя так, как если бы все входы получали 1 одновременно.)
В созданном коде для образца модели
Блоки заземления подают входные сигналы в блок контроллера окружающей среды
Блок асинхронного прерывания не использует свои входные данные моделирования
Наземные блоки управляют входом блока контроллера окружающей среды, поэтому код не генерируется для этого сигнального тракта. Генератор кода не создает код для блоков, которые управляют вводом управления имитацией в блок контроллера среды, поскольку этот путь не выбран во время создания кода. Однако время выборки блоков управления для ввода моделирования в блок контроллера среды влияет на время выборки, поддерживаемое в сгенерированном коде. Чтобы избежать включения ненужных значений времени выборки в создаваемый код, используйте значения времени выборки блоков, задающих входные данные моделирования в модели, для которой предназначен создаваемый код.

Автономные функции устанавливаются как ISR, и таблица векторов прерываний выглядит следующим образом:
| Смещение | |
|---|---|
| 192 | &isr_num1_vec192() |
| 193 | &isr_num2_vec193() |
Рассмотрим код, созданный в этой модели, при условии, что параметры блока асинхронного прерывания настроены, как показано на следующем рисунке.

В сгенерированном коде блок асинхронного прерывания устанавливает код в блоках подсистемы в качестве процедур обслуживания прерываний. Векторы прерываний для IRQ1 и IRQ2 хранятся в местоположениях 192 и 193 относительно базы таблицы векторов прерываний, как определено параметром (ами) смещения векторов прерываний VME.
Для установки ISR требуется два вызова RTOS (VxWorks), int_connect и sysInt_Enable. Блок асинхронного прерывания вставляет эти вызовы в , как показано на следующем рисунке кода.model_initialize
/* VxWorks Interrupt Block: '<Root>/Async Interrupt' */
/* Connect and enable ISR function: isr_num1_vec192 */
if( intConnect(INUM_TO_IVEC(192), isr_num1_vec192, 0) != OK) {
printf("intConnect failed for ISR 1.\n");
}
sysIntEnable(1);
/* VxWorks Interrupt Block: '<Root>/Async Interrupt' */
/* Connect and enable ISR function: isr_num2_vec193 */
if( intConnect(INUM_TO_IVEC(193), isr_num2_vec193, 0) != OK)
{
printf("intConnect failed for ISR 2.\n");
}
sysIntEnable(2);Аппаратное обеспечение, генерирующее прерывание, не настроено блоком асинхронного прерывания. Как правило, источником прерываний является плата ввода-вывода VME, которая генерирует прерывания для определенных событий (например, для окончания аналого-цифрового преобразования). Уровень и вектор прерывания VME устанавливаются в регистрах или с помощью перемычек на плате. Вы можете использовать mdlStart подпрограмма написанного пользователем драйвера устройства (S-функция) для настройки регистров и разрешения генерации прерываний на плате. Необходимо сопоставить уровень и вектор прерывания, указанные в диалоговом окне блока асинхронного прерывания, с уровнем и вектором, установленными на плате ввода-вывода.
Фактический ISR, созданный для IRQ1 в RTOS (VxWorks) приведен ниже.
/* VxWorks Interrupt Block: '<Root>/Async Interrupt' */
void isr_num1_vec192(void)
{
int_T lock;
FP_CONTEXT context;
/* Use tickGet() as a portable tick counter example.
A much higher resolution can be achieved with a
hardware counter */
Async_Code_M->Timing.clockTick2 = tickGet();
/* disable interrupts (system is configured as non-ive) */
lock = intLock();
/* save floating point context */
fppSave(&context);
/* Call the system: <Root>/Subsystem A */
Count(0, 0);
/* restore floating point context */
fppRestore(&context);
/* re-enable interrupts */
intUnlock(lock);
}Есть несколько особенностей ISR, которые следует отметить:
Из-за установки параметра Preemption Flag (s) этот ISR заблокирован; то есть оно не может быть вытеснено прерыванием с более высоким приоритетом. ISR блокируется и разблокируется в примере RTOS (VxWorks) int_lock и int_unlock функции.
Подключенная подсистема, Count, вызывается из ISR.
Count функция выполняет алгоритмический (модельный) код. Поэтому контекст с плавающей запятой сохраняется и восстанавливается при вызове Count.
ISR поддерживает свой собственный счетчик абсолютного времени, который отличается от других периодических счетчиков базовой скорости или субскоростей в системе. Данные синхронизации поддерживаются для использования любых блоков, выполняемых в пределах ISR, которые требуют абсолютного или истекшего времени.
Дополнительные сведения см. в разделе Таймеры в асинхронных задачах.
Функция завершения модели отключает прерывания в RTOS (VxWorks):
/* Model terminate function */
void Async_Code_terminate(void)
{
/* VxWorks Interrupt Block: '<Root>/Async Interrupt' */
/* Disable interrupt for ISR system: isr_num1_vec192 */
sysIntDisable(1);
/* VxWorks Interrupt Block: '<Root>/Async Interrupt' */
/* Disable interrupt for ISR system: isr_num2_vec193 */
sysIntDisable(2);
}