The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Обработка аппаратных прерываний в 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(). Этот вызов я видел в каждом из драйверов.

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

  • Обработка аппаратных прерываний - проблемы продолжаются, !*! 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




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру