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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.