Forum: Mikrocontroller und Digitale Elektronik STM32F401RE Stack overflow -> Stack vergrößern?


von StackOverflower (Gast)


Lesenswert?

Hallo,

mir zerhaut es immer mein Programm ab einer bestimmten Größe, obwohl ich 
den vorhandenen SRAM von 96Kb noch lange nicht ausgereizt habe. 
(STM32F401RE)
Meine MapFile zeigt:
1
    Execution Region RW_IRAM1 (Base: 0x20000000, Size: 0x00000680, Max: 0x00018000, ABSOLUTE)
2
3
    Base Addr    Size         Type   Attr      Idx    E Section Name        Object
4
5
    0x20000000   0x00000004   Data   RW          257    .data               delay.o
6
    0x20000004   0x00000004   Data   RW          432    .data               stm32f4xx_hal.o
7
    0x20000008   0x00000014   Data   RW         1037    .data               system_stm32f4xx.o
8
    0x2000001c   0x00000060   Zero   RW         1156    .bss                c_w.l(libspace.o)
9
    0x2000007c   0x00000004   PAD
10
    0x20000080   0x00000200   Zero   RW         1027    HEAP                startup_stm32f401xe.o
11
    0x20000280   0x00000400   Zero   RW         1026    STACK               startup_stm32f401xe.o


Mein Stack ist 0x400 groß, obwohl mein Idx 1026 ist! (0x400 = 1024). 
Dadurch wird mein Stackpointer (Register 15) schon unter der Base von 
0x20000000 initialisiert. Ich weiß nicht, warum mein Stack nicht 
automatisch vergrößert wird. Platz genug ist ja.

Jemand eine Idee? Ich arbeite mit Keil v5.

Zu sagen sei noch, ich programmiere in c++, ich hoffe, dadurch habe ich 
nicht etwas übersehen? Die ganzen HAL-Treiber von STM sind ja c klassen.

Danke, Grüße

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hast Du irgendwo ein lokales (größeres) Array? Das wird nämlich erst zur 
Laufzeit auf dem Stack angelegt - bei Aufruf der Funktion.

von StackOverflower (Gast)


Lesenswert?

Die Vermutung habe ich auch schon...
ich mache folgendes:
1
// Header file
2
class test
3
{
4
private:
5
  uint8_t       ReadDataRaw[4][8][16]; 
6
  int16_t      m_iDCSRaw[4][8][8];
7
  uint32_t    m_iAmplitude[8][8];
8
};
9
10
// Source file

diese drei benutze ich dann in verschiedenen Memberfunktionen der klasse

von Kaj (Gast)


Lesenswert?

Schau mal in die Linker Scripte. Kann sein das da irgendwo die Stack- 
und Heapgroesse fest eingestellt ist (ist z.B. bei Atmel so)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

StackOverflower schrieb:
>   uint8_t       ReadDataRaw[4][8][16];
>   int16_t      m_iDCSRaw[4][8][8];
>   uint32_t    m_iAmplitude[8][8];

Das sind 512 + 512 + 256 = 1280 Bytes.

Wie groß war Dein Stack nochmal? ;-)

Du kannst den Wert gewiss höher schrauben. Wo das im Keil geht, weiß ich 
allerdings nicht.

von StackOverflower (Gast)


Lesenswert?

In der "startup_stm32f401xe.s" war die Stack_Size auf 0x400 festgelegt. 
habe den Stack verdoppelt und es funktioniert nun.

Aber ich denke, die Datei wird doch bestimmt automatisch erstellt und 
der Stack somit automatisch berechnet. Es scheint wohl, ich habe ein 
schlechten Programmierstil :-(

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

StackOverflower schrieb:
> Aber ich denke, die Datei wird doch bestimmt automatisch erstellt und
> der Stack somit automatisch berechnet. Es scheint wohl, ich habe ein
> schlechten Programmierstil :-(

Sorry, kein Compiler auf der Welt kann ahnen, ob Du überhaupt zur 
Laufzeit diese Variablen/Objekte anlegst und wie oft (z.B. durch 
Rekursion).

Daher geht da nix "automatisch". Das liegt in Deiner Verantwortung.

Über statische Objekte weiß allerdings der Linker Bescheid. Du kannst 
natürlich Deine Klasse/Ojekt statisch definieren - mit allen Vor- und 
Nachteilen.

von StackOverflower (Gast)


Lesenswert?

Danke für die Hilfe!

Eine Frage hätte ich noch. Wieso den Stack nicht gleich auf's Maximum 
von 96kb initialisieren? Warum lediglich nur 1kb?

von Udo S. (urschmitt)


Lesenswert?

StackOverflower schrieb:
> Eine Frage hätte ich noch. Wieso den Stack nicht gleich auf's Maximum
> von 96kb initialisieren? Warum lediglich nur 1kb?

Weil du normalerweise auch Speicher für globale Variablen und für den 
Heap brauchst.
Dort legt man größere Variablen dann auch gerne mal mit malloc() an.

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.