Forum: Compiler & IDEs GCC STM32F4 -> Wie Variablen auf RAM bereiche verteilen


von Dirk (Gast)


Lesenswert?

Hallo,
ich wollte mit dem STM32F4 was machen und der hat 5 RAM Bereiche.
- CCM Data RAM 64KB
- BKPSRAM 4KB
- SRAM 112KB
- SRAM 16KB
- Externes (über FSMC) SRAM 1MB

Jetzt stellt sich aber die Frage für mich:
Wie und was muss ich angeben damit ich die Variablen entsprechend 
verteilen kann.

Viele Grüsse,
Dirk

von benwilliam (Gast)


Lesenswert?

habe da zwar keine Erfahrungen
aber ich würde mit dem linker script anfangen und dort diese bereiche 
definieren

von Steffen R. (steffen_rose)


Lesenswert?

Da gibt es viele Möglichkeiten.

Im Linkerfile entprechende Sektionen einfügen und den Memory Bereichen 
zuordnen.

Entweder im Linkerfile bestimmte Sektionen aus den Objektfiles auf die 
Linker Sektionen zuordnen. Oder aber über Attribute im C-File direkt den 
Variablen eine Linker Sektion zuordnen.

z.B.
int c_var __attribute__((section("meine_sektion")));

von Dirk (Gast)


Lesenswert?

Im Linker File habe ich nun die Bereiche angelegt.
ROM, RAM und CCRAM waren da schon drin.

Aber nur ROM & RAM wird da verwendet.


Wie ich da nun mein Externes RAM einbauen soll ist mir noch ein Rätsel.
Aber dahabe ich 2 Beispiele gefunden die ich jetzt noch ansehen muss.

Das mit "section" klingt schon mal einleuchtend muss ich aber noch 
testen.

Dirk

von Tassilo H. (tassilo_h)


Angehängte Dateien:

Lesenswert?

Grad zufaellig hab ich da heute was zusammengeschustert. Ich verwende 
CoIDE, hab haber deren Startupcode etwas veraendert.

Das Linkerscript macht die sections .data (initialisiert) und .bss 
(null-gefuellt) im normalen SRAM, sowie .ccmdata und .ccmbss im core 
coupled memory. Der Stack liegt auch im core coupled memory.

Achtung: Das geht nur, wenn auf lokale Variablen nie via DMA zugegriffen 
werden soll, was z.B. bei Verwendunge der 
SD-Karten-Beispielimplementationen, die man so im Netz findet, in die 
Hose geht, wenn man mal ein File nur lokal in einer Funktion bearbeitet.

Linkerscript im Anhang, ebenso wie das modifizierte Startup-File (man 
beachte die Definition des Stacks in der Vektortabelle sowie das 
Initialisieren der sections im Default_Reset_Handler

Im Quellcode habe ich noch die defines:
1
// defines to move global variables to core coupled memory
2
// use _CCM for uninitialized variables
3
#define _CCM  __attribute__((section (".ccmbss")))
4
// use _CCMDATA for initialized variables
5
#define _CCMDATA  __attribute__((section (".ccmdata")))

und kann damit globale variablen so in den core-coupled memory legen:
1
uint32_t _CCM NullInitialisiert;
2
char _CCMDATA Beispiel[] = "Beispiel";
Achtung, nimmt man _CCM fuer initialisierte Variablen, mecker der 
Compiler nicht, aber sie werden trotzdem in die .ccmbss section gelegt 
und mit 0 gefuellt.

Vielleicht hilft das ja als Ausgangspunkt.

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.