Forum: Mikrocontroller und Digitale Elektronik STM32 linker script stack größe


von Dennis (Gast)


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!

von Dennis (Gast)


Angehängte Dateien:

Lesenswert?

Anbei der gesamte linker script

von Ingo (Gast)


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.

von Ruediger A. (Firma: keine) (rac)


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

von Dennis (Gast)


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
}

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.