Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

На главную -> MyLDP -> Электронные книги по ОС Linux
Цилюрик О.И. Модули ядра Linux
Назад Внутренние механизмы ядра Вперед

Обработчик прерываний, верхняя половина

Прототип функции обработчика прерывания уже показывался выше:

	typedef irqreturn_t (*irq_handler_t)( int irq, void *dev );

где :

- irq — линия IRQ;

- dev — уникальный указатель экземпляра обработчика (именно тот, который передавался последним параметром request_irq() при регистрации обработчика).

Это именно та функция, которая будет вызываться в первую очередь при каждом возникновении аппаратного прерывания. Но это вовсе не означает, что при возврате из этой функции работа по обработке текущего прерывания будет завершена (хотя и такой вариант вполне допустим). Из-за этой «неполноты» такой обработчик и получил название «верхняя половина» обработчика прерывания. Дальнейшие действия по обработке могут быть запланированы эти обработчиком на более позднее время, используя несколько различных механизмов, обобщённо называемых «нижняя половина».

Важно то, что код обработчика верхней половины выполняется при запрещённых последующих прерываниях по линии irq (этой же линии) для того локального процессора, на котором этот код выполняется. А после возврата из этой функции локальные прерывания будут вновь разрешены.

Возвращается значение (<linux/irqreturn.h>):

	typedef int irqreturn_t;
	#define IRQ_NONE        (0)
	#define IRQ_HANDLED     (1)
	#define IRQ_RETVAL(x)   ((x) != 0)

IRQ_HANDLED — устройство прерывания распознано как обслуживаемое обработчиком, и прерывание успешно обработано.

IRQ_NONE — устройство не является источником прерывания для данного обработчика, прерывание должно быть передано далее другим обработчикам, зарегистрированным на данной линии IRQ.

Типичная схема обработчика при этом будет выглядеть так:

	static irqreturn_t intr_handler ( int irq, void *dev ) {
	   if( ! /* проверка того, что обслуживаемое устройство запросило прерывание*/ )
	      return IRQ_NONE;
	   /* код обслуживания устройства */
	   return IRQ_HANDLED;
	}       	

Пока мы не углубились в дальнейшую обработку, производимую в нижней половине, хотелось бы отметить следующее: в ряде случаев (при крайне простой обработке обработке, но, самое главное, отсутствии возможности очень быстрых наступлений повторных прерываний) оказывается вполне достаточно простого обработчика верхней половины, и нет необходимости мудрить со сложно диагностируемыми механизмами отложенной обработки.


Предыдущий раздел: Оглавление Следующий раздел:
Отображение прерываний в /proc   Управление линиями прерывания