Forum: Compiler & IDEs Globales 3D-Array für Sensordaten


von Daniel (Gast)


Lesenswert?

Grüß Gott zusammmen!

An einen Microcontroller (MSP430) ist ein Sensor angeschlossen. Beim 
auslesen des Sensors bekomme ich 20x20 16bit Daten. Um diese Daten auch 
bei aufwändigeren Rechenoperationen zeitlich unkritisch verarbeiten zu 
können, schwebt mir folgende Lösung vor:

Anlegen eines Arrays mit 3 "Seiten" mit jeweils einer 20x20 Matrize 
(insgesamt also 2400 Bytes). Diese 3 Seiten dienen mir als Ringbuffer: 
Mit jedem Datum vom Sensor wird ein Interrupt ausgelöst, die Matrix wird 
gefüllt. Ist eine Seite voll, werden diese ausgewertet. Dafür habe ich 
zwei weitere Seiten lang Zeit.

Ich habe 4kB RAM. Darin ist der Stack und der Heap untergebracht, die 
sich jeweils entgegenwachsen. Standardmäßig ist der Stack 80 Bytes groß, 
in der Entwicklungsumgebung erweiterbar (vermutlich bis zur Maximalgröße 
des RAMs). Lege ich die Variable global an, kommt das Array in den Teil 
des RAMs, in dem NICHT der Stack steht (ist das gleichzeitig der 
Heap?!). Lege ich es lokal an, würde es in den Stack kommen. Mit malloc 
(C) oder new (C++) kommts auf den Heap. Da ich das Array immer benötige, 
wird der Speicher nicht mehr freigegeben, so kommt es auch nicht zu 
einer nervigen Segmentierung im RAM.

Ich würde es jetzt global anlegen und über (ebenfalls globale) Zähler 
die jeweiligen Indizes ansprechen.

Sonderlich elegant ist das nicht, zumal globale Variablen kein guter 
Stil sind. Die Sache mit dem Stack (vergrößern und dort ablegen) 
schließe ich von vornherein aus.

Wie würdet ihr das lösen?

Vielen dank für's lesen und für eure Tipps und Ratschläge.
Daniel

von Klaus W. (mfgkw)


Lesenswert?

Global ist in dem Fall genehmigt.

In der Tat gilt global als kritikwürdig, aber bei relativ großen
Feldern auf einem MC ist es oft die beste Lösung.
(Böse ist es, Variablen unnötig global zu machen vor allem
bei größeren Programmen, die dann aber eher nicht auf einem
Controller zu finden sind.)

von Klaus W. (mfgkw)


Lesenswert?

Globale Variablen liegen übrigens nicht im Heap.
Neben dem statischen Speicher (lokale static-Variablen sowie
globale Variablen) wird der verbliebene Rest Speicher für
Heap und Stack verwendet.

von Daniel (Gast)


Lesenswert?

>Global ist in dem Fall genehmigt

Danke ;-)
Ist dann das Zugreifen über den Index in Ordnung oder macht man das über 
einen Zeiger auf's Array. Der Zeiger macht beim 3D-Array aber bestimmt 
wenig Spaß, oder? Ich wüsste jetzt auf Anhieb gar nicht, wie ich das 
machen sollte.

Wenn ich das über den Index mache, müssen die Zählervariablen hierfür ja 
ebenfalls global sein, weil nach dem Rücksprung aus dem Interrupt die 
Werte verloren gehen würden.

von Klaus W. (mfgkw)


Lesenswert?

Ob Zeiger oder Index: wie du es für besser/verständlicher hältst.
Beides ist legitim. Mit Index oft besser lesbar, mit Zeiger
gelegentlich schneller (wenn der Compiler nicht optimiert und eh
der gleiche Code rauskommt).

Bei einem globalen Index musst du aber trotzdem auch zusehen, ob es
mit dem Interrupt kollidiert.

(Zeiger muß man natürlich nehmen, um zu demonstrieren, was man alles
so kann.)

von Daniel (Gast)


Lesenswert?

Danke für die Hilfe!

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.