zyklischer Funktionsaufruf mit Berücksichtigung der Dauer

Gast #2581489
Lesenswert?

Moin,

ich möchte gerne für Messzwecke (Abtastrate 4 Hz) einen Thread oder 
Ähnliches generieren, der exakt alle 1/4 s ein fprintf aufruft und Daten 
in eine Datei schreibt.

Im Prinzip würde das wohl mit einem Thread gehen in dem der 
fprintf-Befehl und ein Delay(0.25) in einer Endlosschleife steht, aber 
ich möchte berücksichtigen, dass fprintf ein bisschen dauert und ich so 
eine Zykluszeit von 0.25 s + fprintf-Dauer habe.

Wie kann man soetwas realisieren?
Gast #2581558
Lesenswert?

Rufus Τ. Firefly schrieb:
> Zu Beginn des Zyklusses die genaue Zeit bestimmen, Aktivität ausführen,
> wieder genaue Zeit bestimmen, Differenz zwischen beiden Zeiten
> bestimmen, diese von der gewünschten Intervalldauer abziehen und das
> Resultat an "Delay" übergeben.

ein wenig zu kompliziert, meinst du nicht?

Viel einfacher wäre es doch einen Interrupt alle 0,25s losfeuern zu 
lassen, der dann die entsprechende Funktion aufruft, oder?
Persönliche Seite #2581585
Lesenswert?

Da der Threadstarter von Threads redet, gehe ich vom Vorhandensein 
eines Betriebssystems aus, und da das hier unter "PC-Programmierung" zu 
finden ist, erst recht.

Und da kommt man nicht an die Interrupts 'ran.

Am nächsten kommt man dem Ansatz unter Windows durch Einsatz der 
multimediatimer, hier kann mit timeSetEvent eine zyklisch aufzurufende 
Callbackfunktion eingerichtet werden.

Diese läuft allerdings in einem eigenen Thread, was eine entsprechend 
threadsichere Laufzeitumgebung voraussetzt.
Gast #2582054
Lesenswert?

Rufus Τ. Firefly schrieb:
> Das ist Linux,...
ich programmiere nur unter dieser Plattform...

> aber diese Timer haben mit Interrupts und echten
> Timerbausteinen auch nur noch sehr entfernt etwas zu tun.
stimmtnur ganz entfernt, aber ich denke diese Systematik würde das tun, 
was der TS eigentlich will.

Rufus Τ. Firefly schrieb:
> können wir Deinen Beitrag als wertvolle
> Ergänzung meines generischen und Windows-Vorschlages ansehen.
Danke :-)!
#2582207
Lesenswert?

Rufus Τ. Firefly schrieb:
> Das ist Linux, aber diese Timer haben mit Interrupts und echten
> Timerbausteinen auch nur noch sehr entfernt etwas zu tun.

Naja, diese Timer senden Signale, und die kann man als das 
Userspace-Pendant zu Interrupts sehen. Die Verwendung ist doch sehr 
ähnlich.

> Da der Threadstarter sich nicht darüber ausgelassen hat, welches
> Betriebssystem er nutzt, können wir Deinen Beitrag als wertvolle
> Ergänzung meines generischen und Windows-Vorschlages ansehen.

Möglichkeiten dazu bietet eigentlich so ziemlich jedes Betriebssystem. 
Die Variante, die verbrauchte Zeit zu messen und von der Periodendauer 
abzuziehen, um eine Wartezeit auszurechnen ist auch eher Murks, weil 
auch da Fehler enthalten, die sich aufaddieren. Bei einem Zyklustimer 
dagegen passiert das nicht.
Gast #2582666
Lesenswert?

Rolf Magnus schrieb:
> Möglichkeiten dazu bietet eigentlich so ziemlich jedes Betriebssystem.
> Die Variante, die verbrauchte Zeit zu messen und von der Periodendauer
> abzuziehen, um eine Wartezeit auszurechnen ist auch eher Murks,

wenn man es richtig macht dann nicht. Man muss nur einmal die Zeit 
ermittlen und kann sich damit dann immer den nächsten start ausrechnen. 
Man darf nicht jedes mal die aktuell zeit ausrechnen.

x = time()
while ( true ) {
   x = x + (wartezeit)
   wait( x - time() )
}
Gast #2582688
Lesenswert?

Peter II schrieb:
> wenn man es richtig macht dann nicht. Man muss nur einmal die Zeit
> ermittlen und kann sich damit dann immer den nächsten start ausrechnen.
> Man darf nicht jedes mal die aktuell zeit ausrechnen.

hmm, ... und wer garantiert, dass die Ausführungszeit immer konstant 
ist? Dazu müßte der Prozessor immer die gleiche Auslastung haben, was 
nun wahrlich nicht gegeben ist.

Deshalb halte ich meinen Vorschlag am sinnvollsten, denn hier wird die 
Zeit vom Systemtakt des Kernels angeleitet, die immer konstant sein 
sollte.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren