Exakte Warteschleife



  • Wie erzeugt man in Assembler eine exakte Warteschleife analog Sleep(... Millisekunden)? Ich habe einmal eine Zählschleife mit dem Befehl 'hlt' (was macht das eigentlich bei einem Pentium genau?) gefunden, das hat aber leider nicht funktioniert. Man will ja unabhängig sein von der Frequenz der CPU.



  • Original erstellt von Erhard Henkes:
    Wie erzeugt man in Assembler eine exakte Warteschleife analog Sleep(... Millisekunden)? Ich habe einmal eine Zählschleife mit dem Befehl 'hlt' (was macht das eigentlich bei einem Pentium genau?) gefunden, das hat aber leider nicht funktioniert. Man will ja unabhängig sein von der Frequenz der CPU.

    Mit oder ohne OS? Mit OS den passenden System-Call benutzen, ohne könntest du z.B. den PIT programmieren, die nach der angegebenen Zeit nen Interrupt zu schicken. HLT setzt die CPU in den Schlafzustand, bis ein Interrupt auftritt. Eine passende anwendung wäre also (pseudocode):

    // warteschleife:
    done = false;
    while (!done)
    hlt();

    // interrupt-handler:
    if (interrupt kommt vom PIT)
    done = true;
    iret();

    Das blockt natürlich das ganze System solange. Wenn du das in einem eigenen OS anwendest, kann der gestoppte Task die CPU an einen anderen Task abgeben und der Interrupt-Handler würde dann den gestoppten Task wieder aufwecken.


Anmelden zum Antworten