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


von Marco (Gast)


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

von Malte Marwedel (Gast)


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...

von Marco (Gast)


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

von Christof Krüger (Gast)


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.

von Marcus M (Gast)


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

von Marco (Gast)


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

von Malte Marwedel (Gast)


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.

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.