Timer



  • Hallöle

    Ich hab mich mal schlau gemacht, was es hardwareseitig so an schönen Sachen gibt, was Counter/Timer angeht. Und da entdeckte ich den TSC, den Time Stamp Counter, welche die Vergangenen Clocks seit dem Anschalten des Prozessors zählt.Der hat den Nachteil, dass er bei veränderter Prozessorgeschwindigkeit natürlich was anderes misst als mit der Standardgeschwindigkeit. Außerdem gibt es probleme mit mehreren CPUs/Kernen (von welchem prozessor hat man denn da den TSC ausgelesen? :/). Daneben gibt es den HPET. Welcher allerdings nicht so einfach von einem programm verwendet werden kann (so wie ich das verstanden hab). das hab ich gefunden:
    http://www.intel.com/hardwaredesign/hpetspec_1.pdf

    Meine frage: Wie nutze ich den HPET in assembler? Ist das überhaupt möglich? (ich mein im protected mode) oder: gibt es so etwas wie plattformunabhängige counter libraries, die irgendwie den hpet nutzen? Unter Windows gibts ja das MSische QueryPerformanceCounter (C-Funktion).

    Alternative frage: welche alternativen gibt es, bzw kann man RDTSC auch auf systemen die ihre taktfrequenz öfters ändern und mehrere kerne/prozessoren haben verwenden, ohne falsche messwerte zu bekommen?

    Vielen Dank für die antworten



  • Hum, was sind ueberhaupt deine Anforderungen, bzw. was willst du mit dem Timer machen?
    Grundsaetzlich solltest du davon ausgehen, dass du in einem PM-OS nicht einfach so auf Hardware zugreifen kannst, ohne entweder selbst etwas treiberaehnliches zu schreiben, oder Funktionen des OS zu benutzen - gerade was Timer-Funktionen betrifft, finden sich da doch bestimmt genug davon in Windows, Linux, etc. Die meisten davon werden wohl auch dieses hpet-Dings, bzw. einfach die RTC oder den PIT benutzen.
    Ansonsten kannst du theoretisch von der Soundkarte ueber Graka bis Tastatur sehr vieles als "Timer" missbrauchen... wenn es sein muss halt auch die CPU...



  • Ich benötige einen Counter, der seine counts in regelmäßigen, von der Taktfrequenz und Anzahl der Kerne/prozessoren unabhängigen Abständen erhöht. Ich will mit zeiten von unter 0,5 ms arbeiten. Dabei soll der Code Crossplatformcompilierbar sein, wenn es möglich ist.

    Da ich mit meinem Kenntnisstand wahrscheinlich an einem Treiber verzweifeln würde xD, wärs mir schon lieber so etwas wie eine Library zu haben...

    EDIT: Hmm - wenn ich nur Laufzeiteffizienz von assembler-programmierten Algorithmen messe, reicht doch RDTSC vollkommen aus, oder? dann brauch ich eigentlich weder die zeit noch einen frequenz-unabhängigen counter, sind ja nur verschiedene Anzahlen von Clocks bei verschiedenen Algorithmen... nur wie sieht es mit mehreren Kernen/Prozessoren aus?



  • Mit RDTSC muesstest du AFAIK sicher stellen, dass dein Prozess immer nur auf einem Kern ausgefuehrt wird und dass dein Prozess in seiner Messung nicht unterbrochen wird (was in einem Heimanweder Multitasking-OS eher schwierig werden duerfte). Aenderung der Frequenz sollten in diesem Zusammenhang dann etwas egal sein, wenn es wirklich nur um Effizienzbetrachtungen von Assemblercode im Hinblick auf ticks geht.

    Crossplattform-Libs kenne ich keine, da bekommst du in rudp vielleicht auch groessere Resonanz, sonst halt selber suchen.
    Es ist aber auch kein Problem, mit Hilfe von Metacodes crossplattform-Code in Assembler zu schreiben... Solange sich nur das OS und nicht die CPU aendert.

    Ansonsten wuerde ich vorschlagen, dein Programm fuer DOS zu schreiben - da kannst du effektiv verhindern, dass dir irgendwas dazwischenfunkt und kannst mit der Hardware anstellen, wozu du lustig bist.


Anmelden zum Antworten