Forum: Mikrocontroller und Digitale Elektronik Arduino Stackgröße


von Jean-Claude Juhnke (Gast)


Lesenswert?

Hallo wie groß ist denn der Stack beim Arduino eigentlich? Sagen wir 
beim Mega2560.

von Einer K. (Gast)


Lesenswert?

So groß, wie du ihn wachsen lässt.

von Axel S. (a-za-z0-9)


Lesenswert?

Jean-Claude Juhnke schrieb:
> Hallo wie groß ist denn der Stack beim Arduino eigentlich? Sagen wir
> beim Mega2560.

Der C-Startupcode intitialisiert den Stackpointer auf das Ende des RAMs. 
Globale Variablen werden vom Anfang des RAMs her angelegt. Der Platz 
dazwischen ist nutzbar für den Stack.

Der Linker warnt dich nur dann, wenn das Ende der Speicher-Sektion mit 
den statischen Variablen (.data + .bss + .noinit) größer ist, als der 
RAM insgesamt. Im Zweifelsfall ist die Kacke schon lange vorher am 
Dampfen.

Eine zuverlässige Analyse des größten jemals benutzten Stackbereichs ist 
nur in Ausnahmefällen möglich. Ich kenne kein Tool, das das leistet.

von Jean-Claude Juhnke (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> 21.12.2018 00:19: Bearbeitet durch User
Wieso kriegst du nicht mal eine einzelnen Satz hin, ohne korrigieren zu 
müssen?

Der Stack ist also freihängend ... wo ? Teilt er sich den Adressbereich 
mit dem Heap? Oder wie ist die Architektur?

von Jean-Claude Juhnke (Gast)


Lesenswert?

Axel S. schrieb:
> Der C-Startupcode intitialisiert den Stackpointer auf das Ende des RAMs.
> Globale Variablen werden vom Anfang des RAMs her angelegt. Der Platz
> dazwischen ist nutzbar für den Stack.

Das ist eine qualifizierte Antwort. danke :-)

von Einer K. (Gast)


Lesenswert?

Ach, mal wieder der Roth, mit der Lesehemmung...

von Jean-Claude Juhnke (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Ach, mal wieder der Roth, mit der Lesehemmung...
> 21.12.2018 00:29: Bearbeitet durch User

Junge du hast nicht nur ein Problem

von Alex G. (dragongamer)


Lesenswert?

Jean-Claude Juhnke schrieb:
> Der Stack ist also freihängend ... wo ? Teilt er sich den Adressbereich
> mit dem Heap? Oder wie ist die Architektur?
Der Stack von unten nach oben und der Heap von oben nach unten.
Dadurch muss man keine feste Grenze festlegen wodurch Speicher ungenutzt 
bliebe sobald eine der beiden Datenmengen, ihr limit erreicht.

Axel S. schrieb:
> Eine zuverlässige Analyse des größten jemals benutzten Stackbereichs ist
> nur in Ausnahmefällen möglich. Ich kenne kein Tool, das das leistet.
Das dürfte wohl aus dem Selben grund scheitern wieso man nicht 
automatisch feststellen kann, ob ein beliebiges Programm jemals enden 
wird, oder nicht.

von Jean-Claude Juhnke (Gast)


Lesenswert?

@ Alex G.

Das ist sinnvoll und ich habe kaum ein anderes Konzept gesehen. Warum 
auch.

(Fast) nur Microsoft bringt Ausnahmen zustande. Im DOS war nicht nur der 
Stack limitiert, nein, er wurde beim Aufruf von INT Anweisungen sogar 
"initialisiert". d.h. der Stackpointer wurde neu geschrieben. Nur ein 
kleiner Ausflug in die vergangene TSR-Welt. Aber seitdem (man muss es 
wirklich erlebt haben, um es zu glauben) frage ich halt nach dem 
Speicherkonzept.

Schönen "Abend" noch :-)

von Jörg R. (solar77)


Lesenswert?

Jean-Claude Juhnke schrieb:
> Arduino Fanboy D. schrieb:
>> 21.12.2018 00:19: Bearbeitet durch User
> Wieso kriegst du nicht mal eine einzelnen Satz hin, ohne korrigieren zu
> müssen?

...eineN einzelnen Satz hin...?

von Jean-Claude Juhnke (Gast)


Lesenswert?

:)

Ich gehe davon aus, dass das Auf und Ab inflationärer Rechtschreibung 
fehlende Buchstaben im Laufe der Zeit statistisch bereinnigt.

von Axel S. (a-za-z0-9)


Lesenswert?

Alex G. schrieb:
> Jean-Claude Juhnke schrieb:
>> Der Stack ist also freihängend ... wo ? Teilt er sich den Adressbereich
>> mit dem Heap? Oder wie ist die Architektur?

> Der Stack von unten nach oben und der Heap von oben nach unten.

Bzw. anders herum. Beim AVR "wächst" der Stack in Richtung niedrigere 
Adressen. Beim Cortex-M dito. Bei anderen Architekturen kann das anders 
aussehen oder man kann es sogar konfigurieren.

Das ist aber ein vergleichsweise unwichtiges Detail. Entscheidend ist, 
daß der nicht für das Datensegment verwendete, restliche RAM von einem 
Ende her für den Stack und vom anderen Ende her für den Heap verwendet 
wird.

> Dadurch muss man keine feste Grenze festlegen wodurch Speicher ungenutzt
> bliebe sobald eine der beiden Datenmengen, ihr limit erreicht.

Ganz recht. Allerdings wäre es schön, wenn Stackoperationen einerseits 
und malloc()/new() andererseits darauf aufpassen könnten, ob sie die 
aktuelle Grenze ihres Gegenspielers übertreten. Wieviel Nutzen sich auf 
einem µC daraus ziehen läßt, ist natürlich begrenzt.

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.