Когда можно отключить прерывания в драйвере

Я читал LDD, а также писал драйвер для GPIO на RPI. Мне удалось обнаружить прерывание на выводе GPIO и прочитать 8 бит, которые идут после этого прерывания.

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

Итак, действительно ли существуют сценарии, при которых прерывания отключены.

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

Спасибо


person RootPhoenix    schedule 25.11.2014    source источник
comment
Напишите свой второй вопрос, есть другие способы реализовать это. Один из способов - запланировать тасклет из ISR. См. ISR драйвера Bt87x здесь: lxr.free -electrons.com/source/drivers/media/pci/bt8xx/   -  person Peter L.    schedule 25.11.2014


Ответы (1)


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

Если вы зарегистрировали обработчик прерывания для определенного IRQ, он будет вызываться при возникновении прерывания. Обработчик будет вызываться с уже отключенными прерываниями. И было бы в атомарном контексте. Вам нужно как можно скорее завершить работу и вернуться от обработчика. Если вам нужно запланировать рабочую очередь, нужно использовать schedule_work () до того, как вы вернетесь. Тасклеты - старые, а очереди на работу - предпочтительнее. Если вы вводите grep для schedule_work в разделе drivers / char (ожидается, что драйверы char будут простыми), вы можете найти некоторые из них, используя этот механизм. драйверы / char / sonypi.c является примером. sonypi_report_input_event (), вызываемый из sonypi_irq (), который является обработчиком прерывания, вызывает schedule_work ().

person subin    schedule 26.11.2014