www.mikrocontroller.net

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


Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.)

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.)

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Hilfe!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.