Hallo,

Grüße
Erik
Ich hab mir das so vorgestellt. Du hast halt den PIT im periodischen Modus mit den magischen 18,2Hz = 55,4ms.Das ist meiner persönlichen Meinung nach etwas zu grob, weniger als 100Hz würde ich nicht nehmen.
Ein Thread läuft auf CPU0 und möchte für 200ms schlafen, dann ruft er halt sleep(200000000) auf und die holt sich den aktuellen Wert des internen PIT Counters (weil ich den vorher von der zu wartenden Zeit abziehen muss) und packe den Thread in die Delta-Queue des PIT-Handlers.Du möchtest quasi den Zählerwert vom PIT als Nachkommastellen für Deinen 18,2Hz-Software-Zähler nutzen? Interessante Idee aber ich glaube nicht das das viel nutzt genauer als auf ca. 55ms bekommst Du damit trotzdem keinen IRQ. Ich würde lieber zu einer höheren IRQ-Frequenz raten.
Jedes Mal wenn der PIT den IRQ-Handler aufruft, zieht er 55,4ms von dem 1. Thread in der Delta-Queue ab und wenn die Zeit die da rauskommt kleiner als 55,4ms ist, wird der (und alle Threads für die dies auch noch gilt) in die Sleep Queue der CPU gepackt auf welcher der IRQ-Handler gerade ausgeführt wird.Wenn Du viele Threads am schlafen hast dann wird das schnell zu einem Problem. Ich würde lieber die absolute Zeit des Aufweckens errechnen (dafür muss man natürlich den Zeit-Counter lesen, was beim HPET ein HW-Zugriff ist) und diesen in eine sortierte Liste eintragen. Der IRQ-Handler für den periodischen PIT-IRQ inkrementiert seinen SW-Zahler und vergleicht dann diesen absoluten Ist-Zeit-Wert mit dem absoluten Soll-Zeit-Wert im vordersten Listeneintrag. Bei Gleichheit wird eine entsprechende Aktion ausgelöst. Das kann das simple Aufwecken eines Threads sein (der einfach nur ein sleep() gemacht hat) aber auch das verschicken einer Message/Signals an einen Prozess oder das setzen eines Event-Object auf das möglicherweise gerade jemand wartet der dann sofort geweckt werden muss.
Wenn ich dich richtig verstanden habe, dann meinst du das ich Probleme mit periodischen Events bekommen würde.Ja. Solange Du den PIT nicht frei laufen lässt sondern immer mal dran "rumdrehst" bekommst Du Fehler die sich aufakkumulieren.
Das Problem was ich im Moment mit Events habe ist, ich habe noch gar keine Events auf meinem SystemUnd wo ist Dein Problem? Wenn ein Event (oder was auch immer) nicht mehrfach sondern nur einmalig auftreten soll dann wird es eben nicht erneut in die geordnete Event-Liste eingetragen. Wo ist das Problem?Ich rede die ganze Zeit nur von Threads die schlafen gelegt werden.
Das andere was ich noch meine ist ne Performance Counter um sagen zu können wieviel Zeit vergangen ist.Wenn Du diese "Performance Counter" nur zu "Statistischen Zwecken", z.B. zur Anzeige in einem Taskmanager, nutzen möchtest dann solltest Du Dir da erstmal keine zu großen Sorgen machen. User-Code sollte sich von so etwas nie abhängig machen.
Ich würde spontan sagen, das ich ne Semaphore für die Events nutzen könnte (zumindest für das Sleep-Event)....Also das klingt für mich nicht sonderlich klug da noch einen zusätzlichen Mechanismus dazwischen zu setzen. Leg den Thread, der sleep() aufgerufen hat, direkt schlafen und wecke ihn in der Event-Abhängigen Funktion, welche der PIT-IRQ-Handler beim erreichen des entsprechenden Zeitpunkts aufruft, einfach wieder auf.
Obwohl es gar nicht schlecht wäre das immer über Semaphoren zu machen. Um nochmal das Bsp mit dem Game zu bringen, wenn das Event alle 16ms die Semaphore freigibt und der Thread mal länger brauchen sollte, dann bekommt er die Semaphore ja sofort und kann gleich den nächsten Frame berechnen.Für Spiele oder Multimediaprogramme würde ich ein Event-Object benutzen:
Code: [Auswählen]
t_handle event_object = CreateEventPeriodic(50ms); //Event-Objekt erstellen das vom System alle 50ms gesetzt wird
/// ....
while(...)
{
WaitForEvent(event_object); //wartet bis das Event-Object gesetzt ist und tut es dann zurücksetzen, falls es bereits gesetzt ist weil die letzte Aktion den Zeitrahmen etwas gesprengt hat dann kommt ohne warten zurück
tuWasPeriodisches(); //hier wird z.B. das nächste Bild berechnet
}Ich habe hier einige Motherboards mit mehreren CPUs (Slot1, Sockel370, Sockel5/7, SockelA) die keinen HPET haben und die möchte ich ja auch unterstützen!Bist Du sicher das Du Boards mit Slot1 oder Sockel5/7 und mehreren CPUs hast?

Du weißt nicht zufällig ab wann ungefähr der HPET auf neuen Boards vertreten war? Ich hab von dem Ding das erste Mal zu Core2 Zeiten gehört.Nein, genau weiß ich das nicht aber es sollte schon einige Jahre her sein.
So wie fast alles bei der x86-Plattform! Hoch lebe die heilige Kuh der Kompatibilität!Zitat von: erikAls Alternative würde ich den PIT nicht betrachten, aller höchstens, und nur mit viel Bauchweh, als Notlösung.Genau das ist er auch (aber war er das nicht von Anfang an).
Grüße
Erik

Übersicht
Wiki
Hilfe
Suche
Einloggen
Registrieren
Drucken

Gespeichert

Damit ich mich ja auch mit den "schönsten" Seiten der x86 Architektur rumquählen darf 
