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