mikrocontroller.net

Forum: Compiler & IDEs AVR-GCC Stack-Bedarf ermitteln


Autor: ARM-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi zusammen!

Sagt mal, gibts beim (AVR-)GCC eine Möglichkeit, den (maximalen)
Stackbedarf seines Programms statisch analysieren zu lassen.

Mein Keil+Realview für ARM kann das.

Die Sache ist die: Werkele grad nebenbei noch mit nem AVR
und FreeRTOS herum und habe grad mal feststellen müssen,
dass mein Programm irgenwann anfing total herumzuzicken oder
sich gleich zu resetten, wenn ich einem Task noch etwas
Code (und lokale Variablen) hinzugefügt hatte. Durch Anpassung
der Stackgröße für die Tasks liefs dann wieder. Aber irgendwie
ist mir das ein bisschen zu gewagt einfach nur irgendeine
Hausnummer für den Stack anzugeben.

Wie wäre denn mal die analytische Herangehensweise?

Danke und Gruß, Frank

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Erfassung des benötigten Stackbedarfs ist nicht so einfach. Eine 
Möglichkeit, vorausgesetzt das MAP-File liefert die RAM-Adressen des 
Stackbereichs (Prozessorstack (C-Stack) bzw. Interruptstack (I-Stack)), 
wäre das Beschreiben der letzten 8 Bytes des Stacks mit definierten 
Werten, z.B. 8* 0xAA. Nach x-Stunden/Tagen werden die Speicherzellen 
ausgelesen und auf Veränderung der manipulierten Speicherzellen geprüft, 
dies kann zum einen via Schnittstelle bzw. EEPROM Speicher erfolgen. 
Ergbnis : Sind die manipulierten Bytes verändert, könnte der Stack zu 
klein sein. Daher, zuerst einen "sehr" großen Stack wählen und diesen 
schrittweise verringern. Leider bietet das Map-File des WinAVR´s keine 
Angabe des RAM-Bereiches des Stacks. Hierfür muss man schon den 
IAR-Compiler benutzen.

Autor: ARM-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber wie komme ich denn mal zu ner groben Abschätzung?
Was wandert denn alles so auf den Stack?

Rücksprungadressen.. also Tiefe der Unterpgrammaufrufe ist zu bedenken.
Wie ists mit lokalen Variablen im Task und in den aufgerufenen Unterfkt?
Noch was? Und wieviel geht da jeweils drauf?

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Rücksprungadressen.. also Tiefe der Unterpgrammaufrufe ist zu bedenken.

Ja.

> Wie ists mit lokalen Variablen im Task und in den aufgerufenen
> Unterfkt?

Die auch, sofern sie nicht static sind.

> Noch was?

Register, die innerhalb der Funktion gesichert werden müssen, weil sie 
temporär für etwas verwendet werden und nachher wieder den alten Wert 
brauchen. Außerdem muß man an Interrupt-Routinen denken, die zusätzlich 
an jedem Punkt zuschlagen können und alle benötigten Register und das 
SREG zwischendurch auf den Stack speichern. Und da du FreeRTOS erwähnt 
hast: Das speichert meines Wissens den Kontext auch auf dem Task-Stack, 
was wohl so ca. 35 Bytes sein dürften.

> Und wieviel geht da jeweils drauf?

Eine Rücksprungadresse ist je nach Prozessor 2 oder 3 Bytes groß. Die 
lokalen Variablen brauchen halt soviele Bytes wie deren Datentyp groß 
ist.

Autor: ARM-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dankeschön! Dann fang ich mal an zu rechnen ;-)

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im generierten Assemblercode (Achtung!, das ist nicht das
Disassemblerlisting, das du gemeinhin als .lss bekommst) steht
die Größe des jeweiligen Stackframes als Kommentar mit drin.

Den Aufrufgraphen musst du aber selbst ermitteln...

Autor: G. L. (sprintersb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

für avr-gcc mache ich das mittls einer kleinen Routine:

http://www.roboternetz.de/wissen/index.php/Speiche...

man muss dazu also seine Software instrumentieren...

Eine statische Berechnung (also auch Abschätzung nach oben) des 
Benötigten Hepa-/Stapel-Verbrauchs bedeutet im allgemenen Falle IMHO das 
Halteproblem (siehe http://de.wikipedia.org/wiki/Halteproblem) zu lösen.

Deine Software muss also spezielle Eigenschaften aufweisen, um eine 
statische Analyse machen zu können (zB. keine Rückwärts-Sprünge).

Zur Abschätzung aufm Papoer kannst du dir im asm-Dump anschauen, wieviel 
Platz ne Funktion belegt (Stack-Frame) und die Call-Chain und maximale 
ISR-Tiefe analysieren.

Allein anhand der C-Quelle zu entscheiden, wie groß der Frame einer 
Funktion ist, ist nicht wirklich machbar...das siehst du wie gesagt viel 
einfachen am Assembler-Dump 
(http://www.roboternetz.de/wissen/index.php/Assembl...)

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Him ich grad den mal aus, weil ich auch gerade wissen will wie groß mein 
stack maximal werden kann, ohne das zur laufzeit zu messen.

Prinzipiell, sollte es bei Programmen ohne rekursive funktionen doch 
möglich sein die maximal vom Programm genutzte Stacktiefe zu ermitteln.

Selber variablen zählen bringt ja nicht so viel, da ja der compiler 
ordentlich optimiert, bzw auch mal was zwischen pusht und popt.

Einzig kompliziert sind ISRs, da kann der kompiler natürlich nicht 
wisse, wann die gecallt wird.

Damit könnt ich aber leben, wenn ich bei den wenigen ISRs grob 
überschlage, welche den größten stack braucht und ca wieviel und das 
einfach drauf addiere.

gibts nicht ein tool, was so eine auswertung anhand des avr-gcc-output- 
assemblerlsitings automatisch macht?

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hey das ging fix,

Danke, ich glaub genau sowas hab ich gesucht!

Mgf,
vlad

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.