Pro-Linux.de

Pro-Linux

Pro-Linux Diskussions- und Hilfeforum
Aktuelle Zeit: 19. Nov 2018 4:40

Alle Zeiten sind UTC+01:00




Ein neues Thema erstellen  Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: pthread und Timer von 10ms
BeitragVerfasst: 21. Mai 2007 17:48 
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


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 21. Mai 2007 20:31 
Offline
Benutzeravatar

Registriert: 11. Feb 2006 19:10
Beiträge: 3569
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.


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 22. Mai 2007 13:56 
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


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 22. Mai 2007 22:59 
Offline
Benutzeravatar

Registriert: 11. Feb 2006 19:10
Beiträge: 3569
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.


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 23. Mai 2007 15:30 
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


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 24. Mai 2007 18:36 
Offline
Benutzeravatar

Registriert: 11. Feb 2006 19:10
Beiträge: 3569
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.


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 24. Mai 2007 21:33 
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


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 27. Mai 2007 14:02 
Offline

Registriert: 03. Mär 2006 23:16
Beiträge: 430
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


Nach oben
   
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen  Auf das Thema antworten  [ 8 Beiträge ] 

Alle Zeiten sind UTC+01:00


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.
Sie dürfen keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
Powered by phpBB® Forum Software © phpBB Limited
Deutsche Übersetzung durch phpBB.de