Linux-Timer hängt irgendwann und stoppt bei 1ns

8

Ich habe ein Embedded Board mit PowerPC 5200 auf dem Realtime Linux mit der Version 2.6.33 läuft. Meine Anwendung verwendet einen hochauflösenden Timer in Linux für Alarme. Dieser Timer ist manchmal nicht abgelaufen. Das Problem tritt sehr selten auf, es kann viele Monate dauern, bis es auf einem System passiert.

Der Timer wird mit der Funktion timer_settime mit absoluter Zeit eingestellt. Ich habe einige interessante Beobachtungen gemacht, als der Timer nicht ablief:

  • Die Funktion timer_gettime gibt die verbleibende Zeit 1ns zurück.
  • Aktive Timer werden überprüft, indem die Datei / proc / timer_list angezeigt wird und die timer_list diesen Timer nicht in der Liste der aktiven Timer anzeigt.

Ich habe mir die Linux-Quelle angeschaut und ein mögliches Szenario gefunden:

Die Funktion timer_gettime endet in der Funktion common_timer_get (posix-timers.c). Die Funktion common_timer_get gibt it_value.tv_nsec = 1 zurück, wenn der Timer aktiv ist und die verbleibende Zeit & lt; = 0 ist. Dies bedeutet, dass der Timer heruntergezählt hat und der Timer-Status "in Warteschlangen eingereiht" oder "Callback" sein muss

Ich nehme an, dass es im Zustand "Callback" ist, dh es läuft in der Funktion __run_hrtimer (hrtimer.c). Die Funktion __run_hrtimer ruft function__remove_hrtimer auf, die den Timer aus der aktiven Timer-Liste entfernt, bevor er den Timer-Status von 'in Warteschlangen eingereiht' in 'Rückruf' ändert.

In der Funktion __run_hrtimer werden mehrere Funktionen zwischen dem Wechsel des Timer-Status zu 'Callback' und dem Ende der Funktion, bei der der Status 'Callback' gelöscht wird, aufgerufen. Wenn es hier hängt, kann die Funktion timer_gettime 1ns zurückgeben, während der Timer nicht in der aktiven Liste ist. Hier ruft es mehrere Funktionen im Linux-Kernel und die Callback-Funktion in der Anwendung auf.

Ich habe die Callback-Funktion in meiner Anwendung überprüft. Es signalisiert einen Semaphor und setzt den Timer erneut auf den gleichen Thread. Ich kann nicht sehen, warum das nicht funktionieren sollte.

Gibt es jemanden, der einen ähnlichen Fall gesehen hat?

Gibt es jemanden, der eine Vorstellung davon hat, was hier falsch läuft?

    
Vijay Katoch 25.11.2013, 03:51
quelle

0 Antworten