J'ai un système qui a besoin d'au moins 10 msecondes de précision pour les minuteries.
Je suis allé pour Timerfd car il me convient parfaitement, mais j'ai constaté que même pour parfois jusqu'à 15 millisecondes, ce n'est pas précis, non plus que cela ne comprenne pas comment cela fonctionne.
Les temps que j'ai mesurés étaient à la hauteur. 21 msecondes sur une minuterie de 10 mseconds. et exécuté comme ceci: p> même en supposant des retards possibles, 15 millisecondes retards sonne aussi beaucoup pour moi. p> p>
J'ai mis un test rapide qui montre mon problème.
Ici, un test: p>
4 Réponses :
Selon ce que fait d'autre le système, cela peut être un peu lent dans la mise en marche de votre tâche. À moins que vous n'ayez un système «réel» en temps réel, il n'ya aucune garantie qu'il fera mieux que ce que vous voyez, bien que je conviens que le résultat est un peu décevant. p>
Vous pouvez (principalement) éliminer ce temps de commutateur de tâche / planificateur. Si vous avez une puissance de processeur (et une alimentation électrique!) Pour éviter, une solution brutale mais efficace serait une boucle de spin d'attente occupée. P>
L'idée est d'exécuter votre programme dans une boucle serrée qui sondre en permanence l'horloge pendant quelle heure il est, puis appelle votre autre code lorsque l'heure est correcte. Au détriment de la création de votre système de manière très lente pour tout le reste et de chauffer votre CPU, vous vous retrouverez avec la planification des tâches qui est principalement sans gage. P>
J'ai écrit un système comme celui-ci une fois sous Windows XP pour faire tourner un moteur pas à pas, fournissant des impulsions espacées uniformément jusqu'à 40 000 fois par seconde, et cela a fonctionné bien. Bien sûr, votre kilométrage peut varier. P>
Pourquoi n'avez-vous pas eu de micro bon marché comme une photo ou un amtel pour faire les jambes de la longueur des jambes? De nos jours, j'utiliserais un Ardiuno pour faire le contrôle pas à pas et utiliser la connexion USB pour envoyer des signaux plus rapides / plus lents / START / Stop / Stop / Stop.
Voici une théorie. Si Hz est défini sur 250 pour votre système (comme est typique) alors vous avez une résolution de minuterie de 4 millisecondes. Une fois que votre processus est échangé par le planificateur, il est probable qu'un certain nombre d'autres processus seront programmés et exécutés avant que votre processus ne puisse obtenir une autre tranche de temps. Cela pourrait vous expliquer de voir des résolutions de minuterie dans la gamme de 15 à 21 millisecondes. Le seul moyen de contourner ce serait pour courir un noyau en temps réel. P>
La solution typique du chronométrage à haute résolution sur des systèmes non réel en temps réel est essentiellement au chargé d'attente avec un appel à sélectionner. P>
Je ne pense pas que de nombreuses distributions orientées de bureau se définissent HZ à 250 et la plupart d'entre eux, ces jours-ci, activez le fonctionnement sans tick afin que Hz ne soit pas compatible beaucoup pour le timing. La plupart des configurations de nos jours, vous devriez généralement pouvoir obtenir de la granularité de millisecond sans un noyau en temps réel, et vous n'avez pas besoin des patchs RT Linux, à moins que votre charge en temps réel soit vraiment vraiment serrée ...
Mainline Linux est un système en temps réel ces jours-ci, c'est que peu de gens le savent: P (Eh bien, il peut s'agir de si vous écrivez votre code pour profiter des fonctionnalités REALITME)
Essayez de le modifier comme suit, cela devrait à peu près à un garnuant qu'il ne manquera jamais de réveil, mais faites attention à ce que la priorité en temps réel peut verrouiller votre machine si elle ne dort pas, vous devrez peut-être régler. les choses up afin que votre utilisateur ait la capacité de lancer des choses à la priorité en temps réel (voir Si vous utilisez des threads que vous utilisez devrait utiliser temps réel ne concerne pas la faible latence, il s'agit de garanties, RT signifie que si vous voulez vous réveiller. Exactement une fois que chaque seconde sur la seconde, vous le ferez, la planification normale ne vous donne pas cela, cela pourrait décider de vous réveiller 100 ms plus tard, car il y avait d'autres travaux à faire à ce moment-là. Si vous souhaitez vous réveiller tous les 10 ms et que vous devez vraiment, vous devez vous libérer de fonctionner comme une tâche en temps réel, le noyau vous réveillera toutes les 10 ms sans échec. Sauf si une tâche plus prioritaire en temps réel est occupée à faire des choses. P> Si vous devez garantir que votre intervalle de réveil est exactement quelque temps, cela n'a pas d'importance si c'est 1 ms ou 1 seconde, vous ne l'obtiendrez pas à moins que vous n'exécutant pas une tâche en temps réel. Il y a de bonnes raisons pour lesquelles le noyau vous fera ceci (l'économie d'énergie est l'une d'entre elles, un débit plus élevé en est une autre, il y en a d'autres), mais c'est bien dans ses droits de le faire depuis que vous n'avez jamais dit de meilleures garanties. La plupart des choses n'ont pas besoin d'être celles-ci précises ou ne doivent jamais manquer afin que vous devriez penser difficile si vous en avez vraiment besoin. P> citant de http://www.ganssle.com/articles/RealTime. HTM P> Une tâche ou un système en temps réel dur est
un où une activité doit simplement être
complété - toujours - par un spécifié
date limite. La date limite peut être une
temps ou intervalle de temps particulier, ou
peut être l'arrivée d'un événement. Dur
Les tâches en temps réel échouent, par définition,
S'ils manquent une telle date limite. p>
remarquer cette définition ne fait pas
hypothèses sur la fréquence ou
période des tâches. Un microseconde ou
une semaine - s'il manque la date limite
induit une échec, alors la tâche a
Exigences en temps réel durement. P>
blockQuote> Soft Realtime est à peu près la même chose, sauf que cela manque une date limite, tout en indésirable, n'est pas la fin du monde (par exemple, la lecture vidéo et la lecture audio sont des tâches en temps réel douces, vous ne voulez pas manquer. Affichage d'une image ou à court de tampon, mais si vous le faites, c'est juste un hoquet momentané, et que vous continuez simplement). Si ce que vous essayez de faire est «doux» en temps réel, je ne me soucierais pas de courir à la priorité en temps réel puisque vous devriez généralement obtenir votre réveil à temps (ou au moins près de celui-ci). p> EDIT: P> Si vous n'exécutez pas le temps en temps réel, le noyau donnera par défaut à toutes les minuteries que vous faites des minuteries que vous faites de «relâchement» afin qu'elle puisse fusionner votre demande de réveil avec d'autres événements qui se produisent parfois près de celui que vous avez demandé (c'est-à-dire si l'autre événement est dans votre temps de «relâchement», il ne vous réveillera pas au moment où vous avez demandé, mais un peu plus tôt ou plus tard, il était déjà déjà va faire quelque chose d'autre, cela sauve la puissance). P> pour un peu plus d'informations voir (mais pas trop haut) délais de résolution et Minuterie Slack (Notez que je ne suis pas Bien sûr, si l'une de ces choses est exactement ce qui est vraiment dans le noyau depuis que ces deux articles portent sur les discussions sur la liste de diffusion LKML, mais quelque chose comme le premier est vraiment dans le noyau. P> P> /etc/security/limits.conf code>)
pthread_setschedparam code> au lieu de
plancher_setschéduler code>. p>
@maxschlepzig Oui c'est ce que la réponse dit.
Ok, j'ai sauté sur cette partie. Cependant, je quitterai le MinersLack Link comme référence telle que l'on peut vérifier ce qu'il y a le noyau. FWIW, pour tester les implications de la programmation réelle, vous n'avez pas vraiment à modifier l'exemple. Emballage de l'appel avec E.G. CHRT -R 1 ./TIMERFD 2 code> a le même effet. BTW, concernant vos déclarations sur les garanties - ils sont un peu trompeurs. Je veux dire les garanties en temps réel dans un stock Linux sont assez molles - même lors de la gestion de la tâche en priorité en temps réel.
J'ai un sentiment que votre test est très dépendant du matériel. Lorsque j'ai dirigé votre exemple de programme sur mon système, il semblait pendre à 1 ms. Pour rendre votre test à tout sens sur mon ordinateur, je devais changer de millisecondes aux microsecondes. (J'ai changé le multiplicateur de 1_000_000 en 1_000.)
$ for i in 70 80 90 100 110 120 130\
; do echo "intervals of $i microseconds";\
./test $i;done
intervals of 70 microseconds
2 expirations, 639236 iterations
intervals of 80 microseconds
2 expirations, 150304 iterations
intervals of 90 microseconds
4 expirations, 3368248 iterations
intervals of 100 microseconds
4 expirations, 1964857 iterations
intervals of 110 microseconds
^C
oui, le noyau a des hrtimers afin qu'il puisse vous réveiller dans 1NS de la question de votre demande, la météo ou non c'est une histoire différente, des minuteries ont une «moue» (si vous n'êtes pas une tâche en temps réel) afin que le noyau peut réduire le nombre de réveils au total. (c.-à-d. Si cela a déjà quelque chose à faire dans la période relâchée, il vous fera vous réveiller la même heure que tout ce que vous voyez
Si l'exemple programme semble suspendre, cela signifie que vous ne manquez jamais aucune expiration de la minuterie. Iow, l'exemple programme est une boucle infinie, sauf si une expiration de la minuterie est manquée. La probabilité de manquer une expiration de la minuterie est proportionnelle inverse avec le nombre de cœurs de la CPU et augmente avec la charge de votre système. Par exemple, sur un système à 8 nœuds de mine, je peux mettre fin de manière fiable ./ timerfd 2 code> en démarrant
stress-ng -vm 8 code> en parallèle.
Mes données sur la région sont assez rouillées. Sonne que vous voulez faire quelque chose de temps réel. Vérifiez les linxes en temps réel. Sinon, le planificateur utilise des granularités plus longues pour éviter les frais généraux plus élevés. Vous voudriez exécuter votre processus en tant que RT (temps réel) (
manned_setparam code>) et probablement sous racine. Pour les processus normaux (par exemple, jeux ou multimédia), vous faites (1) en attente dans une boucle serrée ou (2) sur chaque événement de la minuterie calculer l'erreur (attendu v. Temps de réveil réel) et le prendre dans le compte lors de l'avancement du temps interne- état dépendant.
Merci pour la pointe, mais je ne considère pas 20 intervalles de milliseconde dans le cadre du domaine en temps réel. Je veux dire, un système standard qui est invité à attendre 10 millisecondes n'attendait jamais 21 millisecondes, RT semble trop pour cela.
Vous pouvez essayer de définir votre programme pour fonctionner avec la priorité en temps réel, vous n'avez probablement pas besoin d'utiliser le noyau RT Linux La ligne principale est plutôt bonne en temps réel ces jours-là et, étant donné qu'il n'a jamais manqué plus d'une expiration, il suffit de fonctionner avec la priorité de RT. être suffisant pour ne jamais manquer un
Aussi, vous devriez tenir compte du temps ou non, vous ne pouvez absolument pas tolérer manquer un réveil, si vous pouvez manquer parfois, ne vous inquiétez pas, cela n'arrivera pas, mais ce n'est pas la fin du monde, vous aurez la plupart d'entre eux. Je l'exécute sur mon système et il n'a pas encore manqué une minuterie sur la boucle de 4 ms et je cours depuis un moment ...
Intervalles de 2 millisecondes 2 expirations, 4282 intervalles d'itérations de 4 millisecondes 2 expirations, 149022 itérations, ce qui est environ 6 minutes avant d'avoir manqué un wakup pour moi, votre système est donc surchargé, lent ou vous devez modifier votre configuration du noyau pour vous donner Meilleures minuteries
@Abaitz JIMENEZ: Le temps réel fait référence à des exigences strictes, pas à une limite inférieure réelle de précision. Il y a beaucoup de choses qui affectent la rapidité de la livraison de la minuterie, y compris la version de Linux (noyau) que vous utilisez, la configuration qu'il a été compilée, le matériel que vous utilisez et ce qui fonctionne d'autre sur le système.
De plus, votre boucle est allé plus de 2 heures sur ma machine avec l'intervalle de 8 ms sans manquer de délai d'attente,