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
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.)
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.
>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.
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.)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.