PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ATMega128 Stack Initialisierung



sast
03.12.2008, 08:54
Hi,

bisher habe ich mich relativ wenig um die Speicherverwaltung in meinem ATMega 128 gekümmert, da der Platz für Variablen, Heap und Stack immer ausgereicht hatte. Nun war aber der Fall eingetreten, dass der Stack in den Variablenbereich hinein gelaufen ist. Somit gibt es jetzt Handlungsbedarf.

Habe die Daten jetzt noch mal soweit zusammengekürzt, dass ich bei einem SRAM Start von 256 auf einen Heapstart von 2370 komme. der Stackpointer steht aber nach Programmstart schon bei 2531, was bei 4096Byte SRAM doch nur bedeuten kann, dass der Stack nicht ganz am Ende beginnt.

Nun meine Frage. Warum steht der Stack mitten im SRAM und kann ich ihn nach hinten verschieben?

Ich verwende den avr-gcc zum kompilieren.

Danke

sast

PicNick
03.12.2008, 16:24
Schau mal da, vielleicht kannst du da Weisheiten entnehmen.
https://www.roboternetz.de/wissen/index.php/Speicherverbrauch_bestimmen_mit_avr-gcc#Dynamischer_RAM-Verbrauch

sternst
03.12.2008, 16:38
der Stackpointer steht aber nach Programmstart schon bei 2531, was bei 4096Byte SRAM doch nur bedeuten kann, dass der Stack nicht ganz am Ende beginnt.

Sehr viel wahrscheinlicher ist, dass entweder
A) du größere lokale Variablen in main hast, oder
B) deine Methode zum ermitteln der aktuellen Stackposition fehlerhaft ist.

sast
03.12.2008, 17:21
Danke erst mal für die Antworten

@PicNick
genau mit diesen Methoden ermittle ich mir den RAM-Verbrauch

@sternst
zu B) siehe oben
zu A) was meinst du mit größere lokale Variablen in main? Wie gesagt sind bereits 2370-256=2114 Byte in .data
Hab mir den Bereich hinter dem Stack mal angesehen. Da stehen dann Strings drin, die ich beim initialisieren meines Touchpanels verwende. So als ob der Controller damit arbeitet. Weiß leider nicht ob das so korrekt ist. Ich hatte das so verstanden, dass der Stack am Ende des SRAM beginnen sollte und in Richtung Heap wächst.

sast

sternst
03.12.2008, 17:57
was meinst du mit größere lokale Variablen in main?Wie gesagt sind bereits 2370-256=2114 Byte in .data
Wenn du nicht weißt, was eine lokale Variable ist, oder dass diese nicht im Data-Segment stehen, ist das ja schon mal kein gutes Zeichen. Poste doch mal den Code von main.

sast
04.12.2008, 06:41
Hi Stefan,

den Code von main kann ich leider nicht posten.
Ich weiß schon was lokale Variablen sind. Das bezog sich auch eher auf dein "größere".
Und nein, ich wußte bisher nicht, das die Variablen von main nicht im data Segment stehen. Wo stehen die denn dann?

EDIT: Oder anders gefragt was steht denn dann im Data Segment, denn wenn ich zum Beispiel Datentypen in Strukturen von 16 bit auf 8 bit gekürzt habe nahm der Speicherbedarf im SRAM ab.
Hab nochmal in dem Link von PicNick gestöbert und verstehe jetzt, glaube ich, worauf du hinaus willst. Die main ist auch nur eine Funktion und wird also im Stack nicht anders behandelt.

sast

oberallgeier
04.12.2008, 08:17
Hi, sast,

in Deinem subdirectory "default" stehen so Dateien wie *.map und *.lls. Erstere dürfte für Dich wohl sehr interessant sein - informativ sind die beiden IMMER!

sast
04.12.2008, 09:42
Hi Joe,

ja da bin ich schon dran. Danke!

Ist vielleicht ganz gut das mal ein Ausreißer aufgetreten ist, dann ist man gezwungen sich genauer mit den Eigenheiten von µC und Compiler zu beschäftigen. Am Rechner kann man ja heutzutage reinmeiseln was man will, da sind immer noch Ressourcen da. (Außer man gibt den Speicher nicht wieder frei ;-)).

Hab jetzt mal ein paar structs aus der main genommen und siehe ist zwar data zu 92% voll aber der Stack bleibt viel kleiner. Dank an dich Stefan und an PicNick für den Anschubser.

sast

sternst
04.12.2008, 09:56
Hab mir den Bereich hinter dem Stack mal angesehen. Da stehen dann Strings drin, die ich beim initialisieren meines Touchpanels verwende.

Und beschäftige dich mal mit dem Thema "Strings im Flash". Sieht nämlich für mich so aus, als ob du das meiste deines SRAM mit Strings verschwendest, die dort gar nicht zu stehen brauchen (egal ob nun Stack oder Data).

sast
04.12.2008, 10:13
du meinst sicher die progmem geschichte, da bin ich auch dran

sast

oberallgeier
04.12.2008, 12:04
Ist nicht ganz OT, hilft leider auch nicht weiter. Aber - lest selbst. Es ist Wochen her, ich versuche einen Tiny2313 ein LCD ans Bein (an die Beinchen) zu binden. Läuft prima. Nun also gleich eine kurze Erweiterung: er soll RS232(TTL)-Input aufs LCD ausgeben.

Und das läuft nicht und läuft nicht. Code geändert und geändert. Gegrübelt - es ging stundenlang, sogar mehrere Abende. Schließlich schau ich kurz auf die "build"-Kommentare im AVRStudio. Noch mehr grübel: wieso steht hier


(.text + .data + .bootloader)

Data: 192 bytes (150% Full)
(.data + .bss + .noinit)

Build succeeded with 0 Warnings...
Mich hatte halt immer nur die letzte Zeile interessiert . . . Kaum ging ich der Sache auf den Grund, konnte ich Data auf < 128 bringen *ggggg*.