Hallo, nach meinen ersten Erfahrungen mit dem STM32 bin ich nun von der Lite Version von Atollic auf CrossWorks umgestiegen und auch gleich erstmal auf die Nase gefallen: Während Atollic recht pragmatisch den Stack einfach am Ende des RAM beginnen lässt und so also Stack und Heap aufeinander zu wachsen, bis kein RAM mehr verfügbar ist, legt CrossWorks den Stack direkt hinter den Heap mit angegebener Größe. Man muss also gleich zu Beginn vernünftige Größen für Heap- und Stack-Size angeben - tut man's nicht, fliegt's einem schnell um die Ohren... Sicher sollte man sich über die benötigten Größen für Stack und Heap seiner SW im klaren sein, aber gerade zu Beginn einer Entwicklung (zumal im Hobbybereich) scheint es doch deutlich praktischer, den Stack direkt ans Ende des RAM zu legen, als einen Teil des RAM hinter dem Stack unbenutzt zu lassen. Wie geht man damit am besten um? 1) brav Stack und Heap Größen ermitteln und dem Linker mitgeben 2) Start-up Code patchen (interessanterweise wird im Flash der Wert von _stack_end_ abgelegt, im Startup Code der SP erneut mit _RAM_segment_end_ initialisiert um ihn danach im CRT Startup Code wieder mit _stack_end_ zu überschreiben...) 3) Memory placement anders konfigurieren. Wie genau geht das?
3) Memory placement anders konfigurieren. Wie genau geht das? Linker Script ändern. Zeig mal her.
der entsprechende Abschnitt in der *.ld Datei sieht so aus:
1 | __stack_load_start__ = ALIGN(__heap_end__ , 4); |
2 | .stack ALIGN(__heap_end__ , 4) (NOLOAD) : AT(ALIGN(__heap_end__ , 4)) |
3 | { |
4 | __stack_start__ = .; |
5 | *(.stack .stack.*) |
6 | . = ALIGN(MAX(__stack_start__ + __STACKSIZE__ , .), 4); |
7 | } |
8 | __stack_end__ = __stack_start__ + SIZEOF(.stack); |
9 | |
10 | __stack_load_end__ = __stack_end__; |
Kann mann vermutlich direkt ändern. Allerdings wird diese Datei beim Build generiert und somit die Änderungen wohl überschrieben. CrossWorks verwendet zusätzlich noch placement.xml Dateien, hat damit jemand schon mal was gemacht? Generell ist es aber sinnvoll, den Stack ans Ende des RAM zu platzieren? Oder gibt's hierzu andere Meinungen?
>Kann mann vermutlich direkt ändern. Allerdings wird diese Datei beim >Build generiert und somit die Änderungen wohl überschrieben. Dann mach doch den Heap grösser. >Generell ist es aber sinnvoll, den Stack ans Ende des RAM zu platzieren? >Oder gibt's hierzu andere Meinungen? Sagen wir mal es ist üblich. Mann kann den aber auch tiefer platzieren wenn man über dem Stack noch eine Section haben möchte die man selber verwaltet. Sagen wir einfach mal einen (mehr oder weniger) geschützten Bereich wo der Stack nicht reinwandern kann (sollte);)
ok, es funktioniert wohl über die flash_placement.xml, die man zuvor in sein Projekt importieret muss. Habe hier ein Beispiel für ein ähnliches Problem gefunden: http://www.w2robotics.com/wp/wp-content/uploads/2012/08/CrossWorks22_STM32F4_CCM.pdf
holger schrieb: > Dann mach doch den Heap grösser. ja, muss ich dann aber u.U. öfter anpassen, wenn der Programmcode wächst. Am bequemsten wär's halt, für den Stack eine Maximalgröße anzugeben und den Rest des RAM für den Heap zu verwenden. Aber grundsätzlich geht's so natürlich auch, danke.
>> Dann mach doch den Heap grösser. >ja, muss ich dann aber u.U. öfter anpassen, wenn der Programmcode >wächst. Das ist natürlich blöd. >Am bequemsten wär's halt, für den Stack eine Maximalgröße anzugeben und >den Rest des RAM für den Heap zu verwenden. Kann Crossworks nicht mit einer festen Linkerdatei arbeiten die vom Build unabhängig ist? Sonst Eclipse pur aufsetzen! Ist ein bisschen Arbeit gebe ich zu, geht aber auch;)
Platzierung des Stacks am Ende vom RAM ist kein Problem, wenn man nur einen Stack hat. Das ist bei ARMs insgesamt gesehen eher die Ausnahme, die meisten Varianten davon haben mehrere Stacks. Auch bei den Cortex-M Type ist das möglich (aber weniger häufig).
Schon mal bei denen im support von Crossworks nachgefragt? Aus eigener Erfahrung weiß ich, dass die recht prompt antworten.
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.