STM32 linker script stack größe

Gast #4906887
Lesenswert?
• ▲
▼
Hallo zusammen,
mein Problem ist, dass mein stack mit dem heap kolliddiert und so meine 
allokierten Variablen verändert. Als Controller verwende ich den 
STM32F429I und Atollic TrueSTUDIO als Entwicklungsumgebung.

Ist eine Kollision irgendwie vermeidbar? Ich finde in dem linker script 
auch keine Angabe über die stack größe, nur folgendes:
1
/* Highest address of the user mode stack */
2
_estack = 0x20030000;    /* end of RAM */
3

4
/* Generate a link error if heap and stack don't fit into RAM */
5
_Min_Heap_Size = 0x200;      /* required amount of heap 0x200 */
6
_Min_Stack_Size = 0x400; /* required amount of stack 0x400 */
7

8
  /* User_heap_stack section, used to check that there is enough RAM left */
9
  ._user_heap_stack :
10
  {
11
    . = ALIGN(8);
12
    PROVIDE ( end = . );
13
    PROVIDE ( _end = . );
14
    . = . + _Min_Heap_Size;
15
    . = . + _Min_Stack_Size;
16
    . = ALIGN(8);
17
  } >RAM

Kann ich irgendwie eine feste stack größe vorgeben im Linker script? 
Wenn ja wie?

Danke!
Gast #4907192
Lesenswert?
• ▲
▼
Dennis schrieb:
> Ist eine Kollision irgendwie vermeidbar?
Jein. Wenn der Speicher voll ist, ist er voll.
Der Platz im Kofferraum deines Autos ist ja auch irgendwie begrenzt...

Du könntest im Linkerskript die Positionen von Heap und Stack 
vertauschen.
Also den Heap ans Ende legen und den Stack gleich als erstes im RAM.
Wenn der Stack nach unten wächst, zerstört er wenigstens keine Daten.
Die auftretende Exception kannst Du je nach Anwendungsfall abfangen und 
ggf. gescheit drauf reagieren.
(Firma: keine) #4907223
Lesenswert?
• ▲
▼
Wie Ingo schon richtig schrub: Wenn deine Applikation worst case mehr 
als 192K RAM braucht, ist dein Speicher zu klein, das kannst Du drehen 
und wenden wie Du willst. Hast Du auch einen map file (aus dem hervor 
geht, was zumindestens an statischem RAM schon mal weg ist)?
Gast #4907252
Lesenswert?
• ▲
▼
statisch ist 30532 Byte belegt. Ich habe das Problem vorerst gelöst, 
indem ich in der Funktion _sbrk den Heap nur bis zu der Adresse 
0x2002F000 wachsen lasse. Somit hat der Stack 4096 Byte Platz.
1
caddr_t _sbrk(int incr)
2
{
3
  extern char end asm("end");
4
  static char *heap_end;
5
  char *prev_heap_end;
6

7
  if (heap_end == 0)
8
    heap_end = &end;
9

10
  prev_heap_end = heap_end;
11

12
  if (heap_end + incr > (char *)0x2002F000)
13
  {
14
//    write(1, "Heap and stack collision\n", 25);
15
//    abort();
16
    errno = ENOMEM;
17
    return (caddr_t) -1;
18
  }
19

20
  heap_end += incr;
21

22
  return (caddr_t) prev_heap_end;
23
}

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.