|
|
|
#1 |
|
Messages: n/a
Hébergeur: |
Bonjour,
je souhaiterais avoir un timer à la milliseconde.(sous windows XP) Le but est d'aller lire à plusieurs adresses des valeurs analogiques (numérisees par une carte dédiée (pilote uniquement sous windows).) J'ai essayé dans un thread de mettre sleep(1), mais la temporisation correspondante est autour de 10ms. J'ai la solution d'utiliser soit un timer qui me déclenche un evenement et à ce moment je vais lire les adresses, soit une temporistation dans une boucle pour éviter de bloquer la CPU.(si je vais lire sans arrêt aux adresses) Merci de vos suggestions Jeff |
|
|
|
#2 |
|
Messages: n/a
Hébergeur: |
J-F Portala a écrit :
> Bonjour, > je souhaiterais avoir un timer à la milliseconde.(sous windows XP) > Le but est d'aller lire à plusieurs adresses des valeurs analogiques > (numérisees par une carte dédiée (pilote uniquement sous windows).) > J'ai essayé dans un thread de mettre sleep(1), mais la temporisation > correspondante est autour de 10ms. > > J'ai la solution d'utiliser soit un timer qui me déclenche un evenement et à > ce moment je vais lire les adresses, > soit une temporistation dans une boucle pour éviter de bloquer la CPU.(si je > vais lire sans arrêt aux adresses) > > Merci de vos suggestions > Jeff Est ce qu'il n'y aurait pas usleep aussi ou nanosleep() (je sais pas si c'est POSIX) ? Sinon, certain utilisent select (ou l'équivalent sous XP) pour faire des timers. Michael |
|
|
|
#3 |
|
Messages: n/a
Hébergeur: |
J-F Portala a écrit :
> Bonjour, > je souhaiterais avoir un timer à la milliseconde.(sous windows XP) > Le but est d'aller lire à plusieurs adresses des valeurs analogiques > (numérisees par une carte dédiée (pilote uniquement sous windows).) > J'ai essayé dans un thread de mettre sleep(1), mais la temporisation > correspondante est autour de 10ms. > > J'ai la solution d'utiliser soit un timer qui me déclenche un evenement et à > ce moment je vais lire les adresses, > soit une temporistation dans une boucle pour éviter de bloquer la CPU.(si je > vais lire sans arrêt aux adresses) > > Merci de vos suggestions > Jeff > > un timer à 1ms ne sera jamais précis à 1ms, selon moi ... -- -uTb#`diablo PWed by GNU/Linux Debian on Diablo |
|
|
|
#4 |
|
Messages: n/a
Hébergeur: |
J-F Portala wrote:
> Bonjour, > je souhaiterais avoir un timer à la milliseconde.(sous windows XP) > Le but est d'aller lire à plusieurs adresses des valeurs analogiques > (numérisees par une carte dédiée (pilote uniquement sous windows).) > J'ai essayé dans un thread de mettre sleep(1), mais la temporisation > correspondante est autour de 10ms. > > J'ai la solution d'utiliser soit un timer qui me déclenche un evenement et à > ce moment je vais lire les adresses, > soit une temporistation dans une boucle pour éviter de bloquer la CPU.(si je > vais lire sans arrêt aux adresses) Voir les API multimédia de Windows: timeBeginPeriod timeEndPeriod timeGetDevCaps timeGetSystemTime timeGetTime timeKillEvent TimeProc timeSetEvent Et pour plus de précision dans le calcul de temps: QueryPerformanceCounter QueryPerformanceFrequency -- Frédéric Lachasse - ECP86 |
|
|
|
#5 |
|
Messages: n/a
Hébergeur: |
J-F Portala, le 28/03/2008 a écrit :
> Bonjour, > je souhaiterais avoir un timer à la milliseconde.(sous windows XP) > Le but est d'aller lire à plusieurs adresses des valeurs analogiques > (numérisees par une carte dédiée (pilote uniquement sous windows).) > J'ai essayé dans un thread de mettre sleep(1), mais la temporisation > correspondante est autour de 10ms. Et de toutes façons, le thread est *à priori* dans son propre temps, et n'existe pas dans dans certaines périodes du vrai temps. > J'ai la solution d'utiliser soit un timer qui me déclenche un evenement et à > ce moment je vais lire les adresses, > soit une temporistation dans une boucle pour éviter de bloquer la CPU.(si je > vais lire sans arrêt aux adresses) Je vais certainement écrire des conneries, ça fait un moment que je n'ai pas fait du bas niveau sous XP. Mais si ça peut vous servir... XP standard (je ne connais pas embedded, par exemple) n'est pas un OS temps réel. On peut lire le temps machine et le temps processus sans problème, mais il est impossible simplement de générer des intervalles. J'avais il y a longtemps fait des tests sous C++ Builder ou Delphi, c'est pareil pour ce qui nous intéresse. Le timer VCL était calamiteux, la fenêtre était si je me souviens bien de 30ms, à l'époque des horloges de l'ordre de 0,5 à 1,5 GHz. En diminuant la consigne du timer puis en bouclant sur RDTSC dans un thread, on arrivait à s'en sortir, au prix d'une charge processeur temporaire donc acceptable. Mais même en jouant sur la priorité - aucune influence, d'ailleurs - on ne pouvait se prémunir avec certitude de la prise de contrôle du noyau. Il existe peut-être des solutions dans les API, il est possible d'écrire un driver, mais on casse alors ce qui fait l'intérêt de XP. Et une machine XP dédiée à un seul contrôle hard, c'est débile. La solution normale est à mon avis de déléguer à la périphérie la gestion de l'interface entre le temps réel et l'asynchrone. C'est élégant et confortable, vous gérez facilement à haut niveau (presque) autant d'interface acquisition - actionneur - etc. - que vous le souhaitez. Si vous avez une carte du commerce adaptée à une période de mesure inférieure ou égale à la milliseconde, et qu'elle est dédiée à XP, la solution devrait se trouver dans sa documentation. Si la carte est développée en interne, c'est à elle de gérer le temps réel et ensuite sérialiser les échantillons. Dans le cas qui n'est certainement pas le vôtre d'un périphérique d'acquisition sur une liaiason série ou autre, il est sans doute rentable d'intercaler un microcontrôleur - PIC par exemple - entre le pécé et le boîtier. -- Pierre Maurette |
|
|
|
#6 |
|
Messages: n/a
Hébergeur: |
J-F Portala wrote on 28/03/2008 11:03:
> Bonjour, > je souhaiterais avoir un timer à la milliseconde.(sous windows XP) > Le but est d'aller lire à plusieurs adresses des valeurs analogiques > (numérisees par une carte dédiée (pilote uniquement sous windows).) et cette care dédiée (de quelle marque et quelle nature ?) ne propose pas l'envoi bufferisé de ces valeurs selon un timer hard qui lui est propre ? (bcp de cartes NI feraient ça). Sylvain. |
|
|
|
#7 |
|
Messages: n/a
Hébergeur: |
J-F Portala wrote:
> Bonjour, > je souhaiterais avoir un timer à la milliseconde.(sous windows XP) Spécifique OS. Voir sur fr.comp.os.ms-windows.programmation où ça a été discuté des dizaines de fois. |
|
![]() |
| Outils de la discussion | |
|
|