Forum: Mikrocontroller und Digitale Elektronik arm-none-eabi-gcc Linker Skript heap und stack Größe


von Entwickler (Gast)


Lesenswert?

Hallo,

im Linker Skript gibt es dazu diese Definitionen

_Min_Heap_Size = 0x200;  /* required amount of heap  */

_Min_Stack_Size = 0x400; /* required amount of stack */

wenn ich diese ändere und die HEX Dateien davor und danach vergleiche
gibt es keinen Unterschied, sie sind identisch.

Kann das sein?

von Stefan F. (Gast)


Lesenswert?

Als ich diese beiden Zeilen zum ersten mal sah habe ich mich gewundert. 
Offenbar dienen sie nur dazu, bei Überschreitung der Grenzen eine 
Warnung auszulösen. Geprüft wird das aber offenbar nur beim Compilieren 
oder Linken, nicht zur Laufzeit.

von Entwickler (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Geprüft wird das aber offenbar nur beim Compilieren
> oder Linken, nicht zur Laufzeit.

interessant. Muss man für den Compilertest irgendwelche -D Schalter 
setzen?

_Min_Stack_Size = 0x0; /* required amount of stack */

bringt mir keinen Fehler.

von Stefan F. (Gast)


Lesenswert?

Entwickler schrieb:
> _Min_Stack_Size = 0 bringt mir keinen Fehler.

Damit behauptest du, dass dein Programm keinen Stack benötigt. 
Entsprechend ist dem Linker dann egal, wie groß der verfügbare Stack 
ist.

Wenn du dort sagen würdest, dass dein Programm 64 KB Stack benötigt, 
dann bekommst du wahrscheinlich die erwartete Fehlermeldung, weil dein 
Mikrocontroller gar nicht so viel RAM hat (ist jetzt nur geraten, ich 
weiß ja nicht welches konkrete Modell du verwendest).

von Entwickler (Gast)


Lesenswert?

Hallo Stefan,

>>>Damit behauptest du, dass dein Programm keinen Stack benötigt.

In der C-Welt verwendet man für diese Semantik eher -1 :)

Mit 0 würde ich eher sagen, es gibt keine verschachtelten 
Funktionsaufrufe
keine lokalen Variablen.

Ich habe auch 0x0F mit dem gleichen Resultat ausprobiert.
Keine Warnung, kein Fehler.

Mein Controller ist STM32F303
1
/* Specify the memory areas */
2
MEMORY
3
{
4
RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 40K
5
CCMRAM (xrw)      : ORIGIN = 0x10000000, LENGTH = 8K
6
FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 256K
7
}

von Stefan F. (Gast)


Lesenswert?

Entwickler schrieb:
> Ich habe auch 0x0F mit dem gleichen Resultat ausprobiert.
> Keine Warnung, kein Fehler.

Weil du mehr als 15 Bytes RAM hast. Warum sollte so ein kleiner Wert 
eine Fehlermeldung auslösen? Einen Fehler bekommst du nur dann, wenn 
weniger Stack existiert, als dein Programm (in dieser Zeile) verlangt.

> Mein Controller ist STM32F303

Gut dass es nur einen in der ganzen Serie gibt.
Ironie off: STM32F303 gibt es mit 16, 40, 48, 64 und 80 KB RAM.

von M. Н. (Gast)


Lesenswert?

Entwickler schrieb:
> wenn ich diese ändere und die HEX Dateien davor und danach vergleiche
> gibt es keinen Unterschied, sie sind identisch.

Das ist das gewollte Verhalten. Stack und heap sind "noload" sections 
und werden nicht alloziert. Sprich sie werden auch beim Generieren eines 
bin/Hex/... files nicht angelegt. Du musst den Stack ja nicht mit 
irgendwas vorladen.

Entwickler schrieb:
> interessant. Muss man für den Compilertest irgendwelche -D Schalter
> setzen?
>
> _Min_Stack_Size = 0x0; /* required amount of stack */
>
> bringt mir keinen Fehler.

Du musst die Zahl größer machen irgendwann passt dann der Stack nicht 
mher in den RAM und der Linker bringt einen Fehler. Das ist nur dafür 
da, damit du garantiert etwas RAM frei hast für den Stack und deine 
globalen/statischen Variablen nicht schleichend den Ganzen RAM füllen 
und mit dem Stack/Heap kollidieren.

Mit -fstack-usage kann man GCC dazu bewegen den maximalen Stack 
Verbrauch einer Funktion anzugeben. Das berücksichtigt allerdings keine 
Interrupts, die ja undeterministisch immer und überall reingrätschen 
können.

von Entwickler (Gast)


Lesenswert?

Hallo Stefan,

OK, jetzt verstanden

Meine Annahme war, ich begrenze Stack auf 0x400 und Linker warnt
mich, wenn dieser Wert überschritten wird => Stackanalyse

Du sagst, Linker ist blöd und geht davon aus, ich habe die Stackanalyse
gemacht und schreibe den Wert hin.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Entwickler schrieb:
> ich begrenze Stack auf 0x400 und Linker warnt
> mich

Woher sollte der Linker das denn wissen?

Wenn du bspw. eine Funktion rekursiv aufrufst, hängt der Stackverbrauch 
davon ab, mit welchen Argumenten du sie aufrufst … (oder er wird 
unendlich, weil die Rekursion nicht terminiert ;-).

: Bearbeitet durch Moderator
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.