Forum: Mikrocontroller und Digitale Elektronik STM32F4 Stackpointer-initialisierung


von Dieter H. (msrheinrich)


Lesenswert?

Hallo,

ich habe ein STM32F4Discovery und möchte in einigen Funktion lokale 
Variablen mit 4kByte oder mehr verwenden.

Ich benutze eclipse - yagarto - makefeile-Projekt - Hardwaredebugger - 
stlink-gdbserver.exe. Das Startup-File, sowie das Linker-Script habe ich 
von Atollic genommen.

Für das Debuggen nutze ich die RAM-Version des Linker-Scripts.

Auszug aus stm32_ram.ld (Linker-Script):
/* Entry Point */
ENTRY(Reset_Handler)

/* Highest address of the user mode stack */
_estack = 0x20020000;    /* end of $(RAM_LENGTH) RAM */

/* Generate a link error if heap and stack don't fit into RAM */
_Min_Heap_Size = 0;         /* required amount of heap  */
_Min_Stack_Size = 0x00002000; /* required amount of stack */

/* Specify the memory areas */
MEMORY
{ ROM (rx)  : ORIGIN = 0x08000000, LENGTH = 1024K
  RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
  MB1 (rx)  : ORIGIN = 0x60000000, LENGTH = 0K
  CCM (rw)  : ORIGIN = 0x10000000, LENGTH = 64K
}


Mein Problem:

Debugge ich auf verschiedenen Rechnern, auf denen ich die "gleiche" 
Entwicklungs-Umgebung installiert habe, wird mir der Stack 
unterschiedlich initialisiert.
Auf dem einen Rechner hat sp=0x20020000 wie erwartet,
aber auf dem anderen Rechner wird er auf einen völlig falschen Wert 
initialisiert, so daß bei Zugriff auf grosse lokale Variablen, Teile des 
Programmcodes, die ja auch im RAM liegen überschrieben werden.

Füge ich folgende Zeilen in das startup.S ein:
Reset_Handler:

/* Stack-Pointer initialisieren */
           ldr   r1, =_estack
           msr   psp, r1
           msr   msp, r1

wird mir der Stackpointer mir immer "richtig" initialisiert.

Mir stellen sich hier Fragen:

1. warum dieses eigenartige Verhalten auf dem anderen Rechner, sollte
nach einem Reset der SP nicht "immer" auf den Wert in 0x00000000 
(_estack=0x20020000) gesetzt werden ?
2. wo liegen die Unterschiede von psp und msp
3. funktioniert dies wirklich oder nur "scheinbar" oder "zufällig" ?
4. kann ich den Stack auch woanders verlagern, z.B in das CCMRAM ?
5. kann ich das normale RAM und das CCM zusammenlegen, oder ist die 
Adresse des CCM fest auf 0x10000000 ?


Gruss
Dieter

von Lutz (Gast)


Lesenswert?

Ich vermute 2 Möglichkeiten:

- Wenn der Code wirklich 100 % der Selbe ist: Auf dem anderen Rechner 
ist noch eine IDE-Einstellung anders. Vergleiche mal unter C/C++ Build 
-> Settings speziell die Linkereinstellungen.

- Wenn es nicht der gleiche Code ist, sitzt irgendwo ein #define und 
ändert was

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.