Zeitverahlten
-
Halli hallo,
ic habe folgendes Problem. Ich bin gerade dabei eine Bewegungsaplikation für einen Roboter zu Prgrammieren. Das ganze ist für die Uni. Da das zum Proekt gehört MUSS die Bahnberechnung, Bewegungsplanung, usw. ausgelagert werden. Das heisst ich schreibe es in C++. Allerdings möchte ich halt ein iteratives verfahren anwenden um sich vom Start zum Zielwert zu Tasten. Nun bekomme ich über eine Schnittstelle, sagen wir mal pi mal daumen, alle 200 ms Sensorwerte. Jeden Sensorwert müsste ich nun einzeln verarbeiten in einer schleife. Das heisst das auch nur eben diese schleife alle 200 ms mit einem neuen Sesorwert gestartet werden darf. Also meine erste Frage ist, welche Funktion ich da nehme sollte gettimeofday() oder time(). time() gibt ja nur in sekunden aus richtig oder falsch? gettimeofday() ist wohl recht ungenau habe ich gelesen. Stimmt das?Des Weiteren, ist es möglich eine schleife zu initalisieren die nur anspringt wenn beide bedingungen erfüllt sind und zwar nach einander. Z.B.: if (time > 200 && Sensordata_new!=Sensordata_old). Ist da ein Denkfehler der könnte es Klappen?
Würde ungern losprogrammieren nen paar Tage sitzen um fest zu stellen das die Grundidee scheisse ist, also ein paar Fachkundige Meinungen bitte :D.
Vielen Dank im Voraus
-
Habe gerade noch ne FUnktion erspäht.
#include <ctime>
clock_t clock( void );Zu welcher würded ihr raten? ODer kenn ihr noch eine Leistungsfähigere. Bin was das Zeitmanagment angeht in C++ leider sehr unbelekt.
-
Also wenn du es genau haben willst, dann kommst du um spezifische Sachen nicht rum. Für Windows würde ich dier QueryPerformanceCounter empfehlen.
-
Ich würde da gar nicht irgendwie mir Timern arbeiten. Das geht mit sehr hoher Wahrscheinlichkein in die Hose, da Du das ganze nie synchron bekommen wirst (Inputtakt und interner Takt des Rechenknechtes passen nicht).
Besser wäre ein datengetriebener Ansatz. Das heisst, Du wartest (entweder passiv mit z.B. mit einem Callback oder durch Polling) darauf, dass ein neuer Sensorwert reinpurtzelt. Immer genau dann lässt Du die Schleife loslaufen. Das heisst, neue Eingansdaten triggern Deine Schleife. Wichtig ist dabei natürlich, dass die Schleife mit ihrer Tätigkeit fertig ist, bevor das nächste Datum reintrudelt.
Pseudocode:
[b]while[/b] programm active [b]loop[/b] [b]if[/b] no new data available [b]then[/b] wait for new data [b]else[/b] [b]while[/b] processing condition [b]loop[/b] process data [c][u]elihw[/u][/c] [b][u]fi[/u][/b] [c][u]elihw[/u][/c]
-
gettimeofday bietet eine Genauigkeit irgendwo im Bereich von ein paar Mikrosekunden. Da deine Sensordaten nur alle 200 ms kommen (eine halbe Ewigkeit) ist gettimeofday absolut ausreichend.
Da du gettimeofday erwähnst programmierst du vermutlich auf einem GNU/Linux-System. Solltest du den Ansatz von Tachyno wählen, wäre daher auch die Funktion nanosleep() für dich interessant, um das "wait for new data" zu realisieren,
damit dein Prozess nicht unnötig Prozessorzeit verschwendet.