OOStuBS/MPStuBS
|
Interruptbehandlung für Timerinterrupts. Mehr ...
#include <watch.h>
Ö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< Gate > | queue_link |
Verkettungszeiger für Epilog Queue. | |
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.
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 | ( | ) |
|
virtual |
In dieser Methode wird der Threadwechsel ausgelöst.
Erneute Implementation von Gate.
uint32_t Watch::interval | ( | ) |
Gibt an, welches Unterbrechungsintervall eingestellt wurde.
|
virtual |
Enthält den Prolog der Unterbrechungsbehandlung.
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.
us | Gewünschtes Unterbrechungsintervall in Mikrosekunden. |