Перейти к содержанию
    

Обработка прерываний в Linux

Имеется плата с ADM5120. На ней работает Linux (OpenWrt KAMIKAZE). Ядро 2.6.23.14.

 

Измеряю время с момента выставления сигнала запроса на прерывание до входа в обработчик прерывания. Обычно оно составляет десятки микросекунд (20...30мкс). Однако, периодически - раз в ~200 секунд, случаются выбросы до 180 мкс. Причем несколько прерываний обрабатываются с большой задержкой, а далее опять задержка маленькая.

 

Такое ощущение, что есть некий процесс, запрещающий прерывания на значительное время, активизирующийся раз в 200 секунд. Что это может быть? Можно ли его (процесс) выключить?

 

Очень хочется, чтобы обработчик прерывания делал свое дело через равные промежутки времени.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Имеется плата с ADM5120. На ней работает Linux (OpenWrt KAMIKAZE). Ядро 2.6.23.14.

 

Измеряю время с момента выставления сигнала запроса на прерывание до входа в обработчик прерывания. Обычно оно составляет десятки микросекунд (20...30мкс). Однако, периодически - раз в ~200 секунд, случаются выбросы до 180 мкс. Причем несколько прерываний обрабатываются с большой задержкой, а далее опять задержка маленькая.

 

Такое ощущение, что есть некий процесс, запрещающий прерывания на значительное время, активизирующийся раз в 200 секунд. Что это может быть? Можно ли его (процесс) выключить?

 

Очень хочется, чтобы обработчик прерывания делал свое дело через равные промежутки времени.

Ничего удивительного и необычного.

1. Linux не реалтайм ОС.

2. Подавляющее большинство драйверов, использующих прерывания (последовательный порт например) используют конструкцию

spin_lock_irqsave(lock, flags);
выполнение действий.
spin_lock_irqrestore(lock, flags);

И именно для запрета прерываний.

3. Есть еще lock_kernel().

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это все мне известно. Но правилом хорошего тона является запрет прерываний на короткий промежуток времени. А 180 мкс, мне кажется, уже много.

 

Кроме того удивляет хорошая периодичность и редкость этого явления - раз в 200 секунд (+/- несколько секунд). Чего это Linux делает с таким периодом?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это все мне известно. Но правилом хорошего тона является запрет прерываний на короткий промежуток времени. А 180 мкс, мне кажется, уже много.

А приоритетность прерываний? А что будет если, если одновремеено с вашим прерыванием в очереди окажутся еще и другие, с более высоким приоритетом? А короткий это сколько? В общем вопросов больше чем ответов.

Кроме того удивляет хорошая периодичность и редкость этого явления - раз в 200 секунд (+/- несколько секунд). Чего это Linux делает с таким периодом?

А если понизить частоту процесора период изменится? Период большой, потому сложно сказать. На сколько я помню таких периодов в ядре нет. 3 секунды - обработка дисковых кешей. Есть ли больше - не знаю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все оказалось просто.

 

Период таймерного прерывания был кратен периоду интересующего меня прерывания. Причем эти периоды задавались разными кварцами. Соответственно, с некоторой периодичностью, они ничинали накладываться.

 

Значит, обработчик таймера держит прерывания запрещенными в течении 180мкс (для моей конфигурации).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...