Sleep + µs
-
- Beiträge: 6900
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Sleep + µs
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.
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
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 958
- Registriert: Mo 11. Sep 2006, 22:56
Re: Sleep + µs
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
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
Re: Sleep + µs
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.
-
- Beiträge: 6900
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Sleep + µs
Ich will es möglichst vermeiden, fremde Bibliotheken zu verwenden.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:
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}
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
- af0815
- Lazarusforum e. V.
- Beiträge: 6766
- 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
Da kann man darüber diskutieren ob die Lazarus-ccr eine 'fremde' Bibliothek ist. Sie gehört zum Lazarus Projekt hinzu.Mathias hat geschrieben:Ich will es möglichst vermeiden, fremde Bibliotheken zu verwenden.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
Re: Sleep + µs
Und du musst dir nur die EpikTimer-Unit ins Projekt kopieren, billiger kriegst du die Mikrosekunden nicht.
-
- 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
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
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
-
- Lazarusforum e. V.
- Beiträge: 3177
- 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
Unter Linux/Unix kannst du auch die Funktion FpNanoSleep verwenden. Das kann zwar keine Microsekunden, wenn du aber Nanosekunden verrechnen kannst ...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.
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

- Prozesspriorität maximieren
- Speicher als Non-Swap markieren
- Echtzeitkernel verwenden
- Kernelmodul schreiben
- Microcontroller verwenden
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
- Beiträge: 6900
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Sleep + µs
Ich habe den VGA-Ausgang, wie in diesem Thread verwendet, an dem ich einen ADS1115 angeschlossen habe.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.
http://www.lazarusforum.de/viewtopic.ph ... 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
Mit Java und C/C++ sehe ich rot