Приоритет interrupt-ов(препываний) (Приоритет interrupt-ов(препываний))

Взгляд изнутри

Модератор: Модераторы разделов

Ответить
rapa
Сообщения: 29
ОС: Linux Fedora 8

Приоритет interrupt-ов(препываний)

Сообщение rapa »

У меня такой вопрос.Очень надеюсь,что кто-то с таким сталкивался,потому как любом другом случае я в глубокой ж....
Пишу для Linux Embedded(система записана на чип и там бежит).Написал драйвер для устройстава,называемого Weigand(протокол передачи данных).На самом деле это сенсор,который считывает информацию и передаёт на чип.Это устройство сидит на 2-ух пина чипа.Один пин считывает -1,второй-0.Считываемая информация содержит 26 бит.Драйвер работает с 2-мя прерываниями(для 0 и для 1).Другими словами,чтобы верно прочитать данные,мне нужно правильно прочитать все 26 бит, т.е. поймать все 26 препываний.На самом деле у меня не получается поймать их всех.Я подозреваю,что это из-за того,что есть другие прерывания,приоритет которых выше(если я не прав,исправте меня), например Ethernet или timer.

Но мне кровь из носу,нужно поймать их все.Кто-нибудь знает,как повысит приоритет моих(для Weigand-a) прерываний.Или если проблема не в этом,то подскажуте в чём.

Заранее спасибо.
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: Приоритет interrupt-ов(препываний)

Сообщение RasenHerz »

а можно подробней про механизм работы драйвера?
я бы предложил следующее: при входе в обработчик прерывания отключать ВСЕ прерывания (тем самым исключив возможность вытеснения), создать очередь (или тасклет) добавить в нее необходимое действие, включить все прерывания. можно еще отключить все прерывания кроме тех линий которые "слушает" ваш драйвер.
в общем все необходимое найдете в Linux Device Drivers , глава 10 =)
Спасибо сказали:
rapa
Сообщения: 29
ОС: Linux Fedora 8

Re: Приоритет interrupt-ов(препываний)

Сообщение rapa »

При-этачил схему работы.Всё просто.Сенсор улавливает входные данные и передаёт их на чип. Драйвет моего Weigand-да ждёт прерываний по этим двум линиям.Когда прерывание приходит,то он(драйвер) в зависимости от того, по какой линии(0 или 1) пришло прерывание, записывает в буффер 0 или 1.
С предложенным выше решением может возникнут следующая проблемма.
После вхождения в обработчик прерывания,но до того как сделано disable на все прерываниыя случается прерывание с более высоким приоритетом.
Вложения
Weigand.png
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: Приоритет interrupt-ов(препываний)

Сообщение RasenHerz »

высокоприоритетных прерывания - или так называемые прерывания "верхней половины", прерывния которые невозможно отложить и единственный способ избавится от них - либо маскировать, либо отключать. и никак иначе.
чтобы исключить возможность вытеснения нужно в начале обработчика вызвать метод get_cpu()(отключает вытеснение, возможно в новых версиях ядра отключает локальные прерывания), замаскировать/отключить прерывания, создать очередь (или тасклет) добавить в нее необходимое действие, включить все прерывания, put_cpu().
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable
Контактная информация:

Re: Приоритет interrupt-ов(препываний)

Сообщение Portnov »

Во-первых, (афаик) в ядре нет такого понятия как приоритет прерывания.
Во-вторых, если "После вхождения в обработчик прерывания,но до того как сделано disable на все прерываниыя случается прерывание с более высоким приоритетом", то ничего страшного не происходит: после завершения обработчика вновь возникшего прерывания ваш обработчик продолжает выполнение с того места, где был остановлен.

Корень проблемы может быть в одном из двух:
1) прерывание от датчика происходит в тот момент, когда по какой-то причине все прерывания запрещены. Однако _все_ прерывания бывают запрещены очень редко и очень ненадолго, так что это маловероятно.
2) (более вероятно) ваш обработчик выполняется дольше, чем промежуток между прерываниями от датчика. Ведь на время выполнения обработчика прерывания на этой линии запрещены. Если в обработчике выполняется нетривиальная работа, разбейте обработчик на верхнюю и нижнюю половины.

Если же выяснится, что всё-таки имеет место первый вариант - придётся выяснять, с каким местом ядра конфликтует прерывание датчика (какое место ядра запрещает все прерывания в тот момент, когда срабатывает датчик) и патчить это место в ядре.

UPD.
RasenHerz
get_cpu() не запрещает прерывания. В обработчиках прерываний от неё толку ноль, т.к. она только запрещает планировщику производить вытеснение, а в контексте прерывания планировщик и так не работает.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: Приоритет interrupt-ов(препываний)

Сообщение RasenHerz »

я сделал предположение что "высокоприоритетными" прерываниями топикстартер назвал прерывания верхней части.
2) (более вероятно) ваш обработчик выполняется дольше, чем промежуток между прерываниями от датчика. Ведь на время выполнения обработчика прерывания на этой линии запрещены. Если в обработчике выполняется нетривиальная работа, разбейте обработчик на верхнюю и нижнюю половины.

здесь посоветовал использовать тасклеты/очередь.
на мой взгляд, тоже наиболее вероятно.
а вот отключить прерывания не помешало бы.

UPD.
Portnov спасибо за исправление с get_cpu() в данном случае он действительно не нужен(я его использую для подсчета ссылок на модуль)
Спасибо сказали:
rapa
Сообщения: 29
ОС: Linux Fedora 8

Re: Приоритет interrupt-ов(препываний)

Сообщение rapa »

Спасибо.Попробую как решение ваши предложения(завтра как раз на работу).Если будет положительный результат закрою тему.В любом другом случае,вернусь :crazy: :D
Спасибо сказали:
Ответить