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?
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.
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.
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).
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
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.
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.
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.
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 ;-).