Forum: PC-Programmierung zyklischer Funktionsaufruf mit Berücksichtigung der Dauer


von *GAST* (Gast)


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?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Mr. Interrupt (Gast)


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?

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Mr. Interrupt (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Und da kommt man nicht an die Interrupts 'ran.

nun ja, aber man kann sehr wohl Timer programmieren. Hier ein Beispiel:

http://www.andreadrian.de/c-workshop/#mozTocId722365

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das ist Linux, aber diese Timer haben mit Interrupts und echten 
Timerbausteinen auch nur noch sehr entfernt etwas zu tun.

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.

von Mr. Interrupt (Gast)


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 :-)!

von Rolf M. (rmagnus)


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.

von Peter II (Gast)


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() )
}

von Mr. Interrupt (Gast)


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.

von Peter II (Gast)


Lesenswert?

Mr. Interrupt schrieb:
> 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.

niemand, muss sie auch nicht. Schau dir das Beispiel an.

von Mr. Interrupt (Gast)


Lesenswert?

...wie auch immer. Derzeit führen wir eine rein akademische Diskussion, 
an der sich der Fragesteller nicht weiter beteiligt, um weiteren Input 
zu geben. Lassen wir das Thema einfach mal ruhen, bis er sich wieder 
meldet...

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Peter II schrieb:
> 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.

Doch, das muss man sogar, da die Aktivität, die ausgeführt wird, 
durchaus unterschiedlich lange dauern kann.

von *GAST* (Gast)


Lesenswert?

Danke für die vielen und teilweise wirklich konstruktiven Beiträge! Ich 
muss mich jetzt erstmal bisschen sortieren und durch die ganzen 
Informationen durchsteigen ;)

Aber ja, es ist richtig, ich programmiere in C unter Windows XP.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

*GAST* schrieb:
> Aber ja, es ist richtig, ich programmiere in C unter Windows XP.

Dann sieh Dir timeSetEvent genauer an:

http://msdn.microsoft.com/en-us/library/windows/desktop/dd757634%28v=vs.85%29.aspx

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.