Сгенерируйте процедуры обработки прерывания

Чтобы сгенерировать процедуру обработки прерывания (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

Фактический 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);
}

Похожие темы