Forum: Mikrocontroller und Digitale Elektronik STM32 stack placement


von Arne F. (-arne-)


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?

von holger (Gast)


Lesenswert?

3) Memory placement anders konfigurieren. Wie genau geht das?

Linker Script ändern. Zeig mal her.

von Arne F. (-arne-)


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?

von holger (Gast)


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

von Arne F. (-arne-)


Lesenswert?

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

von Arne F. (-arne-)


Lesenswert?

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.

von holger (Gast)


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

von (prx) A. K. (prx)


Lesenswert?

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

von Fritz (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.