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

Windows Discussion :

Timer precis 1ms sous Windows XP


Sujet :

Windows

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 81
    Points : 65
    Points
    65
    Par défaut Timer precis 1ms sous Windows XP
    Bonjour,

    Je dois développer une application qui nécessite un timer haute fréquence (1ms) sous Windows XP. J'ai essayé plusieurs méthodes, timer Qt, timer Windows, Sleep(1), etc. et j'arrive toujours au même résultat : la période de ma boucle est de 15ms environ au lieu de 1 ms souhaité.
    Pour info, j'utilise le timer multimedia (queryPerformanceCounter) pour dater.

    En faisant quelques recherches sur le net, je me suis aperçu que cette valeur de 15ms revenait souvent et était dû à des mécanismes internes de Windows (l'ordonnaceur je suppose?). Et je suis tombé sur cette page :
    http://www.haypocalc.com/wiki/Temps
    où l'on parle du chipset intel 8253 qui permet de
    générer une interruption à une fréquence entre 2 Hz et 8192 Hz
    Il signale aussi que Windows utilise une fréquence de 66 ou 100Hz (ce qui explique mes 15ms).

    Pour résumer, voici ma question : existe-il un moyen d'accéder sous Windows à cette horloge et de générer une interruption à 1kHz ?

    D'avance merci pour vos réponses.

  2. #2
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Points : 734
    Points
    734
    Par défaut
    Si ce chipset est bien ce à quoi je pense, il s'agit d'une horloge interne au PC qui declenche une interruption à intervalles reguliers (et programmable)

    Je m'en servais pour faire des petits jeux sous Dos... mais c'est du bas niveau et à mon avis, aucune chance d'y acceder depuis Windows.

    Pour ce qui est des timers tres courts, c'est pas gagné avec un OS non temps-réél comme windows.

    15ms correspond en gros à un "quantum" de temps alloué par l'OS au processeur pour gérér un processus.

    Lorsque tu fais un "sleep", le processus fait une pause et ne reprendra donc pas la main avant le prochain quantum de temps => 15ms.

    C'est plus ou moins reglage en jouant sur les priorités des processus, il me semble.

    Sinon, concretement, j'ai eu le meme souci en JAVA, pour avoir un timer precis.

    J'avais besoin de recalculer une position toutes les 10ms (incrementer un truc de 10pixel pour le faire avancer de 1000 pixels par secondes)

    Le dessin en lui-meme etait géré par un autre thread, qui dessinait à la position courante.

    Ainsi, que l'on dessine 1 ou 100 images par secondes (en fonction des capacités du PC) l'image avance toujours à la meme vitesse. (plus ou moins sacadée)

    Du coup, j'avais proceder comme ça :

    - un timer toutes les 10ms
    - à chaque timer, je mesurer le temps precis avec un truc du genre QueryPerformanceCounter
    - je recalculait la position en tenant compte du fait que je n'avais pas eu une pause de 10ms mais de 8.596 ms ou de 12.5789 ms

    (une simple interpolation suffit)

    Par contre, si c'est pour faire une pause réélle, il y a peut-etre moyen en faisant une boucle du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    timer = getPerformanceCounter()
    while (getPerformanceCounter() < timer + duréé)
    {
       // Ne rien faire
    }
    Mais même là, tu ne garantit pas de ne pas t'arreter plus.

    Car si ton processus perd la main entre temps, il devra attendre au moins 15ms (un quantum) avant de la reprendre.

    Si tu veux faire du vrai temps réél, laisse tomber windows !


    D'ailleurs, soit dit en passant, 1ms, c'est tres petit.
    J'avais réalisé une carte electronique d'injection de carburant, et je devais mesurer des temps entre 0.5ms et 2ms.
    Avec une carte electronique dédiée, des composants soigneusement choisits et programmés en assembleur, la precision laissait à desirer.
    Il aurait fallu entre 2 et 5 fois plus de budget pour avoir des composants suffisamment précis.

    Comme quoi, les mesures de temps trop petites, c'est pas gagné avec du matos "grand public" !

  3. #3
    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
    Citation Envoyé par buzzkaido
    Pour ce qui est des timers tres courts, c'est pas gagné avec un OS non temps-réél comme windows.
    <snip>
    Si tu veux faire du vrai temps réél, laisse tomber windows !
    Je rappelle que Linux n'est pas un système temps-réel non plus, hein...

    Windows CE par contre, est décrit sur Wikipédia comme "répondant à la définition d'un OS temps réel"...
    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.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 81
    Points : 65
    Points
    65
    Par défaut
    Je pense avoir trouvé la solution de mon problème. Voici un lien vers une application qui permet de fixer le timer Windows à 1ms tant qu'elle est active.
    http://users.tpg.com.au/lucash/

    C'est déjà un bon début pour ce que j'ai à faire et je pense que ce soft pourrait être utile à pas mal de monde.
    Il y a aussi la solution logicielle, voici quelques pistes que je n'ai pas encore eu le temps d'explorer :
    http://www.codeproject.com/system/timers_intro.asp
    http://www.microsoft.com/technet/sys...ionTimers.mspx
    http://msdn.microsoft.com/library/de...resolution.asp

  5. #5
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Oui il est bien dit dans la msdn de faire appel a timeBeginPeriod et timeEndPeriod pour changer la resolution du timer.

  6. #6
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2014
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Un Timer à 1 ms sous Windows, c'est possible avec le Timer kernel, mais ce n'est pas garanti car Windows n’est pas conçu pour ça, par ailleurs, ça veut dire du développement en mode kernel.
    Y a des solutions sur le marché qui fournissent des Timers de ce type pour Windows.
    Ils garantissent le déterminisme…
    J’ai utilisé une solution temps réel RTX qui fournit des Timers qui battent à la micro, mais ce serait surdimensionné par rapport à votre besoin, RTX étant beaucoup plus qu’un timer.
    Bonne chance.

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

Discussions similaires

  1. Faire un timer precis sous windows !
    Par Niklaos dans le forum C++
    Réponses: 4
    Dernier message: 06/01/2010, 23h15
  2. Assembleur sous Windows et sous Linux
    Par Bibouda dans le forum x86 32-bits / 64-bits
    Réponses: 3
    Dernier message: 28/10/2002, 08h55
  3. Tester connexion Internet active sous Windows
    Par Altau dans le forum Développement
    Réponses: 3
    Dernier message: 12/08/2002, 13h43
  4. Pas de fork sous Windows?
    Par chezjm dans le forum POSIX
    Réponses: 8
    Dernier message: 11/06/2002, 13h15
  5. OmniORB : code sous Windows et Linux
    Par debug dans le forum CORBA
    Réponses: 2
    Dernier message: 30/04/2002, 18h45

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