У меня такой вопрос.Очень надеюсь,что кто-то с таким сталкивался,потому как любом другом случае я в глубокой ж....
Пишу для Linux Embedded(система записана на чип и там бежит).Написал драйвер для устройстава,называемого Weigand(протокол передачи данных).На самом деле это сенсор,который считывает информацию и передаёт на чип.Это устройство сидит на 2-ух пина чипа.Один пин считывает -1,второй-0.Считываемая информация содержит 26 бит.Драйвер работает с 2-мя прерываниями(для 0 и для 1).Другими словами,чтобы верно прочитать данные,мне нужно правильно прочитать все 26 бит, т.е. поймать все 26 препываний.На самом деле у меня не получается поймать их всех.Я подозреваю,что это из-за того,что есть другие прерывания,приоритет которых выше(если я не прав,исправте меня), например Ethernet или timer.
Но мне кровь из носу,нужно поймать их все.Кто-нибудь знает,как повысит приоритет моих(для Weigand-a) прерываний.Или если проблема не в этом,то подскажуте в чём.
Заранее спасибо.
Приоритет interrupt-ов(препываний) (Приоритет interrupt-ов(препываний))
Модератор: Модераторы разделов
-
- Сообщения: 1341
- ОС: Arch Linux amd64
Re: Приоритет interrupt-ов(препываний)
а можно подробней про механизм работы драйвера?
я бы предложил следующее: при входе в обработчик прерывания отключать ВСЕ прерывания (тем самым исключив возможность вытеснения), создать очередь (или тасклет) добавить в нее необходимое действие, включить все прерывания. можно еще отключить все прерывания кроме тех линий которые "слушает" ваш драйвер.
в общем все необходимое найдете в Linux Device Drivers , глава 10 =)
я бы предложил следующее: при входе в обработчик прерывания отключать ВСЕ прерывания (тем самым исключив возможность вытеснения), создать очередь (или тасклет) добавить в нее необходимое действие, включить все прерывания. можно еще отключить все прерывания кроме тех линий которые "слушает" ваш драйвер.
в общем все необходимое найдете в Linux Device Drivers , глава 10 =)
-
- Сообщения: 29
- ОС: Linux Fedora 8
Re: Приоритет interrupt-ов(препываний)
При-этачил схему работы.Всё просто.Сенсор улавливает входные данные и передаёт их на чип. Драйвет моего Weigand-да ждёт прерываний по этим двум линиям.Когда прерывание приходит,то он(драйвер) в зависимости от того, по какой линии(0 или 1) пришло прерывание, записывает в буффер 0 или 1.
С предложенным выше решением может возникнут следующая проблемма.
После вхождения в обработчик прерывания,но до того как сделано disable на все прерываниыя случается прерывание с более высоким приоритетом.
С предложенным выше решением может возникнут следующая проблемма.
После вхождения в обработчик прерывания,но до того как сделано disable на все прерываниыя случается прерывание с более высоким приоритетом.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
- Сообщения: 1341
- ОС: Arch Linux amd64
Re: Приоритет interrupt-ов(препываний)
высокоприоритетных прерывания - или так называемые прерывания "верхней половины", прерывния которые невозможно отложить и единственный способ избавится от них - либо маскировать, либо отключать. и никак иначе.
чтобы исключить возможность вытеснения нужно в начале обработчика вызвать метод get_cpu()(отключает вытеснение, возможно в новых версиях ядра отключает локальные прерывания), замаскировать/отключить прерывания, создать очередь (или тасклет) добавить в нее необходимое действие, включить все прерывания, put_cpu().
чтобы исключить возможность вытеснения нужно в начале обработчика вызвать метод get_cpu()(отключает вытеснение, возможно в новых версиях ядра отключает локальные прерывания), замаскировать/отключить прерывания, создать очередь (или тасклет) добавить в нее необходимое действие, включить все прерывания, put_cpu().
-
- Модератор
- Сообщения: 1786
- Статус: Матёрый линуксоид
- ОС: Debian testing/unstable
Re: Приоритет interrupt-ов(препываний)
Во-первых, (афаик) в ядре нет такого понятия как приоритет прерывания.
Во-вторых, если "После вхождения в обработчик прерывания,но до того как сделано disable на все прерываниыя случается прерывание с более высоким приоритетом", то ничего страшного не происходит: после завершения обработчика вновь возникшего прерывания ваш обработчик продолжает выполнение с того места, где был остановлен.
Корень проблемы может быть в одном из двух:
1) прерывание от датчика происходит в тот момент, когда по какой-то причине все прерывания запрещены. Однако _все_ прерывания бывают запрещены очень редко и очень ненадолго, так что это маловероятно.
2) (более вероятно) ваш обработчик выполняется дольше, чем промежуток между прерываниями от датчика. Ведь на время выполнения обработчика прерывания на этой линии запрещены. Если в обработчике выполняется нетривиальная работа, разбейте обработчик на верхнюю и нижнюю половины.
Если же выяснится, что всё-таки имеет место первый вариант - придётся выяснять, с каким местом ядра конфликтует прерывание датчика (какое место ядра запрещает все прерывания в тот момент, когда срабатывает датчик) и патчить это место в ядре.
UPD.
RasenHerz
get_cpu() не запрещает прерывания. В обработчиках прерываний от неё толку ноль, т.к. она только запрещает планировщику производить вытеснение, а в контексте прерывания планировщик и так не работает.
Во-вторых, если "После вхождения в обработчик прерывания,но до того как сделано disable на все прерываниыя случается прерывание с более высоким приоритетом", то ничего страшного не происходит: после завершения обработчика вновь возникшего прерывания ваш обработчик продолжает выполнение с того места, где был остановлен.
Корень проблемы может быть в одном из двух:
1) прерывание от датчика происходит в тот момент, когда по какой-то причине все прерывания запрещены. Однако _все_ прерывания бывают запрещены очень редко и очень ненадолго, так что это маловероятно.
2) (более вероятно) ваш обработчик выполняется дольше, чем промежуток между прерываниями от датчика. Ведь на время выполнения обработчика прерывания на этой линии запрещены. Если в обработчике выполняется нетривиальная работа, разбейте обработчик на верхнюю и нижнюю половины.
Если же выяснится, что всё-таки имеет место первый вариант - придётся выяснять, с каким местом ядра конфликтует прерывание датчика (какое место ядра запрещает все прерывания в тот момент, когда срабатывает датчик) и патчить это место в ядре.
UPD.
RasenHerz
get_cpu() не запрещает прерывания. В обработчиках прерываний от неё толку ноль, т.к. она только запрещает планировщику производить вытеснение, а в контексте прерывания планировщик и так не работает.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
-
- Сообщения: 1341
- ОС: Arch Linux amd64
Re: Приоритет interrupt-ов(препываний)
я сделал предположение что "высокоприоритетными" прерываниями топикстартер назвал прерывания верхней части.
здесь посоветовал использовать тасклеты/очередь.
на мой взгляд, тоже наиболее вероятно.
а вот отключить прерывания не помешало бы.
UPD.
Portnov спасибо за исправление с get_cpu() в данном случае он действительно не нужен(я его использую для подсчета ссылок на модуль)
2) (более вероятно) ваш обработчик выполняется дольше, чем промежуток между прерываниями от датчика. Ведь на время выполнения обработчика прерывания на этой линии запрещены. Если в обработчике выполняется нетривиальная работа, разбейте обработчик на верхнюю и нижнюю половины.
здесь посоветовал использовать тасклеты/очередь.
на мой взгляд, тоже наиболее вероятно.
а вот отключить прерывания не помешало бы.
UPD.
Portnov спасибо за исправление с get_cpu() в данном случае он действительно не нужен(я его использую для подсчета ссылок на модуль)
-
- Сообщения: 29
- ОС: Linux Fedora 8
Re: Приоритет interrupt-ов(препываний)
Спасибо.Попробую как решение ваши предложения(завтра как раз на работу).Если будет положительный результат закрою тему.В любом другом случае,вернусь