2009-02-17 7 views
8

Ich habe Kapitel 7 in den 'Linux Device Drivers' (which can be found here) gelesen, dass die Zeit in 'jiffies' gemessen werden kann. Das Problem mit der Variablen "stock jiffies" ist, dass es sich ziemlich häufig umbricht (besonders wenn Sie CONFIG_HZ auf 1000 gesetzt haben).Zeitmessung im Linux Kernel 2.6

In meinem Kernel-Modul speichere ich einen Jiffies-Wert, der zu einem bestimmten Zeitpunkt in der Zukunft gesetzt wird, und vergleiche ihn zu einem späteren Zeitpunkt mit dem aktuellen 'jiffies'-Wert. Ich habe schon gelernt, dass es Funktionen gibt, die die 32-Bit-Jiffy Wrap berücksichtigen so zwei Werte vergleichen ich dies mit:

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

kommt meine Frage: So, jetzt will ich den ‚some_future_jiffies_value‘ gesetzt zu "jetzt + 10ms". Dies kann einfach dadurch erreicht werden:

some_future_jiffies_value = jiffies + msecs_to_jiffies(10); 

Ist das korrekt? Was passiert, wenn der aktuelle Jiffies in der Nähe von MAX_JIFFY_OFFSET liegt und der resultierende Wert von msecs_to_jiffies (10) den Wert von some_future_jiffies_value hinter diesen Offset stellt? Wird es automatisch umbrochen oder sollte ich etwas Code hinzufügen, um dies zu überprüfen? Gibt es Funktionen, die mich davor bewahren, damit umgehen zu müssen?

Update:

zu stopfen mit Wraparound zu vermeiden Ich habe meine Schlafschleife neu geschrieben:

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

Ich nehme an, das mehr tragbar ist richtig?

Update 2:

Vielen Dank ‚ctuffli‘ für die Zeit nehmen, auf diese Frage zurückkommen und ein Feedback auf meine Kommentare als auch die Bereitstellung. Mein Kernel-Treiber funktioniert jetzt gut und es ist viel weniger hässlich im Vergleich zu der Situation, bevor Sie mir all diese Tipps gegeben haben. Vielen Dank!

+0

Ein anderer Gedanke: würde mit Get \ _jiffies \ _64() mich davor bewahren, jemals an den Wraparound denken zu müssen und mich einfach Mathe machen zu lassen? – Benjamin

Antwort

6

Was Sie setzen hier im Wesentlichen 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) 

Diese Funktion hat den Vorteil, dass die Spezifikation in Millisekunden ist und versteckt die Details jiffies Einwickeln intern. Überprüfen Sie die Rückgabewerte, da dieser Aufruf die Anzahl der verbleibenden Jiffies zurückgibt. Null bedeutet, dass der Anruf die angegebene Anzahl von Millisekunden lang geschlafen hat, während ein Wert ungleich Null angibt, dass der Anruf so viele Jiffies früh unterbrochen wurde.

Hinsichtlich der Verpackung, siehe Abschnitt 6.2.1.2 für eine Beschreibung von Jiffies und Verpackung. Auch diese post versucht, das Wrapping im Abstract zu beschreiben.

+0

Wenn ich mir die Quelle für msleep_interruptible anschaue, sieht sie tatsächlich bemerkenswert ähnlich aus! Ich würde immer noch den Rückgabewert von dieser Funktion berücksichtigen müssen, wenn ich das richtig verstehe, da der unterbrechbare Schlaf früher als erwartet zurückkehren kann, oder? – Benjamin

+0

Wenn Sie ein Timeout nach der Markierung MAX_JIFFY_OFFSET setzen, haben Sie eine Idee, ob das OK ist? Ich sehe es oft in den Kernel-Quellen, aber das ist eine eher theoretische Frage, über die ich nachgedacht habe. Danke, dass Sie sich die Zeit genommen haben, bis jetzt zu antworten! :) – Benjamin