Faire un don ! | | style | statistiques | contactez-nous | plan | lettre d'information

Programmation.c : IRQ en C

Posté par Fabien C () le 25 avril 2005
Bonjour,

Je dois rédiger un programme en C qui doit lire 4 ports series. Sur chaque ports série se trouve une balance. L'information est obtenue lorsqu'il y a une variation du poids sur la balance.

Exemple: Sur la balance A se trouve 100g de nourriture. Une sourie mange 10g. Sur A nous avons maintenant 90g. L'info est envoyé lorque le poid est stabilisé sur la balance.

Pour ne pas monopolisé le CPU en lecture sur les 4 ports, il faut mettre en place un gestionnaire d'interruption. Ansi, chaque fois qu'une infos ce présente sur un des 4 ports series, le CPU est interrompu par une IRQ en provenance de l'un des 4 ports série.

Le développement sous IRQ en C, je sais pas. Si quelqu'un à des idées, elles sont les bien venues.



Merci d'avance

> Lire le message (15 commentaires, moyenne: 1,4).  

Vous avez demandé le commentaire #567098.

Module noyau ?

Posté par galactikboulay () le 26/04/2005 à 06:49. (lien). Évalué à 2.

Je suppose que tu es sous Linux, un *BSD, ...

Sur plateforme x86, pouvoir détourner une IRQ et l'exécuter nécessite
des droits particuliers en mode protégé (ring 0).

Tu ne pourras pas avoir un gestionnaire d'IRQ en user-land sachant que
ce gestionnaire d'IRQ doit toujours être accessible (il doit donc toujours
être dans un espace "fixe", à savoir l'espace noyau). La réalisation d'un
module noyau me parait nécessaire.

Un ouvrage intéressant et qui pourrait t'aider est "Linux Device Drivers":

http://lwn.net/Kernel/LDD3/(...)

Si je ne me trompe pas, la gestion des IRQ devrait être abordée dedans.

  • [^]Re: Module noyau ?

    Posté par Fabien C () le 26/04/2005 à 09:32. (lien). Évalué à 1.

    Bonjour,

    Plateforme x86, SuSE Linux 2.4.21
    Rédiger un module...oula !!!
    Je pensait pas qu'il faille aller si loin.
    Je ne sais pas trop par ou commencer...

    • [^]Re: Module noyau ?

      Posté par galactikboulay () le 26/04/2005 à 10:00. (lien). Évalué à 2.

      Déjà, fais un petit test en user-land avec select(), comme conseillé
      au-dessus.

      Un squelette écrit à la va-vite (désolé pas testé):

      fd_set rfds;
      int fd[4], max_fd = -1;

      fd[0] = open("/dev/ttyS0",O_RDWR,0600);
      fd[1] = open("/dev/ttyS1",O_RDWR,0600);
      fd[2] = open("/dev/ttyS2",O_RDWR,0600);
      fd[3] = open("/dev/ttyS3",O_RDWR,0600);

      for(i=0;i<4;i++)
      if (fd[i] > max_fd)
      max_fd = fd[i];

      while(1) {
      FD_ZERO(&rfds);
      for(i=0;i<4;i++) FD_SET(fd[i],&rfds);
      select(max_fd+1,&rfds,NULL,NULL,NULL);

      for(i=0;i<4;i++)
      {
      if (FD_ISSET(fd[i],&rfds)) {
      printf("qqch recu sur ttyS%d\n",i);
      }
      }
      }

      Un "man select()" t'expliquera comment marchent FD_SET, FD_CLR,
      etc.

      • [^]Re: Module noyau ?

        Posté par Fabien C () le 26/04/2005 à 10:03. (lien). Évalué à 1.

        OK, je vais déjà essayer tous ca
        Merci pour les infos

        [^]Re: Module noyau ?

        Posté par Daniel Caujolle-Bert (page perso, ) le 26/04/2005 à 10:09. (lien). Évalué à 2.

        et pour la version a timeout, test la valeur de retour de select (chose qui doit etre faite de toute facon :-) ).

        Daniel
        --

        • [^]Re: Module noyau ?

          Posté par galactikboulay () le 26/04/2005 à 10:37. (lien). Évalué à 3.

          C'est une excellente remarque, le retour de tout appel système doit
          être testé :)

          Dans mon petit exemple, il faut donc tester le retour des fonctions
          "open" et "select".

          Même sans timeout, select() peut être interrompu par un signal
          (dans ce cas valeur de retour == -1 et errno == EINTR), c'est
          important d'en tenir compte.

        [^]Re: Module noyau ?

        Posté par Fabien C () le 26/04/2005 à 11:37. (lien). Évalué à 1.

        OK, je vais déjà essayer tous ca
        Merci pour les infos