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
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 | } |
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 ;-).
:
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.