Я рассматриваю предстоящую ситуацию во встроенном проекте Linux (пока нет оборудования), когда два внешних чипа должны будут совместно использовать одну физическую линию IRQ. Эта линия способна аппаратно запускать фронты, но не прерывания, запускаемые по уровню.
Глядя на общую поддержку irq в Linux, я понимаю, что способ, которым это будет работать с двумя отдельными драйверами, заключается в том, что каждый из них будет вызывать свой обработчик прерываний, проверять свое оборудование и обрабатывать его, если это необходимо.
Однако я представляю себе следующее состояние гонки и хотел бы знать, упускаю ли я что-то или что можно сделать, чтобы обойти это. Допустим, есть два внешних источника прерываний, устройства A и B:
- происходит прерывание устройства B, IRQ становится активным
- Край IRQ вызывает запуск обработчика прерывания ядра Linux
- ISR для устройства A работает, не находит ожидающих прерываний
- устройство Произошло прерывание, IRQ остается активным (провод-ИЛИ)
- ISR для устройства B запускается, находит ожидающее прерывание, обрабатывает и очищает его
- основной обработчик прерывания завершает работу
- IRQ остается активным, фронты больше не генерируются, IRQ заблокировано
Похоже, чтобы это было исправлено, основной обработчик прерывания должен был бы проверить уровень IRQ после запуска всех обработчиков, и, если он все еще активен, запустить их снова. Будет ли Linux это делать? Я не думаю, что ядро прерывания знает, как проверить уровень линии IRQ.
Может ли эта гонка произойти на самом деле, и если да, то как мне с этим справиться?