Обработка аппаратных прерываний в Linux, YuVorobev, 06-Окт-04, 11:39 [смотреть все]Добрый день!У меня возникла проблема, решить которую не могу уже более месяца. У меня в PCI-слот установлена карточка, которая "сидит" на 5-ом прерывании и генерирует последовательность импульсов. Проблема заключается в том, что я нигде не могу найти информацию о том, как же, всё-таки, в Linux можно обрабатывать аппаратные прерывания. Мне нужно при получении сигнала 5-го прерывания послать в порт принтера на 1-ый контакт какой-нибудь сигнал. Как работать с портами, я разобрался. Посылаю сигнал на первый контакт порта принтера, а на осциллографе вижу импульс. Для меня это было настоящим открытием :) А вот с прерываниями что-то никак не получается. Все, что удалось найти в Интернете - в подавляющем большинстве - обработка программных прерываний. А аппаратных нет... Если кто-то сталкивался с подобной проблемой - очень прошу, поделитесь, пожалуйста, опытом. Может быть, найдется какой-нибудь рабочий пример? Заранее благодарен! ------------------------------------- С уважением и наилучшими пожеланиями, Юрий В. Воробьев / Yuriy V. Vorobev E-Mail: Vorobev@niiteplopribor.com |
- Обработка аппаратных прерываний в Linux, MaximKuznetsov, 13:15 , 06-Окт-04 (1)
- Обработка аппаратных прерываний в Linux, Vadim, 11:31 , 07-Окт-04 (2)
- Обработка аппаратных прерываний в Linux, YuVorobev, 16:37 , 07-Окт-04 (3)
>Ещё можно почитать linux device driver programming - полезная книжка. В целом, >идея должна быть какая-то такая: мутишь модуль, туда пихаешь вызов request_irq(..), >где в параметрах указываешь адрес функции-обработчика и кой-какие вещи ещё. Пример >можно взять из любого драйвера, например усбишного хост-контроллера, сетевухи.. БОЛЬШОЕ спасибо всем, что утешили - похоже ситуация не безвыходная :) А что касается примеров - я пытался посмотреть в kernel-source исходники драйверов и для USB, и для сетевой карточки, но когда я увидел сколько там всего - произошло помутнение рассудка, глаза полезли на лоб, а волосы встали дыбом... Наверное просто с непривички разбираться в исходниках драйвера. Попытаюсь что-нибудь придумать с request_irq(). Этот вызов я видел в каждом из драйверов. Еще раз по поводу примеров - может быть есть какой нибудь учебный пример - совсем маленький и в то же время понятный? Если есть - пожалуйста, поделитесь опытом.
- Обработка аппаратных прерываний в Linux, Vadim, 11:48 , 08-Окт-04 (4)
- Обработка аппаратных прерываний в Linux, YuVorobev, 23:24 , 08-Окт-04 (5)
>http://www.oreilly.de/openbook/ldd/chapter/book/ch09.html Vadim, ОГРОМНОЕ СПАСИБО !!! Ей Богу, мир не без добрых людей! >Там и примеры, и всё на свете.. Рульная книжка. Да, книжка действительно рульная, там не только про прерывания написано. Мне кажется, что эта книга мне очень поможет :) Еще раз спасибо! ------------------------------------- С уважением и наилучшими пожеланиями, Юрий В. Воробьев / Yuriy V. Vorobev E-Mail: Vorobev@niiteplopribor.com
- Обработка аппаратных прерываний - проблемы продолжаются, YuVorobev, 16:29 , 17-Ноя-04 (6)
Добрый день! После того, как я скачал книгу 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, 13:41 , 18-Ноя-04 (7)
- Обработка аппаратных прерываний - проблемы продолжаются, YuVorobev, 11:52 , 22-Ноя-04 (8)
>request_irq нельзя делать из программы - только из модуля. Тогда у меня к Вам огромная просьба - если у Вас есть какой-нибудь ПРИМЕР, как обрабатывать прерывания из модуля, пожалуйста, поделитесь опытом. Я еще не очень уверенно знаю, что и где нужно писать в программе, чтобы достичь желаемого результата - иногда спотыкаюсь на банальных вещах. А так, когда есть пример перед глазами - можно было бы по образу и подобию научиться делать что-то самому. В общем, если у Вас (или кого-либо еще) есть такая программа-пример-обучалка и не жалко ею поделиться - очень прошу - откройте заветную тайну обработки аппаратных прерываний. Мой почтовый ящик всегда к вашим услугам. У меня самого чего-то не хватает, чтобы совладать с ними. Наверное, руки не оттуда растут :) ------------------------------------- С уважением и наилучшими пожеланиями, Юрий В. Воробьев / Yuriy V. Vorobev E-Mail: Vorobev@niiteplopribor.com
|