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
habe da zwar keine Erfahrungen aber ich würde mit dem linker script anfangen und dort diese bereiche definieren
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")));
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.