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 :

Utilisation de sleep ou de timer ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Mars 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Mars 2014
    Messages : 4
    Par défaut Utilisation de sleep ou de timer ?
    Bonjour,
    Je dois développer un programme pour un os linux 3.14 embarqué (sur processeur arm) en langage C et, n'étant expert en développement, je me pose la question de la meilleure implémentation à faire.
    Mon programme est assez simple et réalise la fonction suivante : toute les secondes, il va consulter l'état d'un fichier pour mettre à jour l'état d'une led.
    Ma question concerne le timing de l'action à réaliser toutes les secondes ; sur ce que j'ai lu, il y aurai 2 façon de faire :
    - utiliser sleep dans une boucle while(1)
    - utiliser des timer avec timer_create et timer_settime

    Quels sont les avantages/inconvénients de chaque solution ?

    Merci d'avance

  2. #2
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 125
    Par défaut
    Bonjour,
    Est-ce une obligation de passer par du C car si ce n'est que l'automatisation que tu vises, il est possible de la faire simplement via cron ?
    A+

  3. #3
    Membre expérimenté

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 329
    Par défaut
    Si mes souvenirs sont bons: cron permet d'exécuter une commande (un programme) à intervalle régulier (toutes les secondes c'est possible).

    Par contre il faut que le programme soit accessible par "cron" (permissions, droits d'accès, ...), chaque utilisateur à son propre "crontab", il faut y penser.

    Je pense que dans ta question il y a une volonté d'aller vers la solution la plus "simple" à mettre en œuvre, le while(1) avec un sleep(1) dedans devrait convenir.

    Je ne suis pas un expert en temps réel, mais je pense que sleep(1) suffira pour faire le test des valeurs et allumer ou non la led (là aussi je ne suis pas électronicien je ne sais pas si une led prend l'état 0 ou 1 ou une valeur analogique) chaque seconde écoulée.

    Le timer serait plus approprié si plusieurs processus devaient appeler une fonction particulière au bout d'un certain temps: dans le contexte "asynchrone". Un "time out" dans un processus qui vérifie l'existence d'une connexion, par exemple. On sait que c'est après trois secondes,
    par exemple, que le "timer" va déclencher l'appel de la fonction pour indiquer que la connexion est perdue, par exemple, mais ce n'est pas toutes les trois secondes que la fonction va être appelée. Des fois ce sera effectivement après trois secondes, manque de bol, et des fois pas du tout.

    Je ne sais pas si je m'exprime correctement.

    Ici si tu es certain que tes opérations doivent s'exécuter toutes les secondes je pense que ça ne sert pas à grand chose de mettre un "timer" sur le champs de bataille, un sleep(1) suffit.

  4. #4
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    Citation Envoyé par victorienv Voir le message
    Quels sont les avantages/inconvénients de chaque solution ?
    difficile à dire je ne fais pas d'embarqué pour ma part et je ne connais pas non plus les contraintes liées à ton programme en l’occurrence

    j'aurais tendance à penser que si ton programme ne fait rien d'autre, un sleep() fera parfaitement l'affaire, là où timer_settime() lèvera probablement une interruption qui pour autant ne fera pas dormir ton while(1) qui même s'il n'exécute "presque rien" affichera une conso de 100% cpu

    en revanche la granularité de cron est de l'ordre de la minute, je te confirme que ça n'est pas une alternative dans ton cas

  5. #5
    Invité
    Invité(e)
    Par défaut
    Niveau avantage et inconvénient ... Je ne saurai dire.

    Par contre, je pense que le le timer est bien plus approprié ici qu'un sleep.

    Pourquoi ?
    Un timer donne une référence de temps précise, calé sur l'horloge du cpu. A contrario, sleep() donne une échéance de temps ~1sec. sleep() est moins précis donc.

    Une solution a base de while(1) { sleep(1); } à l'inconvénient d'une part de ne pas être calé toute les 1secondes (dû au fait de l'imprécision de sleep), et d'autre part de "perdre" le temps de l'exécution des instructions de lecture ui viennent après ton sleep.

    Utiliser un timer périodique te permet d'être sûr d'être toujours calé à la seconde prêt, et que l'exécution des instructions de lecture n’empiéteront pas sur le décomptes.
    Concrètement, dans le code, il suffira d'armer le signal correspondant au timer, d'armer le timer en périodique, et dans le handler de signal y mettre les instructions de lecture. Cela te permet, dans le code, d'effectuer d'autre opération avant de te caler sur un while(1) { pause(); }.

    En espérant pouvoir t'aider ainsi.. !

  6. #6
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    Citation Envoyé par archMqx. Voir le message
    je pense que le le timer est bien plus approprié ici qu'un sleep.
    ben justement, je pense que c'est le contraire ici, pourtant je comprends bien ton raisonnement

    Un timer donne une référence de temps précise, calé sur l'horloge du cpu. A contrario, sleep() donne une échéance de temps ~1sec. sleep() est moins précis donc.
    voila je me suis dit la même chose, c'est pour ça que je précisais qu'on ne connait pas ses contraintes ici, mais vois la chose sous un angle différent; sleep() libère l'ordonnanceur qui réactivera le processus au bout du temps voulu, le temps d'exécution des instructions qui suivent, si elles ne font que checker un fichier est de l'ordre de quelques microsecondes, mais sleep() libèrera le CPU pour mettre le processus en sommeil, tandis que le timer sera effectivement possiblement plus fin, plus "absolu", mais génèrera potentiellement plus d'aio

    sans parler du fait que celui qui réveille le processus suite à un sleep() ou déclenche l'interruption dans le cas d'un timer, dans les deux cas c'est le noyau à travers l'ordonnanceur, y'a peu de chances que la seconde chez sleep() en dure réellement 0.999s

    en fait à bien y réfléchir je me demande même il n'y a pas moyen de coupler les deux un peu habilement, de manière à tourner sur plusieurs itérations autour de sleep() et enrouler un timer autour pour faire une sorte d'auto-correction (par exemple toutes les 10s en relançant 10 itérations de sleep())

    reste que tout dépend son besoin réel derrière, si ça se trouve un morceau de bash lui conviendrait aussi bien

Discussions similaires

  1. utilisation de sleep
    Par luciendorali dans le forum Général Python
    Réponses: 3
    Dernier message: 30/07/2011, 09h37
  2. Réponses: 2
    Dernier message: 10/04/2008, 21h36
  3. [Tomcat][sleep]De la bonne utilisation du sleep??
    Par Titom dans le forum Tomcat et TomEE
    Réponses: 3
    Dernier message: 11/01/2005, 10h25
  4. Utilisation de Timer
    Par Freakazoid dans le forum DirectX
    Réponses: 1
    Dernier message: 07/07/2004, 23h27
  5. [][Timer] Créer un Timer sans utiliser le composant
    Par HPJ dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 01/10/2003, 11h04

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