Précision temporelle d'une éxécution

Résolu
cs_f6dqm1 Messages postés 62 Date d'inscription lundi 8 novembre 2004 Statut Membre Dernière intervention 25 mai 2013 - 29 oct. 2005 à 09:31
cs_f6dqm1 Messages postés 62 Date d'inscription lundi 8 novembre 2004 Statut Membre Dernière intervention 25 mai 2013 - 1 nov. 2005 à 08:27
Bonjour à tous
Dans une application Delphi, je cherche à exécuter une action répétitive sur un port série avec une précision de l'ordre de la milliseconde.
Je pensais pouvoir cadencer cette action avec un timer très précis (ZylTimer).
Malheureusement, la précision est complètement perturbée par la prise en compte par Windows des taches qui tournent en parallèle de mon application.
Je ne sais pas comment Windows répartit l'exécution de toutes ses tâches, mais je vois sur un oscilloscope que mon action est retardée régulièrement de 50 à 100 millisecondes. Celà est manifestement dû au fait que mon application reçoit l'évènement Timer en retard car cet évènement est arrivé pendant qu'une autre tâche se déroulait dans la CPU.
J'ai essayé d'affecter une priorité TIMECRITICAL sur mon application avec la fonction SETPRIORITYCLASS. Celà améliore un tout petit peu le cadencement mais ne résoud pas le problème car, de toutes façons, il faut bien que Windows passe la main à ses tâches annexes à un moment ou à un autre.
Créer un thread pour exécuter mon action répétitive ne change rien puisque le thread s'exécute comme une nouvelle application.
Bref, je ne vois pas du tout comment je peux faire pour éxécuter cette action répétitive avec la précision voulue.
J'imagine qu'il faudrait que l'action s'éxécute à un niveau système très très bas, ou que, lorsque l'évènement Timer arrive, le système repasse immédiatement la main à l'application qui l'attend. Celà est-il possible ?
Si vous avez une idée, je suis preneur.
A vous lire
Gabriel
78 - Noisy le Roi

3 réponses

cs_f6dqm1 Messages postés 62 Date d'inscription lundi 8 novembre 2004 Statut Membre Dernière intervention 25 mai 2013
1 nov. 2005 à 08:27
Bonjour à tous et merci pour les réponses
J'ai installé MMTimer et ça marche pas mal du tout.
En tous cas, la précision que me donne ce timer est tout à fait acceptable pour mon application couplée avec une priorité TIMECRITICAL. Rien à voir avec le ZylTimer que j'avais récupéré sur le Net !
Merci encore et bonne prog à tous
Gabriel
3
cs_Kenavo Messages postés 702 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 1 octobre 2009 5
29 oct. 2005 à 11:46
Salut,



Je connais pas ZylTimer, mais, je te propose d'essayer
[code.aspx?ID=24090 MMTimer]



Pour la précision, il ne faut pas oublier que Windows n'at spas vraiment un OS "temps réel"



Ken@vo

<hr size="2" width="100%">Code, Code, Codec !

[%3C/body ]
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
29 oct. 2005 à 13:29
salut compte tenu du fonctionnement de window il est impossible
de garantir une precision de la milliseconde sur une action repetitive.
Si tu as besoin d'un timing precis il faut que soit le recepteur( s'il
n'est pas lui meme piloter par window) qui doit assurer le synchronisme
et il faut bufferiser au niveau du recepteur.

pour une reception necessitant un repere temporelle il faut l'inclure à
la trame envoyée et travailler en liaison assynchrone à la reception il
suffit de decoder la trame pour recuperer le repere temporel.

quelque soit la methode employée il est difficile de descendre les
sequences repetitive en dessous de 20ms par cycle (meme avec MMTimer)
sans perturber window.

il est possible en assembleur de descendre en dessous sur une courte periode pour des periodes longues window devient instable.

petit exemple : attendre la reception de 5 caracteres sur une liaison
serie (à 57600 bauds) dans un évèments ontimer entraine une instabilité
de l'affichage. (temps ~ 1ms)

bonne prog
0
Rejoignez-nous