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 !