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!
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