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 :

Timer avec pas de 1 micro-seconde


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2014
    Messages : 3
    Points : 5
    Points
    5
    Par défaut Timer avec pas de 1 micro-seconde
    Bonjour,

    Comme l'indique mon pseudo je suis actuellement apprentis.

    Dans le cadre de mon alternance professionnel je dois développer un environnement de travail purement virtuel ( c’est à dire, sur un pc avec VisualStudio) en langage C , à partir d'un code source C d'un système embarqué.
    De ce fait je suis amené à "bouchonner" et/ou simuler tout un tas de fonctions qui dépendent du hard, dans le but de faire fonctionner le code source sur pc.

    Je dois notamment simuler un composant physique externe, par l'intermédiaire d'un timer dans un thread qui fonctionnerait en parallèle du main (ou programme principal) .

    J'aurai donc besoin d'un timer avec un pas en mirco-secondes, ou au pire en milli-secondes .

    Voici donc ma question : Quelles sont les ressources disponibles pour créer un timer en langage C d'un pas de 1 micro-secondes, sur un pc sous windows avec visual studio ?

    J'ai bien sur pensé à la fonction Sleep(Xms), mais d'après mes collègues, trop imprécise en dessous de 20 ms.

    Je vous remercie par avance, et m'excuse pour la gène occasionné, mais si je vous sollicite, c'est que je suis tout nouveau dans le monde de la programmation professionnelle.

    Merci !

    Cordialement,

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    la micro seconde n'est pas accessible.

    Ton timer ne sera pas plus précis que le scheduler de l'OS, qui est souvent calés sur des millisecondes.
    Tu peux éventuellement avoir une mesure du temps plus précise, mais pas un contrôle.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 149
    Points : 28 116
    Points
    28 116
    Par défaut
    Citation Envoyé par ApprentiIngenieur Voir le message
    J'ai bien sur pensé à la fonction Sleep(Xms), mais d'après mes collègues, trop imprécise en dessous de 20 ms.
    C'est probablement parce que le quantum de temps de ton processeur est de 20ms... Je pense que tu ne te rends pas bien compte de ce que tu demandes en fait, mais tu peux essayer de regarder du côté du temps-réel s'il y a des fonctionalités qui pourraient t'aider -- attention, ce n'est pas parce qu'on parle de temps réel que tu auras accès à des microsecondes.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  4. #4
    Invité
    Invité(e)
    Par défaut
    Tu peux regarder du côté de la fonction nanosleep().

    D'après mes souvenirs, on peut accéder grâce au temps réel à un pas de 1ms.
    Sous linux, il est possible de modifier le noyaux pour allez jusqu'au 1µs. Mais je serai bien incapable de te dire ce qui est à modifier, je ne l'ai jamais réalisé encore.

  5. #5
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    nanosleep permet de le faire en théorie, mais le temps d'attente réel peut être plus grand.
    La promesse est que le système fera du mieux qu'il peut pour attendre le temps suggéré, pas moins.

    Tu peux aussi ne pas faire de sleep, et directement utiliser une mesure de "maintenant", mais avec la même imprécision.

    Cela signifie que tu vas pouvoir lisser ton action, en fonction des derniers passages.
    C'est le genre de chose qui se fait dans les jeux vidéos (soit toujours, soit avec l'option "limiter le FPS")
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2014
    Messages : 3
    Points : 5
    Points
    5
    Par défaut
    Re,

    Merci pour vos réponses! finalement en me baladant sur internet et en discutant avec des collègues je me suis bien rendu compte qu'un timer d'un pas de 1 microseconde n'est pas réalisable (sur windows en tout cas. "Sur linux il y aurait plus de possibilités")

    Effectivement je ne me rendais pas bien compte de ce que je demandais. Du coup j'ai revu mes objectifs à la baisse ce qui n'est très grave au final car mon but est de créer un environnement de développement.

    J'ai donc donc fais des tests avec la fonction SleepEx et j'arrive au mieux à un timer de 15 ms avec un delta de 1 ms, je vais devoir me contenter de ça ^^

    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
    #include <windows.h>
    #include <time.h>
    #include <stdio.h>
     
    void main(void)
    {
     
    long i = 6000000L;
    clock_t start, finish;
    long double duration; 
     
    while(1)
       {
       			start = clock();
    			SleepEx(20, FALSE);
    			finish = clock();
    			duration = (long double)(finish - start) / CLOCKS_PER_SEC;
    			printf( "%Lf seconds\n", duration );
       }
    }
    voila de ce qui est pour mon code de test, qui est bien sur soumis aussi à la précision de la fonction "clock".
    En tout cas pour cet exemple(avec SleepEx(20, FALSE);) je trouve comme résultats :

    15 ms
    16 ms
    31 ms
    15 ms
    16 ms
    31 ms
    ....
    ...
    bizarre le 31 ms
    Par contre pour SleepEx(15, FALSE); je vais trouver
    15 ms
    16 ms
    15 ms
    16 ms
    c'est un peu mieux mais ça reste un peu aléatoires bizarre comme résultats ^^

    gangsoleil, tu veux dire quoi par "fonctionnalités du côté du temps-réel " ?

    archMqx, j'ai regardé pour nanosleep et au passage usleep sur internet, mais je n'ai rien trouvé de vraiment convaincant. J'ai fais quelques tests mais à chaque fois les variables n'étaient pas reconnu du fait de la bibliothèque non lue sur windows ( peut être ? c'est ce que j'ai compris)

    Merci!

  7. #7
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 149
    Points : 28 116
    Points
    28 116
    Par défaut
    Citation Envoyé par ApprentiIngenieur Voir le message
    tu veux dire quoi par "fonctionnalités du côté du temps-réel " ?
    Il y a certains OS qui supportent des modes pseudo-temps réel, c'est à dire un mode dans lequel tu peux émuler des fonctionalités temps-réel. Bien sur, tu ne pourras jamais trouver de temps-réel dur sans passer par du hardware, mais ça permet déjà pas mal de choses.

    Quant au pas de 1 micro-seconde sous Linux, ne rève pas, ce n'est pas atteignable non plus.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    À ma connaissance, le quantum de temps de Windows est de 1/64e de seconde, soit environ 15.6ms. La seule mesure de temps sous Windows qui soit vraiment plus précise est QueryPerformanceCounter().
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2014
    Messages : 3
    Points : 5
    Points
    5
    Par défaut
    Ce qui pourrait expliquer pourquoi je trouve du 15~16ms en intervalle de temps minimum quand je fais un SleepEx(15, FALSE); et encore en-dessous ( SleepEx(10, FALSE).

    En tout cas merci et Je vais essayer avec QueryPerformanceCounter() pour des mesures de temps précises plus précises.

  10. #10
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 368
    Points : 23 622
    Points
    23 622
    Par défaut
    Citation Envoyé par ApprentiIngenieur Voir le message
    Ce qui pourrait expliquer pourquoi je trouve du 15~16ms en intervalle de temps minimum quand je fais un SleepEx(15, FALSE); et encore en-dessous ( SleepEx(10, FALSE).
    En tout cas merci et Je vais essayer avec QueryPerformanceCounter() pour des mesures de temps précises plus précises.
    Si c'est pour faire des mesures, tu peux adopter l'approche inverse : lire une horloge. Soit l'horloge système, soit utiliser RDTSC ou RDTSCP pour lire directement le compteur de cycles du micro-processeur qui, lui, est très régulier. En revanche, ça va dépendre notoirement de beaucoup de choses : la cadence du micro-processeur elle-même, les effets dus au pipelining, à la parallélisation sur les différents cœurs et, enfin et surtout, au frequency scaling si tu fonctionne sur une machine prévue pour gérer cela (fort probable sur une machine de bureau pas trop vieille).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. dérivée seconde avec pas non constant
    Par ginafort dans le forum Mathématiques
    Réponses: 7
    Dernier message: 07/03/2011, 08h06
  2. Réponses: 5
    Dernier message: 03/03/2010, 13h27
  3. [c#][VSN2003] timer avec bouton
    Par shinkyo dans le forum Windows Forms
    Réponses: 5
    Dernier message: 24/04/2006, 22h42
  4. [TPW] Incrémentation avec un vrai centième de seconde !
    Par biomanred dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 14/02/2006, 14h55
  5. [MFC] Cherche Timer avec thread
    Par romeo9423 dans le forum MFC
    Réponses: 17
    Dernier message: 09/03/2005, 10h33

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