mikrocontroller.net

Forum: Compiler & IDEs Speicherplatz für Arrays???


Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Alle Zusammen

Beim Notepad werden mit dem GNU CC  doch immer am Ende die Zahlen für
den belegten Speicher erstllt. Was bedeuten diese Zahlen und was ist
zum Beispiel die Grenze für meinen Mega 32? Ich habe in einem Programm
nähmlich sehr große locale Arrays angelegt. Wenn ich sie verkleiner
läuft er nach dem programmieren super an. Sind sie aber in ihrer
benötigten Größe, dann ist schluss. Der MC stürtzt einfach ab. Bei
globalen Arrays weiß ich schon, dass sie im bss abgelegt werden und da
liegt die Grenze bei der Größe des vorhandenen RAM's oder?!? Wo werden
denn nun die Localen Arrays abgelegt? Wie kriege ich die unter, ohne den
MC abzuschmieren?? Klärt nen Dummen doch mal bitte auf :-).

MfG Marco

Autor: Malte Marwedel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also lokale arrays werden auch im Ram abgelegt, allerdings meines
wissens nur so lange, wie die entsprechnende Funktion abgearbeitet
wird. Meines wissens müssten sich zwei lokale arrays, die in
verschiendenen Funktionen sitzen sich den Speicherplatz "teilen"
können, solange sie nich die Eine in der Anderen aufgerufen wird o.ä.
Korrigiert mich bitte, wenn ich falsch liegen sollte.
Wenn ein Array also größer ist, als der Ram (abzüglich Stack und
anderer Variablen) muss entweder das Array kleiner werden oder du
brauchst mehr RAM...

Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oaky, also stürtzt mein Atmel also ab, weil die Arrays zu groß sind. Das
blöde ist ja, dass beim kompilieren nur globale Variablen größenmäßig
sofort erfaßt werden. Bekomme ich irgendwie raus, wann ich den RAM
ausreize?

Marco

Autor: Christof Krüger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kenne mich zwar nicht mit C mit AVRs aus, aber werden lokale Variablen
und Arrays nicht auf dem Stack abgelegt?

Du müsstest dir also anschauen, was die maximale Schachtelung der
Funktionsaufrufe bei dir ist und wie viele lokale Variablen und Arrays
jeweils benutzt werden. Das ganze aufaddieren, kräftig schütteln und
schauen, ob du mit dem Stack nicht vielleicht doch schon in den Bereich
von globalen Variablen rutschst (oft auch "Heap" genannt) oder gar den
ganzen SRAM zustapelst.

Autor: Marcus M (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

generell werden Array im Stack abgelegt, es sei denn man erzeugt sie
mit malloc() / new() in C++. Dann wird ein Zeiger im Stack belegt und
die Daten wandern in den Heap.
Der Vorteil dabei ist der, der Heap kann beliebig groß sein, sollange
das OS da mitspielt, der Stack hingegen ist generell eher bescheiden
mit IMHO max. 640kB.
Wie genau das jetzt im Atmel aussieht, ob der AVR-gcc überhaupt
zwischen Stack und Heap unterscheidet weiß ich nicht, da es IMHO in der
Havard Architektur einige Tricks gibt, wie man dem ganzen Speicherblock
und dem Programmblock besonders geschickt aufteilt und die Probkleme,
die die von Neumann Architektur hat etwas umschifft.
Ich würde Dir empfehlen, große Arrays entweder in das EPROm oder das
Flash zu verbannen. An letzteren Problem sitze ich derzeit selber.

Gruß Marcus

Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo wieder alle zusammen :-)

Was ist denn die Größe des Stacks? Wenn ich einen Mega32 habe, der ja
feste Speichergrößen besitzt, kann ich dann zum Beispiel die Größe des
Ram als Stäckgröße annehmen..oder wie komme ich auf den Platz für
Arrays? Irgendwie muß ich dass doch auch sehen können? Gibt es die
Möglichkeit unter AVR-Studio das Programm durchrattern zu lassen und zu
sehen, ob es klappt und wenn nicht, warum nicht? Ich würde mich dann
sogar dafür begeistern, mich mal in dieses Programm einzuarbeiten :-) .
 Und noch ne Frege nebenbei.. was macht man eigentlich mit diesem
Programm AVR-Inside? Ich habe versucht mal irgend  eine Datei damit zu
öffne... aber nix oder nur sehr wehnig passierte.

MfG Marco

Autor: Malte Marwedel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du keine globalen Variablen verwendest, kannst du die RAM Größe als
maximale Stackgröße annehmen. :-) Wieviel Speicher der Stack nun
verbraucht kommt darauf an, welche Stelle deines Programms gerade
abgearbeitet wird. Wenn du dein Programm im AVR Studio simulierst
kannst du die aktuelle Stack Größe ablesen. Über sonstige Tricks die
Stackgröße und Überschneiden des Stacks mit anderen Variablen
festzustellen wurde hier im Forum schon mehrfach geschrieben.

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.