0

기본적인 질문을 중단. 내가 인터럽트 라인을 활성화하면 그 시간 동안 발생한 보류중인 인터럽트를 받았습니다.인터럽트 처리는 내가 주변 장치가 인터럽트를 보내는이 시간 동안, 주변의 인터럽트 라인을 비활성화하고 일부 처리를 할 리눅스 내 드라이버에서 <p></p>를 인터럽트 처리에 대한

이 정확한 이해가 무엇입니까?

예인 경우 인터럽트 비활성화 기간 동안 발생한 인터럽트를 어떻게 버릴 수 있습니까?

일부 지연을 사용하여 Linux API를 찾거나이를 수행 할 수있는 방법을 찾고 있습니다.

인터럽트를 활성화하기 전에 다음을 설정할 수 있습니다. desc = irq_to_desc (client-> irq); desc-> istate & = ~ IRQS_PENDING; 및 인터럽트 줄을 사용하면 보류중인 모든 인터럽트를 지우지 만 코드에서는 이러한 변수를 수정해서는 안됩니다.

감사합니다

+0

에 인터럽트를 그리고 내가 이제까지 할 합리적인 일이 무시 생각하지 않습니다. 회선을 비활성화하고 장치에서 이벤트를 읽은 다음 회선을 다시 활성화합니다. 회선이 비활성화되어있는 동안 인터럽트가 도착하면 트리거 한 이벤트를 보았을 수도 있지만 그렇지 않은 경우가있을 수 있습니다. 따라서 여러분은 그것을 무시해서는 안됩니다. 처리되지 않은 이벤트가 다시 있는지 확인해야합니다. –

+1

__enable_irq 함수를 검사하면 check_irq_resend (desc, irq)를 호출합니다. 보류중인 인터럽트를 다시 보냅니다. – shunty

+0

글쎄요, 그렇습니다. IRQ가 사용되지 않는 동안 문제가 발생하더라도 여전히 처리해야하기 때문입니다. 그렇지 않은 경우, 원인이 된 이벤트를 놓칠 수 있습니다. –

답변

1

내가 이해하지 않았다하지만 난 당신이해야하는 것은 생각 할 수 있습니다 : 직접 장치에

  • 비활성화 매치를 중지하고 사용하지 않는 커널이 처리 루틴

  • 를 중단 장치를 폴링하여 모든 이벤트를 가져옵니다. 수 있습니다 당신이 스레드 인터럽트 핸들러

  • 에서이 작업을 수행해야 할 때 완료 다시 활성화 장치

+0

이것은 문제를 해결할 것이지만 장치는 인터럽트를 제어하기 위해 레지스터를 노출시키지 않습니다. 친절히 아래 솔루션에 대한 의견을 공유하십시오. 인터럽트를 활성화하기 전에 desc = irq_to_desc (client-> irq); desc-> istate & = ~ IRQS_PENDING; 인터럽트 라인을 활성화하면 보류중인 모든 인터럽트가 지워집니다. – shunty