Sleep + µs

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

Sleep + µs

Beitrag von Mathias »

Gibt es einen Sleep, welcher auch µs Verzögern kann ?
Sleep kann nur ms.

Ich brauche es für die Kommunikation mit I²C.
Wen ich es mit Sleep(1) mache, wird das Programm schon zu stark abgebremst.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

creed steiger
Beiträge: 957
Registriert: Mo 11. Sep 2006, 22:56

Re: Sleep + µs

Beitrag von creed steiger »

das ist natürlich OS abhängig und ohne ein RTOS nicht sicher/definiert wegen fehlender Antwortzeitgarantie.

Ist zwar Bastelei aber du kannst hier mal schauen

http://www.mail-archive.com/fpc-pascal@ ... 43349.html
und ganz am ende des Strangs:
https://github.com/Zaaphod/FPC-Delay

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Sleep + µs

Beitrag von wp_xyz »

Vielleicht geht's mit dem EpikTimer im ccr (https://sourceforge.net/p/lazarus-ccr/s ... epiktimer/), ich glaube, du brauchst nur die Unit EpikTimer.pas:

Code: Alles auswählen

uses
  EpikTimer;
...
 
var
  ET: TEpikTimer;
 
procedure MySleep(Seconds: Extended);
begin
  ET.Clear;
  ET.Start;
  repeat until ET.Elapsed >= Seconds;
  ET.Stop;
end;
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  MySleep(10.0e-6);
  Label1.caption := Format('%.2f µs', [ET.Elapsed * 1E6]);
end;
 
initialization
  ET := TEpikTimer.Create(nil);
 
finalization
  ET.Free;
 
end.

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

Re: Sleep + µs

Beitrag von Mathias »

Vielleicht geht's mit dem EpikTimer im ccr (https://sourceforge.net/p/lazarus-ccr/s ... epiktimer/), ich glaube, du brauchst nur die Unit EpikTimer.pas:

Ich will es möglichst vermeiden, fremde Bibliotheken zu verwenden.

Aber für dem Moment habe ich es auf diese Methode probiert:

Code: Alles auswählen

        {$OPTIMIZATION off}
        for i := 0 to $FFFFFF do;
        {$OPTIMIZATION on}

Ist nicht unbedingt das gelbe vom Ei, da dies stark CPU-Abhängig ist.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6200
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Sleep + µs

Beitrag von af0815 »

Mathias hat geschrieben:Ich will es möglichst vermeiden, fremde Bibliotheken zu verwenden.


Da kann man darüber diskutieren ob die Lazarus-ccr eine 'fremde' Bibliothek ist. Sie gehört zum Lazarus Projekt hinzu.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Sleep + µs

Beitrag von wp_xyz »

Und du musst dir nur die EpikTimer-Unit ins Projekt kopieren, billiger kriegst du die Mikrosekunden nicht.

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: Sleep + µs

Beitrag von mschnell »

Mit EpicTimer kann man ziemlich auf die Nase fallen.

Es ist OS und Versions-Abhängig, was er tut. Außerdem benutzt er für genaue Messungen den CPU Cycle Counter. Der ist bei einigen CPUs nicht zuverlässig und bei Systemen mit mehreren CPUS (auf mehreren Chips) sind diese Counter nicht synchronisiert und das Ergebnis hängt davon ab, auf welcher CPU der Prozess gerade Läuft. Das kann ohne Benachrichtigung jederzeit wechseln. (Bei Windows sogar sehr wahrscheinlich da hier der aktive Prozess mit Absicht (und idiotischer weise [starke Performance Einbußen durch Cache-Misses] zwischen den CPUs hin und her geschoben wird, um zu starke Erwärmung zu vermeiden und werbewirksam eine höhere Taktfrequenz fahren zu können. Linux dagegen versucht optimales CPU-Binding der Prozesse.) So kann bei EpicTimer die Zeit sogar rückwärts laufen.

Generell ist es keine gute Idee kurze Zeiten mit einem Programm zu messen, das als Task in einem normalen Betriebssystem läuft.

-Michael

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: Sleep + µs

Beitrag von Socke »

Mathias hat geschrieben:Gibt es einen Sleep, welcher auch µs Verzögern kann ?
Sleep kann nur ms.

Ich brauche es für die Kommunikation mit I²C.

Unter Linux/Unix kannst du auch die Funktion FpNanoSleep verwenden. Das kann zwar keine Microsekunden, wenn du aber Nanosekunden verrechnen kannst ...
Damit sollte sich das Problem in 80-99 Prozent der Fälle lösen lassen. Wenn das nicht hilft, probiere die folgenden Dinge nacheinander aus :D
  1. Prozesspriorität maximieren
  2. Speicher als Non-Swap markieren
  3. Echtzeitkernel verwenden
  4. Kernelmodul schreiben
  5. Microcontroller verwenden

Willst du uns erzählen, wie du mit welchem Gerät per I2C kommunizieren möchtest? Vielleicht gibt es noch eine andere Möglichkeit, als zu warten.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

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

Re: Sleep + µs

Beitrag von Mathias »

Willst du uns erzählen, wie du mit welchem Gerät per I2C kommunizieren möchtest? Vielleicht gibt es noch eine andere Möglichkeit, als zu warten.

Ich habe den VGA-Ausgang, wie in diesem Thread verwendet, an dem ich einen ADS1115 angeschlossen habe.

viewtopic.php?f=12&t=10045&p=88142&hilit=mcp#p88142

Ich bin am mehreren Varianten am ausprobieren, auch eine über einen Arduino, per USB. Dies läuft auch unter Windows.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten