2009-02-17 8 views
8

Przeczytałem rozdział 7 w "Sterownikach urządzeń linuksowych" (which can be found here), który można zmierzyć w "jiffies". Problem ze zmienną jiffies giełdowych polega na tym, że dość często owija się wokół (szczególnie jeśli masz ustawioną wartość CONFIG_HZ na 1000).Mierzenie czasu w jądrze Linuksa 2.6

W moim module jądra zapisuję wartość jiffies, która jest ustawiona na pewien czas w przyszłości i porównywanie jej później z aktualną wartością "jiffies". Nauczyłam się już, że istnieją funkcje, które mają wrap 32bit migiem pod uwagę tak, aby porównać dwie wartości Używam tego:

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

Nadchodzi moje pytanie: Więc teraz chcę ustawić „” some_future_jiffies_value do "teraz + 10 ms". Można to łatwo osiągnąć, wykonując to:

some_future_jiffies_value = jiffies + msecs_to_jiffies(10); 

Czy to prawda? Co się stanie, jeśli bieżące jiffies będzie miało wartość zbliżoną do MAX_JIFFY_OFFSET, a wynikowa wartość msecs_to_jiffies (10) spowoduje, że wartość parametru some_future_jiffies_value przekroczy przesunięcie? Czy owija się automatycznie, czy powinienem dodać jakiś kod, żeby to sprawdzić? Czy istnieją funkcje, które ratują mnie przed radzeniem sobie z tym?

Aktualizacja:

Aby uniknąć rzeczy z przejściem cyklicznym mam przepisany mój pętlę uśpienia:

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

Zakładam ten jest bardziej przenośny prawda?

Aktualizacja 2:

Dziękuję bardzo „ctuffli” za poświęcenie czasu, aby wrócić do tej kwestii i zapewniając pewną opinię na temat moich uwag, jak również. Sterownik jądra działa teraz dobrze i jest znacznie mniej brzydki w porównaniu do sytuacji, zanim dostarczył mi te wszystkie wskazówki. Dzięki!

+0

Inna myśl: skorzystanie z get \ _jiffies \ _64() uratowałoby mnie od myślenia o zawijaniu i po prostu pozwoliłem sobie na prostą matematykę? – Benjamin

Odpowiedz

6

Co realizują tutaj jest zasadniczo 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) 

Funkcja ta ma tę zaletę, że specyfikacja jest w milisekundach i ukrywa szczegóły jiffies zawijania wewnętrznie. Pamiętaj, aby sprawdzić wartości zwracane, ponieważ to połączenie zwraca liczbę pozostałych jiffies. Zero oznacza, że ​​połączenie zostało przespane o określoną liczbę milisekund, a niezerowa wartość oznacza, że ​​połączenie zostało przerwane w wielu wcześniejszych jiffies.

Informacje na temat owijania i zawijania można znaleźć w sekcji 6.2.1.2. Ponadto ten post próbuje opisać zawijanie w streszczeniu.

+0

Jeśli spojrzę na źródło msleep_interruptible, wygląda to naprawdę bardzo podobnie! Nadal musiałbym rozważyć wartość zwrotu z tej funkcji, jeśli dobrze rozumiem, ponieważ przerywany sen może wrócić wcześniej, niż się spodziewano, prawda? – Benjamin

+0

Co się stało z przekroczeniem limitu czasu powyżej MAX_JIFFY_OFFSET, czy masz pojęcie, czy to jest OK? Widzę, że zdarza się to w źródłach jądra, ale jest to bardziej teoretyczna rzecz, o której się zastanawiałem. Dziękujemy za poświęcenie czasu na odpowiedź! :) – Benjamin

Powiązane problemy