간단한 문자 드라이버를 작성하고 gpio 핀에 IRQ를 요청하고 이에 대한 처리기를 작성했습니다.장치 드라이버의 인터럽트 처리
err = request_irq (irq, irq_handler, IRQF_SHARED | IRQF_TRIGGER_RISING, INTERRUPT_DEVICE_NAME, raspi_gpio_devp);
정적 irqreturn_t irq_handler (int irq, void * arg);
지금부터 나는 이론을 알고 있습니다. 인터럽트가 발생하면 컨트롤러에 do_IRQ()를 호출하여 IDT를 확인하고이 줄에 대한 인터럽트 처리기를 호출합니다. 커널을 수행하는 방법을
또한 내가 인터럽트 핸들러는 모든 프로세스의 컨텍스트에서 실행되지 않는 것을 알고 인터럽트 핸들러가이 특정 장치 파일
에 대한 것을 알고있다. 그러나 처리기의 측면 범위 밖에서 선언 된 변수에 액세스한다고 가정 해 봅시다. 정적 전역 플래그 = 0, 처리기에서 인터럽트가 발생했음을 나타내는 flag = 1을 만듭니다. 해당 변수는 프로세스 컨텍스트에 있습니다. 그래서 어떤 핸들러 컨텍스트에서이 핸들러가 프로세스 컨텍스트의 변수를 수정하지 않는지 혼란 스럽습니다.
감사합니다.
방법 알려진 IRQ 값으로 IRQ 인수를 비교 ... 그 인터럽트가 내 장치입니다 결정하기 위해 나는 코드를합니까? 그래서 내가 말하고있는이 전역 변수는 예를 들어 : 인터럽트가 발생했음을 나타내는 int 플래그는 void * arg와 같이 핸들러에 전달되어야하는 장치 구조 당 측면에 있어야합니다. – Haswell
일반적으로 장치에 문의하십시오. 장치가 인터럽트를 생성했는지 여부를 알 수없는 경우 인터럽트 회선이 공유되지 않는지 확인해야합니다 (IRQF_SHARED를 생략). –
"void * arg"는 사용자가 원하는대로 사용할 수 있습니다. 일반적으로 장치 특정 데이터 구조를 가리 킵니다 (종종 하나 이상의 장치 인스턴스를 가질 수 있기 때문에). 전역 데이터를 전역/정적 변수에 보관할 수도 있습니다. –