IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

'interuption' temps reel


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Par défaut 'interuption' temps reel
    Bonjour a tous,
    Je viens poster ici pour avoir quelques avis sur un probleme rencontré:
    J'ai une routine principale en C qui tourne sur un PC.
    Ce PC est relié a une board.
    J'ai deux fonctions deja implémentées:
    void transmit(char *)
    void receive(char *)
    qui me permettent de communiquer entre mon soft pc et la board.
    Mon soft pc me propose un menu (sous dos) avec divers choix(1 2 3 ou 4),
    qui m'amene a des sous menus.
    Certains choix permettent d'aller directement parametrer la board.

    Lorsque je veux communiquer avec la board je suis obligé d'utiliser la syntaxe:
    coté pc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    choix = getchar();
    getchar(); //ne pas transmettre ENTER
    transmit(&choix);
    et sur la board
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char c = receive(&c);
    Mon probleme maintenant est que je dois calculer au prealable a quel moment je vais envoyer un parametre de facon a placer au bon endroit de mon code les "transmit()" et "receive()", ce qui limite l'utilisateur.
    Par exemple si un choix nous amene dans une routine un peu longue (ex lecture fichier) je suis obligé d'attendre la fn de cette routine pour pouvoir transmettre un nouveau parametre.
    Quels conseils me donneriez vous pour pouvoir ne pas definir au prealable tous ces transmit() mais un seul ou une fonction qui puisse ainsi me permettre d'interrompre une tache?
    Aussi ce meme principe pourrait permettre de ne plus calculer au prealable quand la board va nous renvoyer une data.
    Est ce realisable?
    Vos commentaires sont les bienvenus.
    Merci davance

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par sone47 Voir le message
    J'ai une routine principale en C qui tourne sur un PC.
    Quel système ?
    Ce PC est relié a une board.
    Une carte électronique ? Avec un uart, quel genre de logiciel dessus ? C'est toi qui l'a écrit ?
    J'ai deux fonctions deja implémentées:
    void transmit(char *)
    void receive(char *)
    Qui tournent sur le PC et/ou sur la carte ? Ce sont des fonction de transfert de chaines de caractères ? Je ne vois pas bien comment peut fonctionner receive() sans indication de taille... Explosion en perspective...

    qui me permettent de communiquer entre mon soft pc et la board.
    Mon soft pc me propose un menu (sous dos) avec divers choix(1 2 3 ou 4),
    qui m'amene a des sous menus.
    Certains choix permettent d'aller directement parametrer la board.
    Ton PC tourne sous DOS ? Bienvenu au moyen age...
    Lorsque je veux communiquer avec la board je suis obligé d'utiliser la syntaxe:
    coté pc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    choix = getchar();
    getchar(); //ne pas transmettre ENTER
    transmit(&choix);
    Ah, tu transmets les caractères un par un... ? Pourquoi char * et pas int ? OK, Je comprends mieux l'interface de receive()...

    J'aurais fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
         void transmit(int c) 
         void receive(char *pc)
    ou
    et sur la board
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char c = receive(&c);
    OK, c'est cohérent.

    Mon probleme maintenant est que je dois calculer au prealable a quel moment je vais envoyer un parametre de facon a placer au bon endroit de mon code les "transmit()" et "receive()", ce qui limite l'utilisateur.
    WTF ? Quels sont les besoins de dialogue de ton application PC avec la carte ?

    Il faut faire les choses dans l'ordre. Il faut passer par une phase de définition sérieuse, puis par une conception qui fera apparaitre la manière d'organiser le code. Le codage ça vient après tout ça.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Par défaut
    Merci d'avoir repondu.
    Mon Pc ne tourne pas sous dos c'est juste une fenetre dos qui m'affiche un menu.
    Les fonctions transmit et receive sont deja implementé. Bien sur il y en a deux de chaque, une qui transmet un caractere et une ou l'on peut definir une taille mais j'ai voulu faire simple pour l'explication et je ne me sert que de celle qui envoie 1 caractere.
    Mon but n'est pas d'aller modifier le code sur la board pour l'instant je ne me penche que sur ma routine principale sur pc.
    Je voudrai juste dans mon soft pc (sous win2000 buildé avec visual) n'avoir qu'une fonction pour la transmission independante.
    C'est a dire qu' a n'importe quel moment je puisse lorsque j'appui sur un caractere l'envoyer directement (via transmit(char *)) sans attendre qu'une routine dans mon main se termine (l'interrompre).
    Le meilleur serait meme que je n'ai pas a valider par entrer.
    Je ne sais pas si on peut qualifier ceci d'interruption ni meme si c'est realisable.
    Par la suite je m'interresserai a la board pour avoir ce meme systeme avec la reception.
    Merci beaucoup d'avance.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Par défaut
    Pour faire plus simple et concret,
    J'ai mon main dans lequel s'execute plusieurs tache.
    A un moment quelconque j'appui sur une touche clavier, ce qui me declenche une transmission (transmit(char *)) instantanement sans attendre que la routine qui etait en train de s'executer se termine.
    Des que l'on est passé par cette fonction transmit(char *) on reprend notre routine que l'on avait interrompu.
    J'ai pu voir la fonction kbhit() mais elle ne permet pas d'interrompre une tache.
    Est ce realisable ?
    merci

  5. #5
    Membre chevronné Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Par défaut
    Citation Envoyé par sone47 Voir le message
    Pour faire plus simple et concret,
    J'ai mon main dans lequel s'execute plusieurs tache.
    A un moment quelconque j'appui sur une touche clavier, ce qui me declenche une transmission (transmit(char *)) instantanement sans attendre que la routine qui etait en train de s'executer se termine.
    Des que l'on est passé par cette fonction transmit(char *) on reprend notre routine que l'on avait interrompu.
    J'ai pu voir la fonction kbhit() mais elle ne permet pas d'interrompre une tache.
    Est ce realisable ?
    merci

    Tu peut faire utiliser les thread par exemple? je pense qu'il suffit de lancer un thread qui fera le traitement ( sans interrompre l'exécution du main)

    Ou plus encore, les signaux, tu déclenché une opération par les signaux juste ne envoyant le signale a votre process ?

    mais tous ça reste à voire, il nous faut un bout de code pour qu'on puissent mieux t'aider.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Par défaut
    Merci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    int main (void)
    {
      char choix;
      while(1)
      {
      printf("faire selection:\n");
      printf("lecture --> 0\n");
      printf("ecriture--> 1\n");
      choix = getchar();
      getchar();
      transmit(&choix);
      switch(choix)
      {
        case '0' : 
             printf("lecture carte...\n");
             //.... autres actions
        break;
        case '1' :
             printf("ecriture carte ...\n");
             //.... autres actions
        break;
        defaut : 
             printf("erreur saisie");
        break;
     
      }
      }
    }
    Voici actuellement ce que j'ai.
    Maintenant le probleme: si je suis en train de lire dans le case 0, j'effectue toutes les autres actions. Si je veux ecrire je suis obligé d'attendre que je sorte du case 0 (donc de finir toutes mes procedure qu'il y a dedans) pour revenir au getchar initial.
    Avec ce code ma saisi n'est possible qu'au debut de ma boucle while alors que j'aimerai pouvoir envoyer un caractere a n'importe quel moment.

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par sone47 Voir le message
    Merci d'avoir repondu.
    Mon Pc ne tourne pas sous dos c'est juste une fenetre dos qui m'affiche un menu.
    Une fenêtre DOS, tu es sûr ? Quel est ton système ?
    Les fonctions transmit et receive sont deja implementé. Bien sur il y en a deux de chaque, une qui transmet un caractere et une ou l'on peut definir une taille mais j'ai voulu faire simple pour l'explication et je ne me sert que de celle qui envoie 1 caractere.
    OK.
    Mon but n'est pas d'aller modifier le code sur la board pour l'instant je ne me penche que sur ma routine principale sur pc.
    Je voudrai juste dans mon soft pc (sous win2000 buildé avec visual) n'avoir qu'une fonction pour la transmission independante.
    Sous Win32, donc. Tu peux donc utiliser les threads pour rendre clavier, console, émission et réception indépendants.

    http://emmanuel-delahaye.developpez.com/pthreads.htm

    Après, c'est un problème de bonne conception.

    Par la suite je m'interresserai a la board pour avoir ce meme systeme avec la reception.
    Ca, par contre, ça va dépendre du système qu'il y a sur ta carte.

Discussions similaires

  1. Réponses: 3
    Dernier message: 24/12/2004, 17h22
  2. Stats : connaitre en temps reel les requetes en cours d'exec
    Par jeff37 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 21/12/2004, 17h01
  3. [Info][Debutant(e)]affichage temps reel
    Par nine dans le forum Développement Web en Java
    Réponses: 15
    Dernier message: 26/11/2004, 17h03
  4. Réponses: 5
    Dernier message: 19/07/2004, 17h27
  5. Linux et le temps réel
    Par Shrem dans le forum Administration système
    Réponses: 6
    Dernier message: 11/12/2002, 08h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo