RTX – расширение реального времени для Windows NT

       

Прерывания


Системы реального времени должны уметь работать с внешними устройствами. Часто желательно, чтобы real-time процесс непосредственно обрабатывал прерывания, исходящие от устройства. Эта возможность, наряду с прямым вводом-выводом и функциями проецирования памяти, позволяет пользовательскому процессу полностью контролировать устройство, исключая, таким образом необходимость написания драйвера, работающего в режиме ядра.

Управление прерываниями

Интерфейсы RTX-функций управления прерываниями позволяют приложению обслужить прерывания от устройств, соединенных с компьютером. Как и в случае процедуры-обработчика срабатывания таймера, Вы можете назначить прерыванию процедуру-обработчик.  

Win32 и RTSS процессы могут назначить такую процедуру-обработчик с помощью функции RtAttachInterruptVector. Приоритет, присвоенный потоку-обработчику, определяет приоритет исполнения обработчика прерывания в Win32 и RTSS подсистемах.  

Когда обработчик прерывания присоединяется к прерыванию, создается поток, который будет исполняться при возникновении прерывания. Процедура-обработчик прерывания в RTX аналогична Interrupt Service Routine (ISR) в драйвере устройства. Когда возникает прерывание, его источник маскируется, и, если приоритет поток-обработчик прерывания выше, чем у потока, исполняющегося в настоящий момент, начинает выполняться поток-обработчик. После возврата из обработчика источник прерываний демаскируется и поток-обработчик подвешивается (suspended).

API

Следующие функции служат для доступа к RTX-службам прерываний:

RtAttachInterruptVector – назначает поток – обработчик указанному прерыванию

RtReleaseInterruptVector - “отсоединяет” обработчик от прерывания, освобождая таким образом прерывание

RtEnableInterrupts - разрешает обработку всех прерываний, которые присоединены к процессу

RtDisableInterrupts - запрещает обработку всех прерываний, которые присоединены к процессу

Общие замечания по программированию

  • Поток-обработчик может быть в любой момент вытеснен потоком с большим приоритетом
  • Можно запретить обработку некоторых прерываний, присоединенных к RTX процессу подняв приоритет исполняющегося в настоящий момент потока.
  • Обработчик прерывания, освобождающий объект, может удовлетворить условиям wait-функции потока с более высоким приоритетом. В этом случае возобновится выполнение потока с более высоким приоритетом и завершение обработчика отложится, все это время прерывание будет маскировано
  • Прерывания от таймера никогда не маскируются прерываниями с более высоким приоритетом, поэтому они являются по существу, прерываниями с самым высоким приоритетом. Но эти прерывания маскируются с помощью RtDisableInterrupts.

  • Замечания по программированию в Win32 подсистеме

  • Все процессы RTSS подсистемы имеют приоритет над всеми процессами Win32 подсистемы, поэтому любая критичная по времени обработка прерываний должна осуществляться обработчиком, исполняющимся как RTSS, а не Win32 процесс.
  • RTX-потоки прерываний в Win32 подсистеме ставятся в очередь планировщиком Windows NT. Это может привести к недетерминистичным задержкам в исполнении обработчика прерываний.


  • Использование RtAttachInterruptVector

    Для присоединения вектора прерывания к обработчику надо воспользоваться функцией RtAttachInterruptVector. При вызове надо указать параметры шины. Для шин с автоматической конфигурацией, таких как PCI, можно получить информацию о параметрах из регистра Windows NT, в котором находятся присвоенные устройству значения ресурсов шины. Для ISA или PC internal bus параметры необходимо указывать вручную.  

    Использование RtReleaseInterruptVector

    В отличие от выгрузки драйвера, RTX-приложение может завершить работу и оставить работающее устройство, пытающееся передать прерывания потоку-обработчику. Хотя библиотека RTX обычно производит очистку за завершившимся приложением, случается, что завершающееся приложение может завершиться незаметно для библиотеки. Во избежании таких ситуаций надо использовать функцию RtReleaseInterruptVector, которая отсоединяет ранее присоединенное прерывание.

    демонстрирует работу с прерываниями и портами ввода/вывода.


    Содержание раздела