Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
acquisition de donnees via RS
Envoyé par: mig73

Bonjour,
je developpe actuellement un outil permettant de valider / mesurer les performances d'un systeme. Developpement en C, kernel 2.6 cible x86

La contrainte temps réel a surveiller est l'envoi de trames via liaison RS a 8Hz, soit toutes les 125ms.

Pour simuler une communication avec ce systeme, je souhaite envoyer une trame toutes les 125ms. Tenir les 125ms doit etre largement a la porté du systeme, étant donné sa relative faible charge CPU.
Neanmoins, aussi facile soit elle, cette contrainte doit etre repectée avec une bonne precision. Ainsi, je voudrais m'assurer d'utiliser les bonnes methodes

Est il possible d'obtenir de maniere fiable, une periodicité d'envoi des de 125ms avec une variation inferieure a 10ms (ideal < 5ms)?

Dans un premier temps, pour obtenir une periode de 125ms, j'introduis dans une boucle un select():

select(0, NULL, NULL, NULL, &periode);

Pour verifier, l'application enregistre dans un fichier de log les trames et leur dates de reception (gettimeofday() ).


Si je fixe ma periode a 125000 (125ms), les trames sont envoyées avec une variation de periodicité negligable, mais hélas la periode est de 128ms, et non 125!
J'ai essayé egalement 124ms: le systeme tient toujours une excellente periodicité mais cette fois, c'est bien 124ms, comme demandé.
Qu'en pensez vous? POurquoi puis je avoir parfaitement 124ms, mais 128ms au lieu de 125ms?
Y'aurait il quelquechose sollicitant deja le systeme aux alentours 125ms (ordonnacement systeme?) ?

De plus, est il necessaire/utile (au vue des faibles contraintes RT) de modifier la sched_priority de l'appli et/ou changer la sched policy (par exemple pour une SCHED_FIFO ?)

Tous les conseils et experiences sur ce genre d'application au combien classiques (acquisition/envoi de trames via RS) sont les bienvenus!

merci

Poste le Monday 21 May 2007 22:30:15
Répondre     Citer    
Re: acquisition de donnees via RS
Envoyé par: abgech

Tu peux essayer d'utiliser usleep().

Mais dis-toi bien que les distributions courantes ne sont pas temps réel (essentiellement à cause de la préemption) et que, quelle que soit la méthode choisie (select(), usleep() ou autre), la contrainte de temps n'est absolument pas garantie.

Tu devrais t'orienter vers des versions temps réel (RTLinux, RTAI, ...).

Poste le Tuesday 22 May 2007 06:08:36
Répondre     Citer    
Re: acquisition de donnees via RS

Il faut aussi configurer le noyau pour avoir un HZ de 1000 (càd une fréquence d'interruption horlogz de 1000Hz). La valeur par défaut est 250 (donc une granularité de 4ms). L'option du noyau est probablement CONFIG_HZ_1000

----

Basile STARYNKEVITCH

Membre de l'APRIL « promouvoir et défendre le logiciel libre » - adhérez vous aussi à l'APRIL!

Projet logiciel libre: RefPerSys

Poste le Tuesday 22 May 2007 07:38:34
Répondre     Citer    
Re: acquisition de donnees via RS
Envoyé par: Fanch

oui parce que sinon select est normalement d'une précision diabolique :-)

------- <br />
La meilleure façon de prédire le futur, c'est de l'inventer ~ Alan Kay

Poste le Tuesday 22 May 2007 08:10:52
Répondre     Citer    
Re: acquisition de donnees via RS
Envoyé par: mig73

Citation
abgech
Tu devrais t'orienter vers des versions temps réel (RTLinux, RTAI, ...)

J'ai eu developpé des drivers tps réel a une certaine époque et cela marchait plutot bien (contraintes RT inferieure a la 100aine de us)
Pour cette appli, je travaille dans l'espace user. A priori, que je travaille sur une base RT ou non, ne doit pas faire gagner grand chose, peut etre une meilleure response aux IT (tps de latence), mais guere plus (en terme de respect du tps reel), le "user space" etant considéré lui même comme une tache de priorité inferieure aux taches tps reel. Il y a egalement des solutions type LXRT pour "obtenir" du tps reel en espace user... a voir.


Citation
Basile STARYNKEVITCH
Il faut aussi configurer le noyau pour avoir un HZ de 1000 (càd une fréquence d'interruption horlogz de 1000Hz). La valeur par défaut est 250 (donc une granularité de 4ms). L'option du noyau est probablement CONFIG_HZ_1000

Très interessant, cela expliquerait effectivement ce saut de 124ms a 128ms !


Poste le Tuesday 22 May 2007 09:11:11
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
acquisition de donnees via RS
Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons