Как избежать общих гонок IRQ в Linux - PullRequest
6 голосов
/ 11 января 2012

Я рассматриваю предстоящую ситуацию в проекте встроенного Linux (пока без аппаратного обеспечения), когда два внешних чипа должны будут использовать одну физическую линию IRQ.Эта линия поддерживает аппаратное обеспечение запуска по фронту, но не прерываний, инициируемых уровнем.

Глядя на поддержку разделяемого irq в Linux, я понимаю, что способ работы с двумя отдельными драйверами заключается в том, что у каждого будет свой обработчик прерываний.позвонил, проверь их аппаратное обеспечение и обработай при необходимости.

Однако я представляю себе следующее состояние гонки и хотел бы знать, если я что-то упустил или что можно сделать, чтобы обойти это.Допустим, есть два внешних источника прерываний, устройства A и B:

  1. происходит прерывание устройства B, IRQ становится активным
  2. Предел IRQ заставляет обработчик прерываний ядра Linux работать
  3. ISR для устройства A работает, не находит ожидающих прерываний
  4. устройство прерывание происходит, IRQ остается активным (проводное ИЛИ)
  5. ISR для устройств B работает, находит ожидающие прерывания, обрабатывает и очищаетit
  6. обработчик прерываний ядра завершает работу
  7. IRQ остается активным, больше не генерируется ребер, IRQ заблокирован

Кажется, что для того, чтобы это исправить,основной обработчик прерываний должен будет проверить уровень IRQ после запуска всех обработчиков и, если он все еще активен, запустить их все снова.Будет ли Linux делать это?Я не думаю, что ядро ​​прерывания знает, как проверить уровень линии IRQ.

Может ли эта гонка произойти, и если да, то как мне с этим справиться?

1 Ответ

2 голосов
/ 31 января 2012

По сути, с аппаратным обеспечением, которое вы описали, выполнение проводных или прерываний НИКОГДА не будет работать правильно само по себе.

Если вы хотите сделать проводное или, вам действительно нужно использоватьчувствительные к уровню IRQ входы.Если это невозможно, возможно, вы можете добавить какой-нибудь контроллер прерываний.Это устройство будет иметь N чувствительных к уровню входов, иметь один выход и своего рода «очистить».Когда контроллер прерываний получает очистку, он понижает свой выходной сигнал, а затем повторно подтверждает выходной сигнал, если какой-либо из его входных сигналов все еще был подтвержден.

Со стороны программного обеспечения вы можете посмотреть, работает ли линия IRQ с другимвход процессора.Это позволило бы вам по крайней мере проверить состояние, но обработчик ISR ядра Linux ничего не узнает об этом, и поэтому вам придется что-то исправить, чтобы он проверил его и снова прошел через ISR.Кроме того, это означает, что в тяжелых ситуациях с прерыванием вы НИКОГДА не собираетесь выходить из этого ISR.Учитывая, что вы выполняете проводную связь или IRQ, я полагаю, что эти устройства не будут слишком часто прерывать работу.

Еще одна вещь - очень внимательно посмотреть на процессор.Может быть какая-то хитрость, которую вы можете использовать при настройке прерывания, чтобы заставить его снова распознать прерывание.

Я бы не стал делать что-то слишком хитрое, я бы либо разделил источники на отдельныеIRQ входы, переключитесь на чувствительный к уровню вход или добавьте микросхему контроллера прерываний.

...