Forum: PC-Programmierung c++ timer raspberry pi


von andy_help (Gast)


Lesenswert?

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.

von Oliver S. (oliverso)


Lesenswert?

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
von Mikro 7. (mikro77)


Lesenswert?

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. :-)

von Rolf M. (rmagnus)


Lesenswert?

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.

von c-hater (Gast)


Lesenswert?

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.

von andy_help (Gast)


Lesenswert?

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.

von Mikro 7. (mikro77)


Lesenswert?

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
von c-hater (Gast)


Lesenswert?

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?

von andy_help (Gast)


Lesenswert?

@ 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

von c-lover (Gast)


Lesenswert?

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.

von Carl D. (jcw2)


Lesenswert?

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
von PittyJ (Gast)


Lesenswert?

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.

von Linux (Gast)


Lesenswert?

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

von Linux (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.