pthread und Timer von 10ms

Post Reply
Message
Author
macke_a

pthread und Timer von 10ms

#1 Post by macke_a »

Hallo !
Ich suche eine Programmierlösung, wie ich einen Timer mit einem Intervall von 10ms initialisieren kann. Bis jetzt habe ich eine nicht so sinnvolle Lösung gehabt, die mir ständig Abweichungen von mehreren Millisekunden gebracht hat.

Ich habe durch googlen erfahren, das man am besten einen Timer mit pthread ins Leben rufen kann. Nun, ich bin nicht der Fachmann in Linux, allerdings suche ich eine Lösung für mein Problem, damit der Timer endlich exakt läuft!

Bis jetzt habe ich folgende Timer Routine gehabt:

myTime.it_value.tv_sec = 0;
myTime.it_value.tv_usec = 10000; // 10ms

myTime.it_interval.tv_sec = 0;
myTime.it_interval.tv_usec = 10000; // 10ms

signal(SIGALRM, (void(*)(int)) handler);
setitimer(ITIMER_REAL, &myTime, NULL);

Dieser Timer soll alle 10ms ein Flag (RX) setzen.

void handler()
{ RX = 1; }

Ich hoffe, irgendwer kann mir weiterhelfen..??


Bin dankbar für jede Hilfe!

mfg macke_a

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#2 Post by Janka »

Für zuverlässiges Timing im Bereich unter 100ms brauchst du Echtzeitpriorität. Such' in diesem Forum danach, ich hab dazu schon einiges geschrieben.

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

macke_a

#3 Post by macke_a »

Danke für die Antwort. Ich habe jetzt mal ca. 4 Stunden Zeit investiert um eine entsprechende Lösung für meinen Timer zusammen zu stellen. Durch Recherchen bei Google und wo ich sonst nicht überall gewesen bin.

Allerdings bin ich noch nicht 100% überzeugt, dass ich jetzt den Timer mit einer exakten Zeit von 10ms hin bekomme.

Mit fehlt noch der richtig Ansatz, wie ich das mit dem Scheduler und meinem Timer zusammenbringen kann.

Die Beiträge von Janka habe ich auch alle durch forstet, aber so richtig steige ich da noch nicht hinter. Sorry, aber mit solchen Anwendungen habe ich bis jetzt noch gar nichts am Hut gehabt.

Gibt es denn nicht irgendwo ein Beispiel, was mir die Sache mit dem Timer und meiner Echtzeit deutlicher darstellen lässt.
Vielleicht hat jemand von Euch noch ein Quelltext mit dem er irgendwann mal einen Echtzeit Timer aufgebaut hat!

Wäre dankbar !!

mfg macke_a

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#4 Post by Janka »

Man muss dem Prozess Echtzeit-Priorität verpassen, damit man exakte Zeiten unter 100ms überhaupt abstoppen kann. Denn sonst kann immer ein anderer Prozess gerade dran sein, wenn dein 10ms-Timer gerade abläuft. Und der andere Prozess darf dann erstmal fertigarbeiten, bis er selbst an eine Wartestelle kommt. Und selbst dann muss nicht sofort dein Prozess drankommen. Wenn noch ein anderer Prozess gerade laufen könnte, entscheidet der Scheduler das nach einem komplizierten Wertungsverfahren.

Echtzeitpriorität für deinen Prozess garantiert dir hingegen, dass dein Prozess *sofort* dran kommt, sobald dein Timer abläuft. Andere Prozesse mit niedrigerer Priorität werden *sofort* unterbrochen, um den Echtzeitprozess wieder starten zu können.

Such hier mal nach dem Begriff "sched_setscheduler" .

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

macke_a

#5 Post by macke_a »

Hallo !
Ist das denn ausreichend, wenn ich den Prozess mit der unterstehenden Funktion bei der Initialisierung aufrufe ?
Ich habe das mal in mein Programm mit eingebunden, zu meckern hatte mein Compiler nichts, allerdings den Timer kann man immer noch nicht verwerten.
Ach und mein System stürzt auch nach einer Zeit von ca. 10-15 Sekunden, im Intervall ab.

Ganz ehrlich mal gesagt. Ich habe heute wieder ne Menge Zeit für das Problem investiert,allerdings ich komme einfach nicht zum Ziel.
Ich will mir das ja wohl selber aneignen, aber irgendwie verstehe ich es nicht!!

Die Threads aus diesem Forum über den Begriff "sched_setscheduler" habe ich gelesen, aber ohne nennenswerten Erfolg!
Ich bin halt ein Linux Leie und nicht am Anfang des Ganzen die Thematik zu verstehen!!

void setprio()
{ const struct sched_param sp= { sched_priority: 1, };

if (sched_setscheduler(0, SCHED_FIFO, &sp)<0)
{ perror("sched_setscheduler");
exit(EXIT_FAILURE);
}
}

Vielleicht gibt es noch ne weiter Hilfe für mich?!?

Mfg macke_a

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#6 Post by Janka »

Ja, es reicht, wenn man diese Funktion am Anfang des Programms einmal aufruft. Wenn dein System nach einigen Sekunden "steht", bedeutet dies, dass du eine Endlosschleife in deinem Programm hast. Einen Prozess mit Echtzeitpriorität kann nur ein anderer Prozess mit höherer Echtzeitpriorität wieder stoppen. Also bastle dir für Experimente ein Miniprogramm, dass die eigene Priorität auf "2" anhebt und dann mit execve("/bin/sh") in eine Shell umgewandelt wird.

Diese Shell startest du aus der Textkonsole und *nur darin* testest du dein Programm.

Wieviel Zeit du investieren musst, hängt von deinem Können ab. Wenn du noch keine Ahnung hast, musst du sie dir eben zuerst beschaffen. Wenn du dein Problem gelöst hast, hast du ziemlich viel Wissen über genaues Timing für Vielbenutzersysteme erworben. Übrigens ist diese Problematik OS-unabhängig. Linux ist eher noch eins der pflegeleicht auf Echtzeit zu trimmenden Systeme.

(Ich bin übrigens nicht euer Praktikumsbetreuer. Wenn der euch solche Aufgaben stellt, sollte er euch auch dabei helfen...)

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

macke_a

#7 Post by macke_a »

Hallo Janka,
erstmal Danke für Deine Antworten!
Sie helfen mir sehr, so mache Prozesse von Linux und dem Umgang mit dem Timing aufgrund meiner Recherchen zu verstehen.

Ich versuche mir gerade selber aus beruflichen Gründen den Umgang mit Linux und was sonst so alles mit einem Betriebssystem verbunden ist beizubringen.

Meine Praktika habe ich im übrigen erfolgreich abgeschlossen, dementsprechend mein Studium beendet!

Naja trotzdem finde ich es gut wenn es so Leute wie Dich gibt, die anderen helfen.
Desweiteren kann ich es auch vestehen das Du Dich ungern wiederholen willst.

Nochmals besten Dank!

Falls ich noch eine Frage über das Timing habe werde ich es ebenfalls in diesen Thread schreiben. Vielleicht bekomme ich auch mal eine Antwort von jemanden anders.
Allerdings bist du bis jetzt immer noch der schnellste oder der mit dem besten Wissen hier gewesen!

MFG macke_a

komsomolze
Posts: 430
Joined: 03. Mar 2006 23:16

#8 Post by komsomolze »

Hallo,

auf http://www.linux-magazin.de mal nach "Echtzeit" suchen, dort zBsp. die Beiträge der Rubrik "Kern-Technik.
Auch die Ausgabe 2005/09, zBsp http://www.linux-magazin.de/heft_abo/au ... aufgemotzt mit Links zu REALTIME_PREEMPTION.
mfg komsomolze

Post Reply