60
« am: 17. January 2006, 22:19 »
Du arbeitest doch im RM, oder?
Dann kansnt du den APIC nicht verweden. Der TSC ist von der Vorgehensweise aber ähnlich: Mit dem Befehl rdtsc kannst du lesen, wie viele Takte schon seit dem einschalten vergangen sind. Da du aber nicht weißt, wie viele Takte/Sekunde der Prozessor hat, muss du das erst herauskriegen.
Das geht so:
- Du programmierst die Realtime Clock (oder nen anderen Timer) so, das sie zweimal (oder wie oft auch immer) pro Sekunde einen Interrupt auslöst.
- Dann wartest du bis der Interrupt auftritt.
- Im IRQ8 Handler führst du rdtsc aus. Jetzt hast du in EDX:EAX einen 64 Bit Wert, die Anzahl der Takte. Die speicherst du und wartest wieder auf einen Interrupt
- Nachdem der IRQ das zweite mal ausgeführt wurde, machst du das ganze nochmal, subtrahierst die Werte voneinander und multiplizierst sie mit 2 (da der interrupt ja nicht jede sekunde, sondern jede 0,5te Sekunde ausgeführt wurde.)
- Jetzt hast du die Anzahl an Takten pro Sekunde
- Die Interrupts kannst du wieder deaktivieren
Wenn du jetzt einen delay haben willst, gehst du so vor:
- Du multiplizierst die Anzahl der Millisekunden (oder Microsekunden, oder was auch immer), die du warten willst, durch (TAKTE_PRO_SEKUNDE / 1000) oder halt 1000000 bei Microsekunden.
- Jetzt hast du die Anzahl der Takte die du warten willst
- Jetzt führst du rdtsc aus, und addirest zu dem Wert die Anzahl der Takte. Jetzt weißt du in wie vielen Takten du fertig gewartet hast.
- Jetzt machst du solange garnichts, und ließt mit rdtsc ununterbrochen den TSC, und überprüfst ob du schon fertig bist mit warten. Wenn ja springst du einfach zum Caller zurück.