URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 3452
[ Назад ]

Исходное сообщение
"Обработка аппаратных прерываний в Linux"

Отправлено YuVorobev , 06-Окт-04 11:39 
Добрый день!

У меня возникла проблема, решить которую не могу уже более месяца. У меня в PCI-слот установлена карточка, которая "сидит" на 5-ом прерывании и генерирует последовательность импульсов. Проблема заключается в том, что я нигде не могу найти информацию о том, как же, всё-таки, в Linux можно обрабатывать аппаратные прерывания. Мне нужно при получении сигнала 5-го прерывания послать в порт принтера на 1-ый контакт какой-нибудь сигнал. Как работать с портами, я разобрался. Посылаю сигнал на первый контакт порта принтера, а на осциллографе вижу импульс. Для меня это было настоящим открытием :)

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

Если кто-то сталкивался с подобной проблемой - очень прошу, поделитесь, пожалуйста, опытом. Может быть, найдется какой-нибудь рабочий пример?

Заранее благодарен!

-------------------------------------
С уважением и наилучшими пожеланиями,
Юрий В. Воробьев / Yuriy V. Vorobev
E-Mail: Vorobev@niiteplopribor.com


Содержание

Сообщения в этом обсуждении
"Обработка аппаратных прерываний в Linux"
Отправлено MaximKuznetsov , 06-Окт-04 13:15 
>Добрый день!
>
>У меня возникла проблема, решить которую не могу уже более месяца. У
>меня в PCI-слот установлена карточка, которая "сидит" на 5-ом прерывании и
>генерирует последовательность импульсов. Проблема заключается в том, что я нигде не
>могу найти информацию о том, как же, всё-таки, в Linux можно
>обрабатывать аппаратные прерывания. Мне нужно при получении сигнала 5-го прерывания послать
>в порт принтера на 1-ый контакт какой-нибудь сигнал. Как работать с
>портами, я разобрался. Посылаю сигнал на первый контакт порта принтера, а
>на осциллографе вижу импульс. Для меня это было настоящим открытием :)
>
>
>А вот с прерываниями что-то никак не получается. Все, что удалось найти
>в Интернете - в подавляющем большинстве - обработка программных прерываний. А
>аппаратных нет...
>
>Если кто-то сталкивался с подобной проблемой - очень прошу, поделитесь, пожалуйста, опытом.
>Может быть, найдется какой-нибудь рабочий пример?
>
>Заранее благодарен!
>
>-------------------------------------
>С уважением и наилучшими пожеланиями,
>Юрий В. Воробьев / Yuriy V. Vorobev
>E-Mail: Vorobev@niiteplopribor.com

недавно проходила похожая тема - во первых её найди,
во вторых обработкой прерываний в Linux может заниматься толко ядро,
то есть смотри Linux Kernel Module Programming на www.linuxdoc.org
там всё достаточно хорошо описаннно.


"Обработка аппаратных прерываний в Linux"
Отправлено Vadim , 07-Окт-04 11:31 
Ещё можно почитать linux device driver programming - полезная книжка. В целом, идея должна быть какая-то такая: мутишь модуль, туда пихаешь вызов request_irq(..), где в параметрах указываешь адрес функции-обработчика и кой-какие вещи ещё. Пример можно взять из любого драйвера, например усбишного хост-контроллера, сетевухи..

"Обработка аппаратных прерываний в Linux"
Отправлено YuVorobev , 07-Окт-04 16:37 
>Ещё можно почитать linux device driver programming - полезная книжка. В целом,
>идея должна быть какая-то такая: мутишь модуль, туда пихаешь вызов request_irq(..),
>где в параметрах указываешь адрес функции-обработчика и кой-какие вещи ещё. Пример
>можно взять из любого драйвера, например усбишного хост-контроллера, сетевухи..

БОЛЬШОЕ спасибо всем, что утешили - похоже ситуация не безвыходная :)
А что касается примеров - я пытался посмотреть в kernel-source исходники драйверов и для USB, и для сетевой карточки, но когда я увидел сколько там всего - произошло помутнение рассудка, глаза полезли на лоб, а волосы встали дыбом... Наверное просто с непривички разбираться в исходниках драйвера. Попытаюсь что-нибудь придумать с request_irq(). Этот вызов я видел в каждом из драйверов.

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


"Обработка аппаратных прерываний в Linux"
Отправлено Vadim , 08-Окт-04 11:48 
http://www.oreilly.de/openbook/ldd/chapter/book/ch09.html
Ага? :)
Там и примеры, и всё на свете.. Рульная книжка.

"Обработка аппаратных прерываний в Linux"
Отправлено YuVorobev , 08-Окт-04 23:24 
>http://www.oreilly.de/openbook/ldd/chapter/book/ch09.html

Vadim, ОГРОМНОЕ СПАСИБО !!!
Ей Богу, мир не без добрых людей!

>Там и примеры, и всё на свете.. Рульная книжка.

Да, книжка действительно рульная, там не только про прерывания написано.  Мне кажется, что эта книга мне очень поможет :)

Еще раз спасибо!

-------------------------------------
С уважением и наилучшими пожеланиями,
Юрий В. Воробьев / Yuriy V. Vorobev
E-Mail: Vorobev@niiteplopribor.com


"Обработка аппаратных прерываний - проблемы продолжаются"
Отправлено YuVorobev , 17-Ноя-04 16:29 
Добрый день!

После того, как я скачал книгу Linux Device Drivers с сайта http://www.oreilly.com/catalog/linuxdrive2/chapter/book, многие вещи стали более понятными. Я сделал распайку для LPT-разъема, соединил на плате 9 и 10 линии, начал писать программу. Но обработать аппаратное прерывыание пока так и не удалось, хотя работа с регистрами проходит на ура. Делаю, вроде бы, всё, как описано в главах 8 и 9. Но, пока, к сожалению, ничего не получается.

Вот текст моей программы:
**********************************
#include <stdio.h>
#include <asm/io.h>
#include <asm/irq.h>

#include <linux/sched.h>

#define BASE378 0x378
void irq7_interrupt()
{
outb(0xFF,BASE378);
outb(0x20,0x20);
};

int main ()
{
  unsigned int irq7 = 7;
  unsigned int i = 0;
  
  void enable_irq(unsigned int irq7);
  if (ioperm(0x20,2,1)) {perror("ioperm"); exit(1);};
  if (ioperm(BASE378,3,1)) {perror("ioperm"); exit(2);};
  
  
  outb((inb(BASE378+1) && 0x10),BASE378+1);
  /*
  0x10 - этот бит разрешает прерывания от параллельного порта
  */
  
  request_irq(irq7, irq7_interrupt, SA_INTERRUPT, irq7_interrupt);

  if (ioperm(0x20,2,0)) {perror("ioperm"); exit(3);};
  if (ioperm(BASE378,3,0)) {perror("ioperm"); exit(4);};  
  void disable_irq(unsigned int irq7);
  return 0;
}

**********************************

Файл сохранил как ex01.c, компилирую его - # gcc ex01.c -o ex01,
а в ответ получаю кучу предупреждений и ошибок (похоже, что не связанных с тем, что я написал) - в общем всё, кроме испольняемого файла.

Вот вовод "ответов" компилятора:
**********************************

[root@YuOffice irq]# gcc ex01.c -o ex01
In file included from /usr/include/linux/sched.h:13,
                 from ex01.c:5:
/usr/include/linux/times.h:5: parse error before "clock_t"
/usr/include/linux/times.h:7: parse error before "tms_cutime"
/usr/include/linux/times.h:8: parse error before "tms_cstime"
In file included from /usr/include/linux/sched.h:14,
                 from ex01.c:5:
/usr/include/linux/timex.h:173: field `time' has incomplete type
In file included from /usr/include/linux/bitops.h:69,
                 from /usr/include/asm/system.h:7,
                 from /usr/include/linux/sched.h:16,
                 from ex01.c:5:
/usr/include/asm/bitops.h:327:2: warning: #warning This includefile is not available on all architectures.
/usr/include/asm/bitops.h:328:2: warning: #warning Using kernel headers in userspace: atomicity not guaranteed
In file included from /usr/include/linux/signal.h:4,
                 from /usr/include/linux/sched.h:25,
                 from ex01.c:5:
/usr/include/asm/signal.h:107: parse error before "sigset_t"
/usr/include/asm/signal.h:110: parse error before '}' token
In file included from /usr/include/linux/signal.h:5,
                 from /usr/include/linux/sched.h:25,
                 from ex01.c:5:
/usr/include/asm/siginfo.h:26: parse error before "pid_t"
/usr/include/asm/siginfo.h:38: parse error before "pid_t"
/usr/include/asm/siginfo.h:41: parse error before '}' token
/usr/include/asm/siginfo.h:45: parse error before "pid_t"
/usr/include/asm/siginfo.h:48: parse error before "_utime"
/usr/include/asm/siginfo.h:49: parse error before "_stime"
/usr/include/asm/siginfo.h:62: parse error before '}' token
/usr/include/asm/siginfo.h:63: parse error before '}' token
In file included from /usr/include/linux/sched.h:78,
                 from ex01.c:5:
/usr/include/linux/time.h:10: parse error before "time_t"
/usr/include/linux/time.h:12: parse error before '}' token
/usr/include/linux/time.h:18: parse error before "time_t"
/usr/include/linux/time.h:44: field `it_interval' has incomplete type
/usr/include/linux/time.h:45: field `it_value' has incomplete type
/usr/include/linux/time.h:49: field `it_interval' has incomplete type
/usr/include/linux/time.h:50: field `it_value' has incomplete type
In file included from /usr/include/linux/sched.h:80,
                 from ex01.c:5:
/usr/include/linux/resource.h:22: field `ru_utime' has incomplete type
/usr/include/linux/resource.h:23: field `ru_stime' has incomplete type
In file included from /usr/include/linux/sched.h:81,
                 from ex01.c:5:
/usr/include/linux/timer.h:32: field `vec' has incomplete type
/usr/include/linux/timer.h:37: field `vec' has incomplete type
/usr/include/linux/timer.h:45: parse error before "spinlock_t"
/usr/include/linux/timer.h:53: parse error before '}' token
/usr/include/linux/timer.h:63: field `list' has incomplete type
/usr/include/linux/timer.h:67: parse error before "tvec_base_t"
/usr/include/linux/timer.h:101: parse error before "tvec_bases"
/usr/include/linux/timer.h: In function `init_timer':
/usr/include/linux/timer.h:105: dereferencing pointer to incomplete type
/usr/include/linux/timer.h:105: dereferencing pointer to incomplete type
/usr/include/linux/timer.h:106: dereferencing pointer to incomplete type
/usr/include/linux/timer.h: In function `timer_pending':
/usr/include/linux/timer.h:121: dereferencing pointer to incomplete type
[root@YuOffice irq]#

**********************************

Соответственно, возникает несколько вопросов. Первый, естественно - что не так? Второй - может быть, все-таки, кто-то уже общался с аппаратными прерываниями, имеет опыт борьбы с ними?

Пожалуйста, если вы можете чем-нибудь помочь в моей глупой ситуации - откликнитесь!

Заранее благодарен!

-------------------------------------
С уважением и наилучшими пожеланиями,
Юрий В. Воробьев / Yuriy V. Vorobev
E-Mail: Vorobev@niiteplopribor.com


"Обработка аппаратных прерываний - проблемы продолжаются"
Отправлено Murr , 18-Ноя-04 13:41 
request_irq нельзя делать из программы - только из модуля.

"Обработка аппаратных прерываний - проблемы продолжаются"
Отправлено YuVorobev , 22-Ноя-04 11:52 
>request_irq нельзя делать из программы - только из модуля.

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

А так, когда есть пример перед глазами - можно было бы по образу и подобию научиться делать что-то самому. В общем, если у Вас (или кого-либо еще) есть такая программа-пример-обучалка и не жалко ею поделиться - очень прошу - откройте заветную тайну обработки аппаратных прерываний. Мой почтовый ящик всегда к вашим услугам. У меня самого чего-то не хватает, чтобы совладать с ними.

Наверное, руки не оттуда растут :)

-------------------------------------
С уважением и наилучшими пожеланиями,
Юрий В. Воробьев / Yuriy V. Vorobev
E-Mail: Vorobev@niiteplopribor.com