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

Чтобы сгенерировать процедуру обработки прерывания (ISR), сопоставленную с определенным VME, прерывают уровень для примера RTOS (например, VxWorks®), используйте блок Async Interrupt. Блок Async Interrupt включает заданный уровень прерывания и устанавливает ISR, который вызывает связанную подсистему вызова функции.

Можно также использовать блок Async Interrupt в симуляции. Это обеспечивает входной порт, который можно включить и соединить с симулированным источником прерывания.

Примечание

Методы интегрирования операционной системы, которые продемонстрированы в этом использовании раздела блоки, которые находятся в библиотеке блоков Шаблонов Прерывания. Блоки в той библиотеке обеспечивают примеры начальной точки, чтобы помочь вам разработать пользовательские блоки для целевого окружения.

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

Чтобы сгенерировать ISR, соедините выход блока Async Interrupt к входу управления:

  • Подсистема вызова функции

  • Вход блока Task Sync

  • Вход к Stateflow® график, сконфигурированный для вызова функции, ввел событие

Модель Example rtwdemo_async показывает блок Async Interrupt, который сконфигурирован, чтобы обслужить два источника прерывания. Каждый из этих двух выходных сигналов соединяется с подсистемой вызова функции.

Example model rtwdemo_async, which shows an Async Interrup block configured to service two inputerrupt sources

Требования и ограничения

  • Блок 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 выпускает семафор синхронизации (выполняет a semGive) к задаче, и сразу возвращается из уровня прерывания. Задача затем планируется и запускается RTOS (VxWorks). Смотрите Икру и Синхронизируйте Выполнение Задачи RTOS для получения дополнительной информации.

Подход двойной модели для Разработки Систем реального времени, которые Включают ISRs

При разработке системы реального времени, которая включает ISRs, рассмотрите использование подхода двойного модели. Разработайте одну модель, которая включает объект и контроллер для симуляции и другую модель, которая включает только контроллер для генерации кода. При помощи Simulink® библиотека, можно реализовать изменения в обеих моделях одновременно. Этот рисунок показывает, как изменения сделали к объекту или контроллеру, оба из которых находятся в библиотеке, распространены к моделям.

Использование двойное модели асинхронного блока прерывания для симуляции и генерации кода

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

Подход двойной модели: симуляция

Модель Example rtwdemo_async показывает подход двойной модели к моделированию. В процессе моделирования Импульсные блоки Генератора обеспечивают симулированные сигналы прерывания.

Example model rtwdemo_async, which shows an Async Interrup block configured to service two inputerrupt sources

В процессе моделирования:

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

  • Подсистемы, соединенные с выходными портами блока Async Interrupt, выполняются в порядке их приоритета в RTOS (в этом примере, VxWorks). Если два или больше сигнала прерывания происходят одновременно, блок Async Interrupt выполняет нисходящие системы в порядке, заданном их уровнями прерывания (уровень 7 получает самый высокий приоритет). Первый входной элемент сопоставляет с первым выходным элементом.

Можно использовать блок Async Interrupt в симуляции, не включая вход симуляции. Блок Async Interrupt наследовал базовую ставку модели и вызывает связанные подсистемы в порядке их приоритетов в RTOS. (В этом случае блок Async Interrupt ведет себя, как будто входные параметры получают 1 одновременно.)

Подход двойной модели: генерация кода

В сгенерированном коде для модели в качестве примера:

  • Блоки Ground предоставляют входные сигналы Различному Исходному блоку

  • Блок Async Interrupt не использует свой вход симуляции

Земля блокирует вход управления накопителями Различного Исходного блока, таким образом, генератор кода не производит код для того пути прохождения сигнала. Генератор кода не производит код для блоков, которые управляют входом управления симуляцией к Различному Исходному блоку, потому что тот путь не выбран во время генерации кода. Однако шаги расчета управления блоками для входа симуляции к Различному Исходному блоку способствуют шагам расчета, поддержанным в сгенерированном коде. Чтобы избежать включая ненужные шаги расчета в сгенерированном коде, используйте шаги расчета блоков, управляющих входом симуляции в модели, где сгенерированный код предназначается.

Example model rtwdemo_async, which shows an Async Interrup block configured to service two inputerrupt sources

Генератор кода производит автономные функции для 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, которая генерирует прерывания для определенных событий (например, в конце аналого-цифрового преобразования). Вы настраиваете уровень прерывания 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);
}

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте