Моя проблема: обработчик прерываний срабатывает при вызове free_irq. Я заметил в сообщениях ядра, что обработчик вызывается, но поскольку наше устройство не запрашивало прерывание, оно сообщало, что прерывание не получено. Это ожидаемое поведение? Кто-нибудь может помочь?
Обработчик прерываний срабатывает при вызове free_irq
comment
Обработчик прерывания не будет вызываться, пока не будет перехвачено прерывание, для которого зарегистрирован ваш обработчик прерывания. Можете ли вы дать более подробную информацию или вы можете поделиться своим кодом. Так что наши ответы могут быть более продуктивными.
- person Sumeet_Jain   schedule 31.01.2014
comment
Вы не указали, что ваш драйвер предназначен для устройства PCI, но я нашел полезную документацию по порядку выключения устройства в документации по драйверу PCI. См.: kernel.org/doc/html/ последний/PCI/pci.html#pci-device-shutdown
- person ahogen   schedule 13.12.2019
Ответы (2)
Когда вы регистрируете обработчик для (возможно) общего прерывания (с IRQF_SHARED), прерывание может быть вызвано другими устройствами, над которыми ваш драйвер не имеет никакого контроля, поэтому ваш драйвер должен быть готов принять прерывание в любое время.
Чтобы облегчить отладку драйверов, ядро будет (если установлено значение CONFIG_DEBUG_SHIRQ) имитировать некоторые прерывания, чтобы проверить правильность работы вашего драйвера.
[исходный код]
person
CL.
schedule
31.01.2014
У меня есть общие прерывания, но ни одно другое устройство не инициировало прерывание, поскольку IRQ в /proc/interrupts не увеличивается. Во-вторых, не могли бы вы помочь, как проверить, установлен CONFIG_DEBUG_SHIRQ или нет?
- person user3257306; 31.01.2014
Поведение вашего ядра доказывает, что CONFIG_DEBUG_SHIRQ установлен.
- person CL.; 31.01.2014
Есть ли способ подтвердить этот макрос?
- person user3257306; 31.01.2014
В моем случае /proc/config.gz не существует в Fedora 16. Я нахожу информацию о конфигурации в /boot/config-‹kernel›, выполнив команду cat /boot/config-$(uname -r) | grep CONFIG_DEBUG_SHIRQ
- person user3257306; 31.01.2014
Если я правильно понял ваш пост, вы должны отключить выдачу прерываний на своем оборудовании перед вызовом free_irq(), тогда вы не будете получать прерывания, пока работает free_irq().
person
user2699113
schedule
31.01.2014