9 votes

Chronométrage dans le noyau Linux 2.6

J'ai lu le chapitre 7 du livre "Linux Device Drivers". (que l'on peut trouver ici) que le temps peut être mesuré en "jiffies". Le problème avec la variable "jiffies" est qu'elle tourne assez fréquemment (surtout si votre CONFIG_HZ est réglé sur 1000).

Dans mon module de noyau, j'enregistre une valeur "jiffies" qui est fixée à un certain moment dans le futur et je la compare ultérieurement à la valeur "jiffies" actuelle. J'ai déjà appris qu'il y a des fonctions qui prennent en compte le 32bit jiffy wrap, donc pour comparer deux valeurs j'utilise ceci :

if (time_after(jiffies, some_future_jiffies_value))
{
   // we've already passed the saved value
}

Voici ma question : Je veux maintenant définir la valeur de 'some_future_jiffies_value' à "now + 10ms". Cela peut être facilement accompli en faisant ceci :

some_future_jiffies_value = jiffies + msecs_to_jiffies(10);

Est-ce correct ? Que se passe-t-il si le jiffies actuel est proche de MAX_JIFFY_OFFSET et que la valeur résultante de msecs_to_jiffies(10) place une certaine valeur_future_jiffies au-delà de ce décalage ? Est-ce que cela s'enroule automatiquement ou dois-je ajouter du code pour vérifier cela ? Existe-t-il des fonctions qui me permettent de ne pas avoir à m'occuper de ce problème ?

Mise à jour :

Pour éviter les problèmes d'enveloppement, j'ai réécrit ma boucle de sommeil :

   // Sleep for the appropriate time
   while (time_after(some_future_jiffies_value, jiffies))
   {
      set_current_state(TASK_INTERRUPTIBLE);
      schedule_timeout(1);
   }

Je suppose que c'est plus portable, non ?

Mise à jour 2 :

Merci beaucoup 'ctuffli' d'avoir pris le temps de revenir sur cette question et de m'avoir fait part de vos commentaires. Mon pilote de noyau fonctionne bien maintenant et il est beaucoup moins laid par rapport à la situation avant que vous me fournissiez tous ces conseils. Merci !

8voto

ctuffli Points 2041

Ce que vous implémentez ici est essentiellement msleep_interruptible() (linux/kernel/timer.c)

/**
 * msleep_interruptible - sleep waiting for signals
 * @msecs: Time in milliseconds to sleep for
 */
unsigned long msleep_interruptible(unsigned int msecs)

Cette fonction présente l'avantage que la spécification est en millisecondes et cache les détails de l'enveloppement des jiffies en interne. Assurez-vous de vérifier les valeurs de retour car cet appel renvoie le nombre de jiffies restants. Zéro signifie que l'appel a dormi le nombre de millisecondes spécifié, tandis qu'une valeur non nulle indique que l'appel a été interrompu avant ce nombre de jiffies.

En ce qui concerne l'emballage, voir la section 6.2.1.2 pour une description des jiffies et des emballages. En outre, cette poste tente de décrire l'emballage dans l'abstrait.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X