Forum: Mikrocontroller und Digitale Elektronik RaspberryPi für intensive Berechnungen


von Toronto (Gast)


Lesenswert?

Hallo Leute,

momentan verwende ich einen STM32F4 (168MHz) für eine bestimmte 
Anwendung mit I2C, 2x USART, 5 PWMs,... (mit DMA unterstützung). 
Gleichzeitig muss ich relativ große Matrizen berechnen. Die 
Matrizen-Berechnungen laufen mit maximal 50Hz (ich benötige mehr als 
150Hz) mittels Interrupt. Dabei ist die MCU schon ziemlich am Anschlag.
Bin daher am Überlegen, ob ich die Berechnungen auf einen RaspberryPi 
auslagern soll und die MCUs über I2C kommunizieren lasse. Die 
Schnittstellen bleiben auf dem STM32F4.

Lohnt sich der Aufwand, sich in ein RPI einzuarbeiten bzw. wie hoch ist 
der Aufwand um ein C Code (inkl. I2C Low-Level) zum Laufen zu bekommen?
Kann ich die vorhandenen .c-Berechnungsfiles direkt auf den RPI 
übertragen?
Ist der Geschwindigkeitsvorteil dementsprechend hoch (168MHz zu 700Mhz) 
(Floatingpoint unterstützung) auch bezüglich von komplexeren 
Berechnungen?
Wie sieht das mit der Echtzeitfähigkeit aus, gibt es beim RPI auch 
Interrupts.

Danke schon mal im voraus!

Gruß,
Toronto

von nicht Gast (Gast)


Lesenswert?

Der pi ist natürlich echtzeitfähig und hat auch Interrupts. Aber nur 
Linux hört das schon wieder auf. Du brauchst ein Echtzeitbetriebssystem 
- keine Ahnung ob es das für das pi gibt.

Aber wenn du schon solche fragen stellt, solltest du eher erst deinen 
code optimieren bevor du so einen Aufwand betreibst. 
Matrizenmultiplikationen lassen sich z.b. stark optimieren.

von Toronto (Gast)


Lesenswert?

Die Matrizenberechnungen habe ich schon soweit vereinfacht und 
optimiert.
Ich denke aber auch an zusätzliche Berechnungen (z.B. nichtlineare 
Regler,...), die ich später gerne implementieren möchte (mit Luft nach 
oben, sozusagen).

von Andreas B. (andreasb)


Lesenswert?

Toronto schrieb:
> Hallo Leute,
>
> momentan verwende ich einen STM32F4 (168MHz) für eine bestimmte
> Anwendung mit I2C, 2x USART, 5 PWMs,... (mit DMA unterstützung).
> Gleichzeitig muss ich relativ große Matrizen berechnen. Die
> Matrizen-Berechnungen laufen mit maximal 50Hz (ich benötige mehr als
> 150Hz) mittels Interrupt. Dabei ist die MCU schon ziemlich am Anschlag.
> Bin daher am Überlegen, ob ich die Berechnungen auf einen RaspberryPi
> auslagern soll und die MCUs über I2C kommunizieren lasse. Die
> Schnittstellen bleiben auf dem STM32F4.
>
> Lohnt sich der Aufwand, sich in ein RPI einzuarbeiten bzw. wie hoch ist
> der Aufwand um ein C Code (inkl. I2C Low-Level) zum Laufen zu bekommen?

Unter Linux nicht besonders schwer.
http://www.mikrocontroller.net/articles/Raspberry_Pi#Der_I2C-Bus

Sollten einige Beispiele zu finden sein.

> Kann ich die vorhandenen .c-Berechnungsfiles direkt auf den RPI
> übertragen?

Wenn du sauberes C geschrieben hast sollte das kein Problem sein.

> Ist der Geschwindigkeitsvorteil dementsprechend hoch (168MHz zu 700Mhz)
> (Floatingpoint unterstützung) auch bezüglich von komplexeren
> Berechnungen?

Du wirst aufgrund des Betriebsystems einen Overhead haben, du kannst 
aber das Raspberry PI offiziell übertacketen (irgendwie bis 1 GHz, musst 
halt für die Kühlung sorgen)

> Wie sieht das mit der Echtzeitfähigkeit aus, gibt es beim RPI auch
> Interrupts.

Im Normalfall lässt man da ein Linux laufen, da gibts Interrupt nur bei 
Treibern.

Ansonsten musst du halt schauen was für ein OS du brauchen willst, gibt 
ja nicht nur Linux...

Ich würds einfach mal probieren, wenn nichts läuft ausser deinem Prozess 
und du etwas Performancereserven hast sollte das klappen, wenn du an die 
grenzen gehtst ist Linux sicher das falsche, weil nicht realtime fähig.

>
> Danke schon mal im voraus!
>
> Gruß,
> Toronto

von michael (Gast)


Lesenswert?

Schau dir mal das sama5 xplain board von atmel an, dazu gibt es zu jeder 
peripherie einen treiber und bsp. Das ohne linux laeuft. Nuttx oder den 
cortexa8 freertos port kannst du  1:1 drauf laufen lassen. Arduino 
kompatible shields kannst drauf montieren, ggf. Sparst dir den f4

von avr (Gast)


Lesenswert?

Andreas B. schrieb:
>> Kann ich die vorhandenen .c-Berechnungsfiles direkt auf den RPI
>> übertragen?
>
> Wenn du sauberes C geschrieben hast sollte das kein Problem sein.

Bis auf den nicht zu unterschätzenden Aufwand die beiden Controller zu 
verbinden.

>> Ist der Geschwindigkeitsvorteil dementsprechend hoch (168MHz zu 700Mhz)
>> (Floatingpoint unterstützung) auch bezüglich von komplexeren
>> Berechnungen?
>
> Du wirst aufgrund des Betriebsystems einen Overhead haben, du kannst
> aber das Raspberry PI offiziell übertacketen (irgendwie bis 1 GHz, musst
> halt für die Kühlung sorgen)

Davon sollte man die Finger lassen. Das Raspberry Pi neigt bei 
Übertaktung (ohne ck) zu Beschädigungen des Dateisystems auf der 
SD-Karte. Ein anderes Board wäre vielleicht sinnvoller, schließlich gibt 
es inzwischen genug Konkurrenz - auch mit mehr Dampf (Cubieboard, 
BeaglBoard Black,  OLinuXino; alle im gleichen Preissegment).

von Simon S. (-schumi-)


Lesenswert?

Toronto schrieb:
> Bin daher am Überlegen, ob ich die Berechnungen auf einen RaspberryPi
> auslagern soll und die MCUs über I2C kommunizieren lasse.

Noch eine Anmerkung dazu: Der Raspi hat Hardwaremäßig einen Bug beim 
ClockStretching des I2C-Busses (d.h. er lässt das Stretching nur zu 
bestimmten Zeitpunkten zu).

Wenn dein uC viel mit Interrupts beschäftigt ist kann er evtl. nicht 
immer schnell genug reagieren. Bei mir hat sich das darin geäußert, dass 
sich der Bus aufgehangen hat - hätte mich bald zur Weisglut getrieben.. 
Jetzt ist ein I2cTinyUsb (I2C <-> USB) dran, was zwar gut aber langsamer 
funktioniert.

von Grundschüler (Gast)


Lesenswert?


von Toronto (Gast)


Lesenswert?

Ich denke, dass ich es mal mit einem RaspberryPi versuchen sollte. Das 
Preis/Leistubgsverhältnis ist einfach zu gut.
Zudem gibts ja viele Dokus und Code-Schnipsel, die ich verwenden könnte 
(Falls nicht einer von euch so etwas schon mal geschreieben hat und mir 
netterweise zur Verfügung stellen würde :) )

von Micha H. (mlh) Benutzerseite


Lesenswert?

avr schrieb:

> Davon sollte man die Finger lassen. Das Raspberry Pi neigt bei
> Übertaktung (ohne ck) zu Beschädigungen des Dateisystems auf der
> SD-Karte.

Diese Information ist längst veraltet. Mit aktueller Firmware kann mit 
jeder im RPi funktionierenden SD-Karte gearbeitet werden.
Mein RasPi läuft seit über einem Jahr mit 950MHz.

Quelle u.a.:
http://elinux.org/RPiconfig#SD_card_usage_with_overclocking

von Karl H. (kbuchegg)


Lesenswert?

So recht will mir noch nicht in den Schädel, dass es sinnvoll ist, wegen 
ein paar Matrizenrechnungen eine I2C Kommunikation einzuführen um die 
Berechnung auf einen anderen Compi auszulagern. Der ganze I2C Teil 
frisst dir die Performance doch wieder auf, die du durch die Auslagerung 
auf den Pi gewonnen  hast.

Ehe ich das endgültig einbaue, würde ich da mal ein paar rigorose Tests 
zum Thema I2C machen um abschätzen zu können, wieviel Zeit da für die 
Übertragung  selbst drauf geht. Und dann darf man ja auch nicht 
vergessen, dass der Einbau der Kommunikationsroutinen ins Gesamtsystem 
ja auch nicht einfach nach dem Muster 'passt schon irgendwie' 
funktioniert.
Für mich sieht die ganze Idee nach einer Variante von 'Oooch, da werfen 
wir einfach 2 Prozessoren auf das Problem, dann kriegen wir eine
Halbierung der Rechenzeit und dann passt das schon'. Naiv gedacht und 
geht in der Praxis meistens schief, weil der ganze Themenkomplex 
'Kommunikation und Synchronisierung' erst mal ignoriert wird und sich 
hinterher immer wieder als massiver Stolperstein entpuppt.

: Bearbeitet durch User
von Der Troll (Gast)


Lesenswert?

Berechnungen in einem Interrupt ? Ist ein klares no-go. Ganz schlechter 
Stil.

von 132 (Gast)


Lesenswert?

Toronto schrieb:
> momentan verwende ich einen STM32F4 (168MHz) für eine bestimmte
> Anwendung mit I2C, 2x USART, 5 PWMs,... (mit DMA unterstützung).
> Gleichzeitig muss ich relativ große Matrizen berechnen. Die
> Matrizen-Berechnungen laufen mit maximal 50Hz (ich benötige mehr als
> 150Hz) mittels Interrupt. Dabei ist die MCU schon ziemlich am Anschlag.
> Bin daher am Überlegen, ob ich die Berechnungen auf einen RaspberryPi
> auslagern soll und die MCUs über I2C kommunizieren lasse. Die
> Schnittstellen bleiben auf dem STM32F4.

Das Zauberwort dazu heißt DSP
Genau für das sind DSPs gemacht. Also such dir einen vernünftigen DSP 
und mach keinen Schrott mit RPi oder sonst irgendwelchem Spielzeug.

von Εrnst B. (ernst)


Lesenswert?

132 schrieb:
> Also such dir einen vernünftigen DSP
> und mach keinen Schrott mit RPi oder sonst irgendwelchem Spielzeug.

Als Mittelweg, lohnt aber nur für "größeres": Ti OMAP.

Schneller Arm (Multicore) mit integriertem DSP, direkte Kommunikation 
über Shared-Memory IIRC.

Problem: Bei den kleineren OMAP3 war noch ein DSP aus der TMS320 - Serie 
integriert, für den gab es Doku+Compiler.

Bei den stärkeren OMAPs (4,5) gibts Details zum DSP nur gegen NDA...

von avr (Gast)


Lesenswert?

Micha H. schrieb:
> iese Information ist längst veraltet. Mit aktueller Firmware kann mit
> jeder im RPi funktionierenden SD-Karte gearbeitet werden.
> Mein RasPi läuft seit über einem Jahr mit 950MHz.
>
> Quelle u.a.:
> http://elinux.org/RPiconfig#SD_card_usage_with_overclocking

das wusste ich noch nicht. Meiner läuft bis auf einige Tests am Anfang 
und 700 Mhz. Beim Übertakten hat es damals nur wenige Tage gedauert bis 
man das OS neu aufsetzen durfte. Auf 900+ Mhz sollte man sich übrigens 
auch nicht verlassen. Bei mir wird das System schon zwischen 800 und 850 
Mhz instabil. Auch mit erhöter Spannung.

von Toronto (Gast)


Lesenswert?

>So recht will mir noch nicht in den Schädel, dass es sinnvoll ist, wegen
>ein paar Matrizenrechnungen eine I2C Kommunikation einzuführen um die
>Berechnung auf einen anderen Compi auszulagern

Naja, das sind schon Matrizen in der Größenordnung von 23x23 (529 
Elemente), wobei ich insgesamt 7 Stück davon habe, die verrechnet werden 
müssen. Das ist auch noch die vereinfachte Ausführung. Mit dem 
benötigten Berechnungszyklus (>150Hz) komme ich mit dem STM32 nicht mehr 
ganz hinterher, zudem müssen noch die Schnittstellen bedient werden.
Außerdem hatte ich bei ein paar mehr Variablen einen Stackoverflow.
Für zusätzliche Berechnungen sollte auch noch Platz sein.


>Ehe ich das endgültig einbaue, würde ich da mal ein paar rigorose Tests
>zum Thema I2C machen um abschätzen zu können, wieviel Zeit da für die
>Übertragung  selbst drauf geht
Letztendlich muss ich nur ein paar wenige Bytes auf den STM32 bringen 
(Ergebnis der Berechnungen) und umgekehrt (Sensordaten). Auf dem STM32 
läuft die I2C über den DMA Controller, da sollten keine Schwierigkeiten 
auftreten.


>Berechnungen in einem Interrupt ? Ist ein klares no-go. Ganz schlechter
>Stil.
Tut mir leid, aber das ist doch totaler quatsch. Ich brauche eine 
konstante Abtastzeit für die Berechnungen, wo soll die denn sonst her 
kommen.


>Das Zauberwort dazu heißt DSP
Ich weiß, dass es durchaus leistungsfähigere und schnellere und 
sparsamere und kleinere... MCUs gibt, aber ich wollte ein weit 
verbreitetes Board verwenden, welches nicht meinen Kostenrahmen sprengt 
und reichlich Dokus und Beispiele vorhanden sind, sodass ich nicht 
mühsam alles von neu aufbauen muss.


Bezüglich Interrupt auf dem RPI:
Kann ich den RPI als I2C Slave definieren und mit dem STM32 dann 
zyklisch den RPI abfragen bzw. Daten senden?

von Micha H. (mlh) Benutzerseite


Lesenswert?

avr schrieb:
> Meiner läuft bis auf einige Tests am Anfang
> und 700 Mhz. Beim Übertakten hat es damals nur wenige Tage gedauert bis
> man das OS neu aufsetzen durfte. Auf 900+ Mhz sollte man sich übrigens
> auch nicht verlassen. Bei mir wird das System schon zwischen 800 und 850
> Mhz instabil.

Mach aktuelle Firmware drauf: <rpi-update>
Geht vollautomatisch und anschließend hat sich das mit den Problemen 
beim übertakten erledigt.

von Konrad S. (maybee)


Lesenswert?

Toronto schrieb:
> Naja, das sind schon Matrizen in der Größenordnung von 23x23 (529
> Elemente), wobei ich insgesamt 7 Stück davon habe, die verrechnet werden
> müssen.

Toronto schrieb:
> Letztendlich muss ich nur ein paar wenige Bytes auf den STM32 bringen
> (Ergebnis der Berechnungen) und umgekehrt (Sensordaten).

Bist du dir sicher, dass du die Matrizen jedesmal vollständig neu 
berechnen musst?

von Toronto (Gast)


Lesenswert?

Ich habe schon einzelne Matrizen-Elemente zu null gesetzt. Das führt 
aber zu einem schlechteren Systemverhalten.

von Mike (Gast)


Lesenswert?

Toronto schrieb:
> Tut mir leid, aber das ist doch totaler quatsch. Ich brauche eine
> konstante Abtastzeit für die Berechnungen, wo soll die denn sonst her
> kommen.

Abtasten und Rechnen sind Zweierlei. Im Interrupt kannst du ein Flag 
setzen und der Rest hat da nichts zu suchen.

von Konrad S. (maybee)


Lesenswert?

Und durch einen neuen Sensordaten-Satz müssen jeweils alle Zeilen und 
Spalten aller Matrizen neu berechnet/verrechnet werden? Oder machst das 
nur, weil ein lustiges Formelwerk das so vorzusehen scheint? Zuweilen 
kann man sich durch Analyse der Abhängigkeiten Teile der Berechnung 
sparen.

von Falk B. (falk)


Lesenswert?

@ Toronto (Gast)

>Ich habe schon einzelne Matrizen-Elemente zu null gesetzt. Das führt
>aber zu einem schlechteren Systemverhalten.

Wie das? Eine Multiplikation ist eine Multiplikation und dauert 
unabhängig von den Eingangsgrößen immer gleich lang.

Ich behaupte mal, mit der "Methode des scharfen Blicks" bekommt man die 
Anwendung auch auf dem F4 ausreichend schnell zum Laufen.

Was für Sensordaten müssen den mit 150 Hz in 23x23 Matritzen gepresst 
werden? Ist die Hardware-FPU WIRKLICH in Benutzung? Nicht dass aus 
Versehen das in Software emuliert wird.

Welche Messungen bezüglich der Leistung der aktuellen Funktionen hast du 
gemacht?

von Toronto (Gast)


Lesenswert?

Die Matrizen müssen bei jedem Schritt neu berechnet werden (-> 
Kalmanfilter mit Zustandsregler). Wie geschrieben, ich habe viele 
Elemente schon zu null/eins gesetzt.


>Abtasten und Rechnen sind Zweierlei. Im Interrupt kannst du ein Flag
>setzen und der Rest hat da nichts zu suchen.
Solange ich die maximale Rechenzeit für den Interrupt nicht verletze, 
kann ich doch alles in den Interrupt reinschreiben. Über die Prio kann 
ich zudem steuern, welches Interrupt (Berechnung, Schnittstellen, ...) 
Vorrang hat.


Danke für eure Vorschläge und Anregungen, ich wollte mich allerdings 
über den RPI informieren, wie einfach dieser Hand zu haben und wie 
schnell dieser wirklich ist.

von Toronto (Gast)


Lesenswert?

>Wie das? Eine Multiplikation ist eine Multiplikation und dauert
>unabhängig von den Eingangsgrößen immer gleich lang.
Dadurch, dass einige Elemente zu null gesetzt werden, entfallen 
bestimmte Rechenoperationen bzw. Terme. Wenn das Element etwas über null 
ist, wird der Term trotzdem berechnet und nimmt dadurch Zeit in 
Anspruch.

>Was für Sensordaten müssen den mit 150 Hz in 23x23 Matritzen gepresst
>werden? Ist die Hardware-FPU WIRKLICH in Benutzung? Nicht dass aus
>Versehen das in Software emuliert wird.
Die FPU (hard) ist tatsächlich aktiv, sonst hätte ich keine Chance bei 
ca. 50Hz.
Die Sensordaten umfassen hauptsächlich Beschleunigungen, Drehraten, 
GPS-Daten, Magnometer-Daten, Barometer und Temperatur.

von Falk B. (falk)


Lesenswert?

@Toronto (Gast)

>Dadurch, dass einige Elemente zu null gesetzt werden, entfallen
>bestimmte Rechenoperationen bzw. Terme. Wenn das Element etwas über null
>ist, wird der Term trotzdem berechnet und nimmt dadurch Zeit in
>Anspruch.

Ja und? Warum bringt das dann "schlechteres Systemverhalten" ?
Meinst du deinen Regler? Oder dein Timing der Funktionen?

>Die Sensordaten umfassen hauptsächlich Beschleunigungen, Drehraten,
>GPS-Daten, Magnometer-Daten, Barometer und Temperatur.

Klingt nach Quadrocopter & Co. GPS, Magnetometer, barometer und 
Temperatur muss man sicher nicht mit 150 Hz lesen und verrechnen. Bleibt 
der Rest.
Hmm.

von Konrad S. (maybee)


Lesenswert?

Toronto schrieb:
> ich wollte mich allerdings
> über den RPI informieren, wie einfach dieser Hand zu haben und wie
> schnell dieser wirklich ist.

Mit einem Ein-Kern-Linux und Echtzeitverhalten ist das so eine Sache ...

Bei einem Zweikerner kannst du einen Prozess in die Realtime-Priorität 
schieben und bekommst da die volle Rechenleistung ohne jede 
Unterbrechung und der Rest vom Linux funktioniert immer noch problemlos.

von Frank K. (fchk)


Lesenswert?

Toronto schrieb:

>>Das Zauberwort dazu heißt DSP
> Ich weiß, dass es durchaus leistungsfähigere und schnellere und
> sparsamere und kleinere... MCUs gibt, aber ich wollte ein weit
> verbreitetes Board verwenden, welches nicht meinen Kostenrahmen sprengt
> und reichlich Dokus und Beispiele vorhanden sind, sodass ich nicht
> mühsam alles von neu aufbauen muss.

Dann nimm das:
http://hardkernel.com/main/main.php

+ 4 Cores statt einem
+ Cortex A9 statt ARM11
+ 1.7 GHz statt 700 MHz
+ 2GB RAM statt 256/512k

Bekommst Du hier:
http://www.pollin.de/shop/suchergebnis.html?S_TEXT=odroid&log=internal

fchk

von tuel (Gast)


Lesenswert?

Toronto schrieb:
> Hallo Leute,
>
> momentan verwende ich einen STM32F4 (168MHz) für eine bestimmte
> Anwendung mit I2C, 2x USART, 5 PWMs,... (mit DMA unterstützung).
> Gleichzeitig muss ich relativ große Matrizen berechnen. Die
> Matrizen-Berechnungen laufen mit maximal 50Hz (ich benötige mehr als
> 150Hz) mittels Interrupt. Dabei ist die MCU schon ziemlich am Anschlag.
> Bin daher am Überlegen, ob ich die Berechnungen auf einen RaspberryPi
> auslagern soll und die MCUs über I2C kommunizieren lasse. Die
> Schnittstellen bleiben auf dem STM32F4.

Beaglebone wäre noch eine Möglichkeit, schnelle FPU, PWM ist dabei, UART 
mehrfach und Pruss kann Echtzeit. Hängt aber von der Anwendung ab.

von Ingo (Gast)


Lesenswert?

oder evtl. Banana-Pi, aber recht teuer ...

Gruss, Ingo.

von cc (Gast)


Lesenswert?

Dies sind doch nur 13 Mio Instructions je Sekunde, wobei diese 4 clock
dauern, also 54 clocks, dies ist 1/3 der verfuegbaren Leistung.

von Kaj (Gast)


Lesenswert?

da die board empfehlungen hier eh querbeet laufen werf ich mal noch n 
fpga in den raum: 
http://www.heise.de/hardware-hacks/meldung/Papilio-Duo-100-Dollar-Power-Arduino-mit-FPGA-2216018.html

Alternativ noch:
Riotboard, Wandboard, Cubietruck, Udoo, BeagleBoneBlack, Intel 
Galileo(http://www.exp-tech.de/Mainboards/Arduino/Intel-Galileo.html) 
oder was auch immer...

Und warum überhaupt I²C? Solange du den I²C-Bus nicht mindestens mit 
400kbit/s betreibst würde ich uart immer vorziehen.

Toronto schrieb:
> Das Preis/Leistubgsverhältnis ist einfach zu gut.
Nö, das täuscht.
Für das Geld was du für den RPi ausgibst würd ich mir lieber noch 2-3 
STM32F4-Discovery-Boards kaufen und die Berechnungen darauf verteilen..

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.