Jump to content

    

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

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

 

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

 

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

 

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

Share this post


Link to post
Share on other sites
Имеется плата с 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().

Share this post


Link to post
Share on other sites

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

 

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

Share this post


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

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

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

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

Share this post


Link to post
Share on other sites

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

 

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

 

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this