Чтобы сгенерировать процедуру обработки прерывания (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
одновременно.)
В сгенерированном коде для демонстрационной модели,
Блоки Ground предоставляют входные сигналы блоку Environment Controller
Блок Async Interrupt не использует свой вход симуляции
Земля блокирует вход управления накопителями блока Environment Controller, таким образом, код не сгенерирован для того пути прохождения сигнала. Генератор кода не производит код для блоков, которые управляют входом управления симуляцией с блоком Environment Controller, потому что тот путь не выбран во время генерации кода. Однако шаги расчета управления блоками для входа симуляции с блоком Environment Controller способствуют шагам расчета, поддержанным в сгенерированном коде. Чтобы избежать включая ненужные шаги расчета в сгенерированном коде, используйте шаги расчета блоков, управляющих входом симуляции в модели, где сгенерированный код предназначается.
Автономные функции установлены как ISRs, и таблица векторов прерываний следующие:
Смещение | |
---|---|
192 | &isr_num1_vec192() |
193 | &isr_num2_vec193() |
Считайте код сгенерированным из этой модели, принимая, что параметры блоков Async Interrupt сконфигурированы как показано в следующей фигуре.
В сгенерированном коде блок 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_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); }