Forum: Compiler & IDEs Stackpointer / Speicherbereich


von Boris (Gast)


Lesenswert?

Hallo Leute,
ich habe einige Fragen zum Stack.
1. Muß der Stackpointer zu Programmbeginn initialisiert werden? Wenn ich 
mein Prg simmuliere wird der SP schon auf das Speicherende gesetzt 
(0x025F beim 8515) ohne das ich dies explizit angebe.
2. Wie kann ich den Speicherbereich eine Var beeinflussen?
"volatile unsigned char x" wird im SRAM bei 0x0245 angelegt, zumindest 
in der Simulation). nach einigen ms steht der Stackpointer nun so hoch 
das x überschrieben wird? Oder kann ich eine STACK-Größe definieren so 
das in diesem Bereich keine Var. angelegt werden?

Vielen Dank
Gruß Boris

von Joerg Wunsch (Gast)


Lesenswert?

1.) Die Bibliothek kümmert sich um die Initialisierung.

2.) Wenn Du eine Kollision zwischen Stack und Variablen hast,
dann paßt einfach beides nicht mehr.  Du kannst dann nur noch
zusehen, daß Du an einem von beiden sparen kannst.  Standardmäßig
werden die Variablen von unten aufsteigend in den RAM sortiert,
der Stack wächst vom oberen Ende abwärts.  Wenn eine Variable
also schon bei 0x245 landet, dann haben Deine Variablen fast
den gesamten RAM aufgefressen.

Auf die Simulationsdaten würde ich mich nicht verlassen, nimm
lieber »avr-nm -n dateiname.elf« und suche dort.  Dabei ist zu
beachten, daß aus technischen Gründen alle Symbole im RAM-Bereich
einen Offset von 0x800000 haben, den kannst Du also gedanklich
abziehen.

von Boris (Gast)


Lesenswert?

Hallo Joerg
vieln Dank für die Tips. Werd mal sehen was ich an Variablen einsparen 
kann.
Gruß Boris

von Joerg Wunsch (Gast)


Lesenswert?

Denk auch dran, daß Strings wie "foo bar" ohne besondere
Deklaration auch Variablenspeicher belegen.

von Boris (Gast)


Lesenswert?

Hallo Joerg,
hab jetzt avr-nm -n ausprobiert. Leider finde ich keine Hilfedatei zu 
dem Tool noch hilft /? weiter.
Auch in "avr-libc-user-manual.pdf" sind keine Infos. Kannst Du mir sagen 
ob es eine Hilfe gibt?
Es sieht aber so aus als wäre mein RAM randvoll. Alle meine Funktionen 
erscheinen mit "T", die unsigend char
mit einem "B" und die shorts mit "D". Dazu noch jede Menge andere 
Ausgaben. Das ganze endet dann bei der Adresse
0x0247.
Kann ich in C die sections festlegen? Hat das Sinn?

Besten Dank
Gruß Boris

von Joerg Wunsch (Gast)


Lesenswert?

Es gibt ein Manual zu nm, aber das hilft Dir sicher auch nicht
viel weiter.

Eine Kurzhilfe bekommst Du mit avr-nm -?, aber auch diese wird
Dir sicher nicht so viel weiterhelfen, da sie nur die Optionen
erklärt.

Vielleicht sollte ich mal die folgende Erklärung irgendwo in
der avr-libc Doku mit aufnehmen.

Die Buchstaben bezeichnen die section, zu der das Symbol gehört.
d ist .data, t ist .text, b ist .bss.  a wäre ein absolutes
Symbol (ein Registername zum Beispiel, hier weniger interessant),
w ein `weak' Symbol.  (Die memory sections selbst sind in der
avr-libc Doku beschrieben.)

Großbuchstaben beschreiben globale Symbole (die also in mehreren
Quelldateien zugreifbar sind), Kleinbuchstaben sind modul-lokale
Symbole (in C also Dinge, die auf globaler Ebene mit dem Wort
`static' markiert worden sind).  `weak' nennt man ein globales
Symbol, das in einer Bibliothek definiert ist, aber von der
Applikation überschrieben werden kann, indem sie selbst eins
definiert.  Nicht `weak' globale Symbole würden in solch einem
Falle einen `duplicate defined' Fehler bringen.

Da, wie schon geschrieben, .data und .bss einen Offset von
0x800000 haben, stehen sie bei avr-nm -n hintendran.

Du kannst in C eigene sections festlegen, siehe Doku.  Aber
ich weiß nicht, warum Du das willst -- Dein Problem wird das
gewiß nicht lösen.  Du mußt vielmehr analysieren, welche
Deiner Variablen so viel Platz brauchen.

Irgendwo gibt's noch ein Tool namens avr-sizex, das soll wohl
auch die Größe der Objekte mit ausgeben können.  Die Größe
kann man aus der Differenz zum nächsten Objekt selbst ausrechnen.

Alternativ schau Dir mal an, wie das mit avr-nm --size-sort
aussieht, das macht die Berechnung für Dich.

von Boris (Gast)


Lesenswert?

Vielen Dank!
Werd mir die Sache nochmal genau ansehen. Ich kamm bestimmt noch das ein 
oder andere wegoptimieren1
Gruß Boris

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.