Чтобы сгенерировать процедуру обработки прерывания (ISR), сопоставленную с определенным уровнем прерывания VME для примера RTOS (VxWorks®), используйте блок Async Interrupt. Блок Async Interrupt включает заданный уровень прерывания и устанавливает ISR, который вызывает связанную подсистему вызова функции.
Можно также использовать блок Async Interrupt в симуляции. Это обеспечивает входной порт, который может быть включен и соединен с моделируемым источником прерывания.
Методы интегрирования операционной системы, которые продемонстрированы в этом разделе, используют один или несколько блоков блоки в библиотеке vxlib1
(Simulink Coder). Эти блоки обеспечивают примеры отправной точки, чтобы помочь вам разработать авторские блоки для своего целевого окружения.
Чтобы сгенерировать ISR, соедините вывод блока Async Interrupt к входу управления
Подсистема вызова функции
Вход блока Task Sync
Вход к графику Stateflow®, сконфигурированному для вызова функции, ввел событие
Следующие данные показывают блок Async Interrupt, сконфигурированный, чтобы обслужить два источника прерывания. Выходные параметры (ширина сигнала 2) соединяются с двумя подсистемами вызова функции.
Отметьте следующие требования и ограничения:
Блок Async Interrupt поддерживает прерывания 1 - 7 VME.
Блок Async Interrupt использует следующие системные вызовы для примера RTOS (VxWorks):
sysIntEnable
sysIntDisable
intConnect
intLock
intUnlock
tickGet
Выполнение больших подсистем на уровне прерывания может оказать значительное влияние на время отклика прерывания для прерываний равного и более низкого приоритета в системе. Как правило, лучше сохранять ISRs максимально коротким. Соедините только подсистемы вызова функции, которые содержат небольшое количество блоков к блоку Async Interrupt.
Лучшее решение для больших подсистем состоит в том, чтобы использовать блок Task Sync, чтобы синхронизировать выполнение подсистемы вызова функции к задаче RTOS. Блок Task Sync помещается между блоком Async Interrupt и подсистемой вызова функции. Блок Async Interrupt затем устанавливает блок Task Sync как ISR. ISR выпускает семафор синхронизации (выполняет semGive
) к задаче, и сразу возвращается из уровня прерывания. Задача затем планируется и запускается примером RTOS (VxWorks). Смотрите Икру и Синхронизируйте Выполнение Задачи RTOS для получения дополнительной информации.
В этом разделе описываются двойной образцовый подход к разработке и реализации систем реального времени, которые включают ISRs. В этом подходе вы разрабатываете одну модель, которая включает объект и контроллер для симуляции и другую модель, которая только включает контроллер для генерации кода. Пользуясь библиотекой Simulink®, можно реализовать изменения в обеих моделях одновременно. Следующие данные показывают, как изменения сделали к объекту или контроллеру, оба из которых находятся в библиотеке, распространены к моделям.
Двойное образцовое использование асинхронного блока прерывания для симуляции и генерации кода
Одно-образцовый подход также возможен. В этом подходе компонент Объекта модели активен только в симуляции. Во время генерации кода компоненты Объекта эффективно переключаются из системы, и код сгенерирован только для блока прерывания и частей контроллера модели. Для примера этого подхода см. модель rtwdemo_async
.
Следующая блок-схема показывает простую модель, которая иллюстрирует двойной образцовый подход к моделированию. Во время симуляции Импульсные блоки Генератора обеспечивают моделируемые сигналы прерывания.
Моделируемые сигналы прерывания направляются через входной порт блока Async Interrupt. После получения моделируемого прерывания блок вызывает связанную подсистему.
Во время симуляции подсистемы соединились с блоком Async Interrupt, выходные параметры выполняются в порядке их приоритета в примере RTOS (VxWorks). Если два или больше сигнала прерывания происходят одновременно, блок Async Interrupt выполняет нисходящие системы в порядке, заданном их уровнями прерывания (уровень 7 получает самый высокий приоритет). Первый входной элемент сопоставляет с первым выходным элементом.
Можно также использовать блок Async Interrupt в симуляции, не включая вход симуляции. В таком случае блок Async Interrupt наследовал базовую ставку модели и вызывает связанные подсистемы в порядке их приоритетов в RTOS. (В этом случае блок Async Interrupt ведет себя, как будто все входные параметры получили 1
одновременно.)
В сгенерированном коде для демонстрационной модели,
Основывайтесь блоки предоставляют входные сигналы блоку Environment Controller
Блок Async Interrupt не использует свой вход симуляции
Земля блокирует вход управления накопителями блока Environment Controller, таким образом, код не сгенерирован для того пути прохождения сигнала. Генератор кода не производит код для блоков, которые управляют входом управления симуляцией к блоку Environment Controller, потому что тот путь не выбран во время генерации кода. Однако шаги расчета управления блоками для входа симуляции к блоку Environment Controller способствуют шагам расчета, поддержанным в сгенерированном коде. Чтобы избежать включая ненужные шаги расчета в сгенерированном коде, используйте шаги расчета блоков, управляющих входом симуляции в модели, где сгенерированный код предназначается.
Автономные функции установлены как ISRs, и таблица векторов прерываний следующие:
Смещение | |
---|---|
192 | &isr_num1_vec192() |
193 | &isr_num2_vec193() |
Считайте код сгенерированным из этой модели, принимая, что Асинхронные параметры блоков Прерывания сконфигурированы как показано в следующей фигуре.
В сгенерированном коде блок Async Interrupt устанавливает код в блоках Subsystem как процедуры обработки прерывания. Векторы прерывания для IRQ1
и IRQ2
хранятся в местоположениях 192
и 193
относительно основы таблицы векторов прерываний, как задано параметром VME interrupt vector offset(s).
Установка ISR требует двух RTOS (VxWorks) вызовы, int_connect
и sysInt_Enable
. Блок Async Interrupt вставляет эти вызовы в функцию
, как показано в следующую выборку кода.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);
Оборудование, которое генерирует прерывание, не сконфигурировано блоком Async Interrupt. Как правило, источник прерывания является платой ввода-вывода VME, которая генерирует прерывания для определенных событий (например, конец преобразования A/D). Уровень прерывания VME и вектор настраиваются в регистрах или при помощи перемычек на плате. Можно использовать стандартную программу mdlStart
написанного пользователем драйвера устройства (S-функция), чтобы настроить регистры и включить генерацию прерывания на плате. Необходимо совпадать с уровнем прерывания и вектором, заданным в диалоговом окне блока Async Interrupt к уровню и вектору, настроенному на плате ввода-вывода.
Фактический 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_unlock
и int_lock
.
Связанная подсистема, 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); }