Was macht Sleep(xxx) ?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Was macht Sleep(xxx) ?

Beitrag von Mathias »

In der Unit sysutils sieht sleep folgenderweisen aus.

Code: Alles auswählen

procedure Sleep(milliseconds: Cardinal);
Var
  timeout,timeoutresult : TTimespec;
  res: cint;
begin
  timeout.tv_sec:=milliseconds div 1000;
  timeout.tv_nsec:=1000*1000*(milliseconds mod 1000);
  repeat
    res:=fpnanosleep(@timeout,@timeoutresult);
    timeout:=timeoutresult;
  until (res<>-1) or (fpgeterrno<>ESysEINTR);
end;   

Hier wird fpnanosleep aufgerufen, aber was macht diese. mehr sehe nicht, da diese external ist.
Lastet Sleep ein CPU-Kern mit repeat until voll aus, oder macht das das OS irgend was intelligenteres ?

Bei Arduino ist die mit einer Schleife gelöst.

Code: Alles auswählen

void delay(unsigned long ms) {
   uint16_t start = (uint16_t) micros();
   while (ms > 0) {
      if (((uint16_t) micros() - start) >= 1000) {
         ms--;
         start += 1000;
      }
   }
}
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Was macht Sleep(xxx) ?

Beitrag von theo »

Es hält den Thread für eine bestimmte Zeit an. Die Rechnerzeit sollte dann afaik anderen Threads zur Verfügung stehen.

http://pubs.opengroup.org/onlinepubs/96 ... sleep.html

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Was macht Sleep(xxx) ?

Beitrag von Warf »

Ja wie Theo geschrieben hat wird der aktuelle Thread unterbrochen, und für mindestens die angegebene Zeit vom scheduler ignoriert, wann der Thread wieder gescheduled wird hängt natürlich von der Umgebung ab, aber es wird mindestens die angegebene Zeit gewartet (manchmal mehr, eventuell sogar deutlich mehr, aber nie weniger).
Der scheduler wählt dann einen anderen Thread aus, oder ein anderes Programm (wenn z.B. Alle anderen Threads bereits schon auf anderen CPU's laufen oder es keine anderen Threads gibt) das heißt, im Gegensatz zum busy waiting wird die Prozessorleistung abgegeben und nicht belegt. Das ist gut für langes warten, willst du allerdings akkurat kurze Zeitspannen warten würde ich eher auf busy waiting (leere while Schleife) setzen.

Der arduino verwendet natürlich busy waiting, da es ohne OS auch keinen scheduler gibt, und damit kann keine Rechenzeit abgegeben werden

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Was macht Sleep(xxx) ?

Beitrag von mschnell »

Warf hat geschrieben:willst du allerdings akkurat kurze Zeitspannen warten würde ich eher auf busy waiting (leere while Schleife) setzen.
Busy wait wartet auch mindestens eine bestimmte Zeit, weil ja nach Eintreten des Abbruch-Kriteriums auch ein anderer Tread oder Prozess drankommen kann und den fraglichen Task beliebig lange auf Eis legen kann.

Braucht man genaueres Timing, geht das nur mit Prioritäten und wenn es darauf ankommt, sicher ein maximales Timing zu garantieren, braucht man ein Realtime-Betriebssystem (gibt es für Linux).

-Michael

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Was macht Sleep(xxx) ?

Beitrag von Mathias »

Wen ich es richtig verstanden habe, wen es ungenau sein kann, bekommt man Untersützung vom OS und es wird keine CPU-Leitung verbrannt ?
Aber wen es genau sein muss, dann muss man es mit einer Schleife machen, so wie es beim Arduino der Fall ist, aber die geht nur bei einem Single-Task OS, zB. MS-Dos mit gesperrten Interrupts ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Was macht Sleep(xxx) ?

Beitrag von Socke »

Mathias hat geschrieben:Wen ich es richtig verstanden habe, wen es ungenau sein kann, bekommt man Untersützung vom OS und es wird keine CPU-Leitung verbrannt ?
Aber wen es genau sein muss, dann muss man es mit einer Schleife machen, so wie es beim Arduino der Fall ist, aber die geht nur bei einem Single-Task OS, zB. MS-Dos mit gesperrten Interrupts ?

Ja, mit einem Zusatz: bei einem Single-Task OS bzw. embedded-Geräten kann man auch über Hardware-Timer (der einen Interrupt auslöst) sehr exakte Timings erreichen. In diesem Fall kann man den Prozessor ebenfalls schlafen legen (je nach Hardware gibt es unterschiedliche Modi).
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: Was macht Sleep(xxx) ?

Beitrag von Timm Thaler »

Mathias hat geschrieben:Aber wen es genau sein muss, dann muss man es mit einer Schleife machen, so wie es beim Arduino der Fall ist, aber die geht nur bei einem Single-Task OS, zB. MS-Dos mit gesperrten Interrupts ?


Das geht für kurze Zeiten auch in Multitask-Umgebungen. Ich hab damit mal das Timing für das Märklin-Motorola-Digitalsystem einer Modellbahn unter Windows gemacht.

Du musst halt dem Prozess höchste Priorität zuweisen, dann Dein Timing durchführen und die Priorität wieder auf normal zurückstellen. Wenn Du letzteres auch nur einmal vergisst, bist Du am Arsch. Für ein paar 10 msec kann man das machen, für mehrere Sekunden definitiv nicht.

Deswegen verstehe ich auch nicht, wieso die Leute so scharf drauf sind, Software-PWM auf dem Raspberry zu machen. Das geht solange gut, bis jemand auf die Idee kommt, da den Firefox zu starten. Für sowas nimmt man einen externen PWM-Controller am I2C.

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Was macht Sleep(xxx) ?

Beitrag von Mathias »

Du musst halt dem Prozess höchste Priorität zuweisen, dann Dein Timing durchführen und die Priorität wieder auf normal zurückstellen. Wenn Du letzteres auch nur einmal vergisst, bist Du am Arsch. Für ein paar 10 msec kann man das machen, für mehrere Sekunden definitiv nicht.

Wen ich mich erinneren mag, hat folgender Code unter Win95 den PC komplett blockiert. Aber mit einem Mehrprocessoersystem zB. WinNT konnten man den PC noch bedienen.

Code: Alles auswählen

  repeat
    Tue_was;
  until false;

Ist dies in etwa der gleiche Effekt.

Deswegen verstehe ich auch nicht, wieso die Leute so scharf drauf sind, Software-PWM auf dem Raspberry zu machen. Das geht solange gut, bis jemand auf die Idee kommt, da den Firefox zu starten. Für sowas nimmt man einen externen PWM-Controller am I2C.

Ich dachte, der Raspy habe so was, aber man kann ich täuschen. :oops:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: Was macht Sleep(xxx) ?

Beitrag von Timm Thaler »

Mathias hat geschrieben:Ist dies in etwa der gleiche Effekt.


Naja, Windows 7 dürfte den Prozess nach einiger Zeit als "reagiert nicht mehr" anhalten und killen. Ausserdem kann Dir immer ein anderer Task dazwischenhacken, deswegen das Höhersetzen der Priorisierung. Und da heutzutage meistens Mehrkern-Prozessoren laufen, kannst Du den Rechner vielleicht noch ganz gut bedienen.

Also wie gesagt, für kurze Zeiten geht das. Ein delay(2000) würde ich damit nicht machen wollen. Die Gefahr ist zu groß, dass Windows der Meinung ist, Dein Programm sei abgestürzt und es abschießt.

Ich dachte, der Raspy habe so was, aber man kann ich täuschen. :oops:


Der Raspi hat Hardware-PWM, aber nur auf einigen GPIOs.

Antworten