mikrocontroller.net

Forum: Compiler & IDEs Stackpointer / Speicherbereich


Autor: Boris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Boris (Gast)
Datum:

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

Autor: Joerg Wunsch (Gast)
Datum:

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

Autor: Boris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Boris (Gast)
Datum:

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

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.