Zeitmessung in While-Schleife
-
Guten Abend,
an der Uni basteln wir derzeit an einem Projekt, bei dem es darum geht, eine Metallkugel auf einem Touchpad rollen zu lassen und dieses Pad dann mit Motoren so zu bewegen, dass die Kugel in der Mitte der Platte fixiert wird. Das klappt soweit auch ganz gut. Grob gesprochen werden in einer While-Schleife die Werte vom Touchpad ausgelesen und - sofern ein neuer Wert vorliegt - an den Controller gesendet. Jetzt müssen wir jedoch die Geschwindigkeit der Kugel ins Auge fassen. Dazu sind ja zwei Koordinaten-Werte (bzw. vier) zu betrachten und die Zeit beim Wechsel von einem auf den nächsten Wert zu berechnen (Wegen v=s/t).
Unsere Programmiersprache ist C, Betriebssystem Linux, und wir benutzen den gcc-Compiler.
Jetzt meine Frage: Gibt es eine Möglichkeit die Zeit eines Koordinatenwechsels zu messen und zwar möglichst genau? Und falls ja, kann man die so gestalten, dass sie möglichst unabhängig vom verwendeten Betriebssystem ist?
Tut mir leid, wenn ich die Frage nicht ins richtige Forum geschrieben habe. Bin mir nämlich nicht sicher, ob es eine Standard-Lösung für dieses Problem gibt.
-
fälscher könnt die subforum auswahl fast nicht sein :p
naja nicht direkt, kommt ein bischen darauf an wie genau das alles sein muß. denke du hast 2 mögl.1. funktion des os
2. takte zählen und ausrechnenist linux ein rtos? falls nicht rollt dir die kugel eh vom pad
:p
lg lolo
-
noobLolo schrieb:
fälscher könnt die subforum auswahl fast nicht sein :p
naja nicht direkt, kommt ein bischen darauf an wie genau das alles sein muß. denke du hast 2 mögl.1. funktion des os
2. takte zählen und ausrechnenist linux ein rtos? falls nicht rollt dir die kugel eh vom pad
:p
lg lolo
Die rollt nur dann vom Pad, wenn wir das net gescheit programmieren
Also meine bisherige Idee ist, dass die Zeitmessung beginnt, sobald die ersten Koordinaten anliegen. Die werden dann am Ende der While-Schleife an den Controller gesendet und anschließend werden schon die neuen Koordinaten berechnet. D.h. ich muss quasi den Timer stoppen nachdem die zweiten Koordinaten anliegen. Aber ich hab keine Ahnung wie der Code für so eine Funktion aussehen muss. Schon gar nicht in C
Hat da jemand nen Ansatz? Die Zeitmessung muss schon so genau wie möglich sein. Am besten 10 Stellen hinterm Komma
-
andere idee du lässt die zeit weg und nimmst vektoren, also die diff vom letztem zu diesem schleifen durchlauf. nachdem ein schleifendurchlauf immer gleich lang dauern sollte, kannst dir die zeit auch schenken da sie eh immer gleich ist(sein sollte aber es nicht ist da du ja linux verwendest...)
-
http://www.qnx.com/company/germany/index.html
sowas bietet sich da an
-
Sorry, hab mich falsch ausgedrückt. Richtig muss es so lauten: Die erste Zeitmessung soll erfolgen, sobald die ersten Koordinaten vom Pad geliefert wurden. Die Daten werden dann sogleich an den Controller gesendet. Erst wenn neue Koordinaten anliegen, soll der timer wieder stoppen bzw. neu anfangen für die nächste Messung. Also es hängt nicht davon ab, wie schnell die While-Schleife durchlaufen wird, da ja nach dem Schreiben an den Controller die Zeit noch so lange weiterläuft bis neue Koordinaten geliefert werden. Sofern sich die Kugel nicht bewegt, kann das schon eine Weile dauern.
Mit Vektoren...hmm. Muss ich mir mal durch den Kopf gehen lassen.
-
post doch einfach mal ein bischen code und dann wirst evtl. in den linux bereich verschoben dann gehts da weiter...
-
#include <sys/time.h> #define MICRO_IN_SEC 1000000.00 double microtime(){ struct timeval tp = {0}; gettimeofday(&tp, NULL); return (double)(tp.tv_sec + tp.tv_usec / MICRO_IN_SEC); }
evtl. schon mal ein bischen im vorraus
-
noobLolo schrieb:
v******
voraus
-
noobLolo schrieb:
#include <sys/time.h> #define MICRO_IN_SEC 1000000.00 double microtime(){ struct timeval tp = {0}; gettimeofday(&tp, NULL); return (double)(tp.tv_sec + tp.tv_usec / MICRO_IN_SEC); }
evtl. schon mal ein bischen im v******
Warum wird denn oraus gesternt? Hmm...Aber danke für den Code, den merk ich mir mal. Kann leider keinen Code posten, da der nur aufm Uni-Rechner ist. Hab den nicht hier.
Hab grad noch was bei Google gefunden. Eventuell hilft auch sowas wie GetTickCount, mit dem man die Zeit seit dem Booten messen kann. Auf jeden Fall vielen Dank. Wird schon irgendwie klappen hoff ich. Plattformunabhängig wird sowas wohl kaum gehen.
-
#define rdtsc(low,high) \ __asm__ __volatile__("rdtsc" : "=a" (low), "=d" (high))
sowas wär dann noch da, ist aber nur für x86 ab pentium und nicht viel genauer als gettimeofday()...
so hängst dann an der hardware(plattform) ... aber ja zeit und unabhängig ist nicht drin. je genauer das alles sein muß desto spezifischer wird die ganze sache