STM32 stack placement

OP #2889468
Lesenswert?

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?
OP #2889495
Lesenswert?

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?
Gast #2889514
Lesenswert?

>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);)
Gast #2889540
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren