1

저는 LDD를 읽고 RPI에 GPIO 용 드라이버를 쓰고 있습니다. GPIO 핀에서 인터럽트를 감지하고 그 인터럽트 이후에 오는 8 비트를 읽었습니다.드라이버에서 인터럽트를 비활성화 할 수있는시기는 언제입니까

이 책의 일반적인 제안은 거의 인터럽트를 비활성화하는 것입니다. 그러나 그것들을 사용하지 못하게하고 모든 작업을 수행하고 작업하기 쉽도록 유혹하는 것이 유감입니다.

그래서 실제로 인터럽트를 사용할 수없는 시나리오가 있습니까?

추가 질문 : 인터럽트가 비활성화되어 있지 않고 작업 대기열을 사용하는 처리가 사용되지 않으면이 방법을 사용하여 학습하는 기존 커널 드라이버를 지적하십시오. 나는 그것을 수행하는 방법을 현명하게 코딩하는 실제적인 방법을 알고 싶다.

감사

어떤 드라이버에서
+1

두 번째 질문을 WRT하면 더 많은 방법으로이를 구현할 수 있습니다. 한 가지 방법은 ISR에서 작업 표를 예약하는 것입니다. 여기 Bt87x 드라이버의 ISR을 참조하십시오 : http://lxr.free-electrons.com/source/drivers/media/pci/bt8xx/bt878.c#L264 –

답변

2

, 전 세계적으로 인터럽트를 비활성화 할 수있는 좋은 방법이 아닙니다. 커널이 처리하도록하십시오. 언제든지 하드웨어의 특정 GPIO 라인에 대한 하드웨어 인터럽트를 해제 할 수 있습니다 (주로 일부 레지스터 작성). 다시 필요할 때 다시 활성화 할 수있는 메커니즘이 있는지 확인하십시오. 드라이버를 작성하는 동안 local_irq_disable()을 전혀 사용할 필요가 없습니다. 그게 당신이 요구하는 것입니다.

특정 IRQ에 대한 인터럽트 핸들러를 등록한 경우 인터럽트가 발생하면 핸들러가 호출됩니다. 처리기는 이미 비활성화 된 인터럽트로 호출됩니다. 그리고 원자 적 맥락에서 일어날 것입니다. 가능한 한 빨리 작업을 완료하고 핸들러에서 리턴해야합니다. 작업 대기열을 예약해야하는 경우 반환하기 전에 schedule_work()를 사용해야합니다. 태스크 릿은 오래되었고 작업 대기열이 선호됩니다. drivers/char 아래에서 schedule_work에 대해 grep하면 (문자 드라이버는 간단 할 것으로 예상됩니다) 메커니즘을 사용하여 드라이버 중 일부를 찾을 수 있습니다. drivers/char/sonypi.c가 그 예입니다. 인터럽트 처리기 인 sonypi_irq()에서 호출 한 sonypi_report_input_event()가 schedule_work()를 호출합니다.