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 :

Interruption de fonction bloquante


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2007
    Messages
    67
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 67
    Points : 48
    Points
    48
    Par défaut Interruption de fonction bloquante
    Bonjour,

    Je programme actuellement sur une carte de développement implémentant une partie du protocole 802.15.4 (couches basses du ZigBee) pour un projet avec mon école. Or je me suis rendu compte que la carte fournie n'implémentait pas de couche MAC, c'est pourquoi j'ai commencé à en développer une toute simple. Le détail de la MAC n'est pas important en fait, c'était juste pour situer le contexte.

    Voilà le topo :
    - Je lance un thread en récéption qui effectue la boucle suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while(1) {
      Recevoir données (fonction bloquante)
      Traiter données
    }
    - Je lance un thread en émission qui lui boucle sur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while(1) {
      Attendre données à envoyer (bloquante)
      Envoyer les données
    }
    Le premier problème qui s'est posé est l'accès concurrent au medium de communication (c'est du sans fil, pas de duplex), il a donc fallu rajouter un mutex pour réserver le droit d'émettre ou de recevoir. Le code ressemble donc à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while(1) {
      Verrouiller mutex
      Recevoir données (fonction bloquante)
      Deverrouiller mutex
      Traiter données
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while(1) {
      Attendre données à envoyer (bloquante)
      Verrouiller mutex
      Envoyer les données
      Deverrouiller mutex
    }
    Le problème que j'ai maintenant, c'est le fait que la fonction de réception est bloquante, et qu'il me faudrait un moyen pour que l'émetteur prenne le pas sur le récepteur (signal, interruption) et le force à libérer le medium (sauf si il est en train de recevoir des données) dans le cas où il veut émettre. J'ai déjà préparé un peu le terrain en donnant au thread émetteur une référence vers le thread récepteur (pointeur vers le thread).

    Je ne m'y connais pas spécialement en C et j'aimerais avoir un avis pour m'éclairer... A moins que quelqu'un ait une idée complètement différente sur le sujet !

    Note : Je travaille sur une carte de développement, qui utilise Mantis OS, je ne dispose PAS de toutes les fonctions standardes du C... mais proposez tout de même !

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    La résolution de ton problème est spécifique à ton environnement de développement.

    Quels sont les moyens dont tu disposes en termes de capacités de comunnication inter process pour faire cela car il y a peut être plusieurs solutions possibles.

    Est ce que tu peux tester de manière "thread safe" si des données sont prêtes à être reçues sans prendre le mutex ?

    Est ce que cela te dérange de ne pas recevoir tes données immédiatement mais avec un délai maximal de disons 1 seconde ?
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2007
    Messages
    67
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 67
    Points : 48
    Points
    48
    Par défaut
    Je développe sous Mantis OS 1.0-beta (lien vers la doc de la version la plus approchée de celle que j'ai).

    L'équipement utilisé est une carte de développement TelosB.

    Je n'ai pas eu encore le temps d'étudier à fond les capacités IPC du système, et je n'ai encore que peu d'expérience dans ce domaine, donc ça risque de me prendre du temps. Mais j'ai pu voir dans le code source de l'OS qu'il y a des alarmes, des sémaphores (et mutex), et peut-être d'autres possibilités, mais rien de bien clair.

    Pour le test des données prêtes, je sais que la fonction de réception (bloquante) que j'utilise stocke les données dans un buffer et indique dans un champ annexe la taille des données déjà stockées, mais je ne sais pas encore où il prend ces valeurs (c'est bien à ça que tu t'intéresses quand tu dis "si des données sont prêtes", non ?).

    Le retard de réception n'est pas primordial si ça peut permettre d'éviter de perdre des données à cause d'une interruption mal placée.

    J'espère que mes explications sont assez claires (et surtout, pas hors sujet...).

Discussions similaires

  1. Fonction bloquante attendant un signal
    Par Jorodan dans le forum GTK+ avec C & C++
    Réponses: 4
    Dernier message: 25/06/2007, 12h04
  2. [tcplistener]fonction bloquante et multithread
    Par ronan99999 dans le forum C#
    Réponses: 1
    Dernier message: 23/05/2007, 15h02
  3. Réponses: 3
    Dernier message: 10/01/2006, 14h01
  4. Réponses: 5
    Dernier message: 16/12/2005, 17h41
  5. [Threads] Sortir d'une fonction bloquante
    Par guejo dans le forum MFC
    Réponses: 19
    Dernier message: 17/08/2004, 14h12

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