Friedrich-Alexander-Universität Erlangen-Nürnberg  /   Technische Fakultät  /   Department Informatik

Interruptbehandlung für Timerinterrupts. Mehr ...

#include <watch.h>

Klassendiagramm für Watch:
Zusammengehörigkeiten von Watch:

Öffentliche Methoden

bool windup (uint32_t us)
 Uhr "aufziehen". Mehr ...
 
bool prologue ()
 Enthält den Prolog der Unterbrechungsbehandlung. Mehr ...
 
void epilogue ()
 In dieser Methode wird der Threadwechsel ausgelöst. Mehr ...
 
uint32_t interval ()
 Gibt an, welches Unterbrechungsintervall eingestellt wurde. Mehr ...
 
void activate ()
 Startet den CPU-lokalen Timer. Mehr ...
 
void block ()
 Blockiert die CPU-lokalen Timer Interrupts. Mehr ...
 
void unblock ()
 Deblockiert die CPU-lokalen Timer Interrupts. Mehr ...
 
- Öffentliche Methoden geerbt von Gate
 Gate ()
 Konstruktor. Mehr ...
 
virtual ~Gate ()
 Destruktor. Mehr ...
 
bool set_queued ()
 Setzt atomar ein Flag um zu markieren, dass sich das Objekt gerade in einer Epilog-Warteschlange befindet. Mehr ...
 
void set_dequeued ()
 Setzt das in set_queued() gesetzte Flag zurück. Mehr ...
 

Weitere Geerbte Elemente

- Öffentliche Attribute geerbt von Gate
QueueLink< Gatequeue_link
 Verkettungszeiger für Epilog Queue.
 

Ausführliche Beschreibung

Interruptbehandlung für Timerinterrupts.

Die Klasse Watch sorgt für die Behandlung der Zeitgeberunterbrechungen, indem sie eine Zeitscheibe verwaltet und gegebenenfalls einen Threadwechsel auslöst.

Dokumentation der Elementfunktionen

void Watch::activate ( )

Startet den CPU-lokalen Timer.

Der CPU-lokale Timer soll mit dem vorab in windup() konfigurierten Interval gestartet werden. Um Timer-Interrupts auf allen CPUs zu erhalten, muss diese Methode pro CPU einmal aufgerufen werden.

void Watch::block ( )

Blockiert die CPU-lokalen Timer Interrupts.

Der LAPIC Timer kann maskiert werden, sobald kein Prozess mehr lauffähig ist und keine Bell darauf wartet heruntergezählt zu werden. block() und unblock() muss in der Idleloop aufgerufen werden. Nur für Aufgabe 6e (optional) notwendig!

void Watch::epilogue ( )
virtual

In dieser Methode wird der Threadwechsel ausgelöst.

Erneute Implementation von Gate.

uint32_t Watch::interval ( )

Gibt an, welches Unterbrechungsintervall eingestellt wurde.

Rückgabe
Eingestelltes Unterbrechungsintervall
bool Watch::prologue ( )
virtual

Enthält den Prolog der Unterbrechungsbehandlung.

Rückgabe
Gibt true zurück, falls ein Epilog notwendig ist, ansonsten false.

Implementiert Gate.

void Watch::unblock ( )

Deblockiert die CPU-lokalen Timer Interrupts.

Logisches Gegenstück zu Watch::block(). Erlaubt die Auslieferung von CPU-lokalen Zählersignalen wieder. Nur für Aufgabe 6e (optional) notwendig!

bool Watch::windup ( uint32_t  us)

Uhr "aufziehen".

Das Watch Objekt muss sich bei der Plugbox anmelden und sich so initialisieren, dass beim Aufruf von Watch::activate() ca. alle us Mikrosekunden regelmäßig Unterbrechungen auslöst werden. Hierfür muss anhand der mit LAPIC::timer_ticks() bestimmten Timerfrequenz ein passender Timer-Divisor bestimmt werden, welcher möglichst klein, aber groß genug ist, um einen Überlauf des 32bit-Zählers auszuschließen. Durch den Aufruf von Watch::interval() soll us wieder abfragbar sein.

Parameter
usGewünschtes Unterbrechungsintervall in Mikrosekunden.
Rückgabe
Gibt an ob das Interval eingestellt werden konnte.

Die Dokumentation für diese Klasse wurde erzeugt aufgrund der Dateien: