Hallo, ich wollte Fragen, welche timer es bei c++ es gibt und welchen man für zeitkritische Sachen verwenden kann. Ich müsste vom raspberry pi an einem Dateneingang Zeiten messen.
C++ ist eine Programmiersprache, die Timer u.ä. nicht kennt. Google ist eine Suchmaschine, die kennt sowas. Und findet z.B. https://www.mikrocontroller.net/articles/Hardwarenahe_Programmierung_am_Raspberry_Pi#Zeitmessung Oliver
:
Bearbeitet durch User
Naja, man könnte auch eine "Clock" als "Timer" verstehen. Dafür gibt es in C++11: https://en.cppreference.com/w/cpp/chrono Zudem gibt es poll und select in Posix um auf ein "Event" zu warten: http://man7.org/linux/man-pages/man2/poll.2.html http://man7.org/linux/man-pages/man2/select.2.html Mit Hilfe von Threads kann man sich damit einen "echten" "asynchronen" Timer bauen. Zudem bietet Unix/Linux (POSIX) das SIGALRM an: https://linux.die.net/man/2/alarm Im Pi selbst gibt es auch Timer Peripherals. https://embedded-xinu.readthedocs.io/en/latest/arm/rpi/BCM2835-System-Timer.html Was der TE hier genau will, ist mir nicht wirklich klar, aber vielleicht hilft ja einer der Links weiter. :-)
Oliver S. schrieb: > C++ ist eine Programmiersprache, die Timer u.ä. nicht kennt. Das ist falsch. Siehe https://de.cppreference.com/w/cpp/chrono > https://www.mikrocontroller.net/articles/Hardwarenahe_Programmierung_am_Raspberry_Pi#Zeitmessung Naja, für präzise Zeitmessungen würde ich statt gettimeofday() eher clock_gettime() aus der Realtime-Bibliothek verwenden und als verwendete Uhr CLOCK_MONOTONIC. Dazu würde ich den Thread auf realtime-Scheduling umstellen.
andy_help schrieb: > ich wollte Fragen, welche timer es bei c++ es gibt und welchen man für > zeitkritische Sachen verwenden kann. Eigentlich keinen. > Ich müsste vom raspberry pi an einem Dateneingang Zeiten messen. Also unter Linux? Dann erst recht nicht. Warum? C++ ist keine Sprache, die ein exaktes Timing des erzeugten Codes garantieren kann. Linux ist kein OS, das ein exaktes Timing für Anwendungen garantieren kann. Es läuft also definitiv darauf hinaus, erstmal klarzustellen, wie genau es denn werden muss. Dann kann man schauen, ob und ggf. wie das unter Linux und mit C++ realisierbar ist.
Hi, es betrifft das Erstellen eines software uart Programms. Im Prinzip, ist es nicht schwer solch ein Programm zu schreiben. Man hat ja ein Startbit das low ist, gefolgt von dem Byte u. einem Stopbit das high ist. Demzufolge sind dies 10 Bit. Wird eine Datenübertragung beendet, ist der rx Pin immer auf high. Also erhalte ich kein Start u. Stopbit u. die nächsten 10 Bits sind wieder auf high, kann man das Programm wieder synchronisieren auf die neuen Daten die es erhalten soll. So...messe ich nun die Zeiten mit den bisherigen c++ Timer, sind die Abweichungen der Zeiten zu hoch, was natürlich falsche Bitmuser hervorrufen kann. Das Grundgerüst für die Software Uart Schnittstelle steht schon, es geht bei mir lediglich nur noch um die Timings.
Wie C-hater bereits geschrieben hat, ist ein Vanilla Linux nicht echtzeitfähig. D.h. bspw. dass zwischen zwei aufeinanderfolgenden System Calls (oder auch beliebigen Instructions) ein beliebiges Time Gap auftreten kann. Ich nehme an, du nutzt nicht die Uart des Pis sondern pollst die Pins in Software, richtig? -- Die Uart bietet nämlich Hardware Unterstützung (u.a. Fifos). Man kann sich in Software einen Workaround bauen: Man pollt kontinuierlich das Pin, und liest die Clock, immer abwechselnd. Wenn zwei aufeinanderfolgende Clock Ticks zu weit auseinanderliegen, setzt man neu auf. Eine andere Möglichkeit ist es die (sehr flexible Pi) DMA aus dem Userland zu programmieren; das ist aber nix für Anfänger. -- Und dann kann eigentlich man man auch gleich die Hardware Uart nutzen. -- Die nächste Alternative wäre ein Kernel-Modul. Auch nix für einen "Anfänger". Für "Echtzeit"-Protokolle in Software ist ein µC besser geeignet.
:
Bearbeitet durch User
andy_help schrieb: > es betrifft das Erstellen eines software uart Programms. Kein Problem für 300bps, praktisch unmöglich für 1MBps. Das ist, was du kapieren musst: man muß die Anforderungen festlegen, erst dann kann man herausfinden ob und ggf. wie es gehen könnte. Das kann doch nicht so schwer zu begreifen sein?
@ c-hater ... das war mir im vor hinein auch bewusst gewesen, dass es nur mit kleinen Bitraten was werden könnte, jedoch gibt es schon ein Projekt für den raspberry pi, mit der man sich eine software uart Schnittstelle auch mit 4800 bps erstellen kann. https://github.com/adrianomarto/soft_uart
Oliver S. schrieb: > Google ist eine Suchmaschine, die kennt sowas. > Und findet z.B. > https://www.mikrocontroller.net/articles/Hardwarenahe_Programmierung_am_Raspberry_Pi#Zeitmessung LOL mikrocontroller.net Links als Ergebnisse einer Google-Suche. Das ist noch ne Spur härter als Fragen mit heise-Links zu beantworten. Leute, bloß weil irgendwo im Netz jeder Schwachsinn mit noch mehr Schwachsinn beantwortet wird, heißt das nicht, dass man diesen Schwachsinn noch mal verlinken muss. c-hater schrieb: >> Ich müsste vom raspberry pi an einem Dateneingang Zeiten messen. > > Also unter Linux? Dann erst recht nicht. Wo steht in der Frage was von Linux? Raspberry Pi ist eine Hardware-Plattform. Sich die Fragen so zurechtzuinterpretieren, dass man innerhalb seines kleinen Tellerrandes sagen kann: "geht nicht", mag zwar für dich bequem sein, aber dann sei doch bitte so bequem, dass du in Zukunft gar nichts mehr irgendwo postest. Danke.
andy_help schrieb: > @ c-hater ... das war mir im vor hinein auch bewusst gewesen, dass es > nur mit kleinen Bitraten was werden könnte, jedoch gibt es schon ein > Projekt für den raspberry pi, mit der man sich eine software uart > Schnittstelle auch mit 4800 bps erstellen kann. > > https://github.com/adrianomarto/soft_uart Da steht doch alles drin. Flanke an Rx-Pin löst einen Interrupt aus, schnelle Timer sind auch zu sehen. Es ist zu sehen, wie man dem Kernel eine "tty" präsentiert, die einfach <impulsdauer><\n> gen lauschenden User-Prozess schicken könnte. Was bleibt ist gezieltes Ändern der Vorlage und durch Rückschläge durchbeißen. Das geht natürlich nicht auf usec genau, aber 4800Bd müssen ja auch auf 1/9600 s vermessen werden. Also 1/10 ms sollte gehen.
:
Bearbeitet durch User
Ein USB Uart Wandler kostet 10 Euro. https://www.reichelt.de/adapter-fuer-usb-uart-schnittstelle-pmodusbuart-digil-410-212-p243339.html Da schreibe ich doch keinen SW-Dekoder, wenn ich für einen 10er ein sicheres Verfahren bekomme. Denn sicher ist ein SW-Dekoder nie. Da braucht die SD-Karte etwas länger beim Zugriff, und schon habe ich ein Bit nicht mitbekommen. Diese Konverter verwende ich schon seit Jahren auf der Arbeit. Feine Geräte.
Man könnte auch mal in der Beschreibung zum Core schauen, wo der globale Timer liegt. Ich habe das mal für einen Arm a9 gemacht, indem ich den Speicherbereiche via MMAP in den Speicher des Prozesses eingebunden habe. Damit kann man wirklich genau Zeit messen. Vg
Und vielleicht noch zum Thema Echtzeit: aus meiner Erfahrung ist ein halbwegs aktueller Kernel (ohne preempt_rt Patch, aber schon mit einem generell preemtiven Kernel) schon relativ deterministisch und sollte für „normale“ Anwendungen reichen. Man muss dem Prozess Bzw den Threads dann aber schon hohe Prioritäten zuweisen und wissen was man tut.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.