Globales 3D-Array für Sensordaten

Gast #1426836
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
#1426968
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.)
Gast #1427173
>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.
#1427243
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.)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.