Параллельная обработка прерываний для общего прерывания в Linux

Что можно или нужно сделать в верхней части ISR обработчик. Я вижу, что прерывания сначала отключаются, поэтому, когда это будет сделано, не пропустим ли мы другие прерывания (в той же строке IRQ), которые могут появиться при обработке текущего прерывания?

Или существует какая-нибудь «сущность», которая отслеживает пропущенные прерывания, чтобы их можно было обработать после того, как прерывания снова будут включены для этой строки в конце текущего выполняющегося ISR?


person foo_l    schedule 12.03.2013    source источник


Ответы (3)


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

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

person Benjamin Leinweber    schedule 13.03.2013

Обработчик прерывания должен быть минимальным.

Не всегда нужно отключать прерывания. Некоторые архитектуры работают с вложенными прерываниями. В любом случае, если вы отключите прерывания, вы должны сделать это для одной-двух команд, не более. Это создаст задержку и, возможно, пропустит прерывания.

Когда я обрабатываю прерывания, я обычно делаю две вещи. Один из них - сбросить флаг, вызвавший прерывание. Второй - впоследствии запускать некоторые функции (тасклет, очередь работ и т. Д.).

Помните, что нельзя использовать какие-либо методы в обработчике прерывания, который может засыпать, например printf, или получить мьютекс.

person stdcall    schedule 12.03.2013

Вы должны правильно подтвердить прерывание, чтобы избежать штормов IRQ. Обработайте само прерывание - если у вас большая работа, перенесите ее в нижнюю половину.

Что происходит, когда прерывания отключены: в x86 инструкция cli отключает прерывания на текущем CPU, где ISR работает. ОДИН IRQ помещается в буфер, поэтому, когда прерывания восстанавливаются с помощью sti, оно доставляется.

При использовании прерываний APIC буферизация происходит в самом ядре. Ядро подтверждает прерывание APIC и запускает его снова при вызове enable_irq.

person Alexander Atanasov    schedule 12.03.2013