GCC STM32F4 -> Wie Variablen auf RAM bereiche verteilen

Gast #4017988
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
#4018046
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")));
Gast #4019155
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
#4022125
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.
Angehängte Dateien:

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.