1

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

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

ответ

2

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

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

1

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

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

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

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

2

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

Что происходит, когда прерывания отключены: В x86 команда cli отключает прерывания текущего CPU, где работает ISR. ONE IRQ буферизуется, поэтому, когда прерывания восстанавливаются с sti, он поставляется.

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

Смежные вопросы