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
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.
Hallo Joerg vieln Dank für die Tips. Werd mal sehen was ich an Variablen einsparen kann. Gruß Boris
Denk auch dran, daß Strings wie "foo bar" ohne besondere Deklaration auch Variablenspeicher belegen.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.