Forum: Mikrocontroller und Digitale Elektronik STM32F407 internes RAM


von STMApprentice (Gast)


Lesenswert?

Versuche mich gerade am STM32407 Discovery Board und fühle
mich erschlagen von den dicken Manuals des Prozessors.

Kann mir bitte jemand - damit ich nicht stundenlang Manuals
wälzen muss - in kurzen Worten erklären warum es zwei ver-
schiedene interne RAM-Speicherbereiche gibt (das generierte
Linker Description File weist 128KByte und 64KByte aus) und was
ggf der Compiler/Linker macht wenn ein Bereich voll ist oder
nach welchen Kriterien diese zwei Bereiche augenutzt/belegt
werden?

Könnte ein grosses Array übergreifend angelegt werden wenn es
für einen Bereich nicht ausreicht?

Vielen Dank für Tipps und das Ersparen von schwerer Lektüre.

von Jim M. (turboj)


Lesenswert?

STMApprentice schrieb:
> in kurzen Worten erklären warum es zwei ver-
> schiedene interne RAM-Speicherbereiche gibt

Der Cortex M4 hat mehr als einen Interface Port für Speicher. Die RAMs 
hängen also an verschiedenen Ports - so kann z.B. Code Fetch 
gleichzeitig zu Daten Transfer erfolgen.

Beim LD (GCC, eigentich Binutils) muss man immer mit Sections arbeiten, 
d.h. er kann Speicher nur dann füllen wenn er fortlaufend ist. Mit Gaps 
kommt der nicht klar.

STMApprentice schrieb:
> Könnte ein grosses Array übergreifend angelegt werden wenn es
> für einen Bereich nicht ausreicht?

Nein. Das geht in C nicht, die Addressen müssen fortlaufend sein.

Lies Dir lieber die Handbücher von ARM und ST mal durch, sonst 
verstehste sowieso nur Bahnhof.

von STMApprentice (Gast)


Lesenswert?

Danke für deine Antwort. Wird der Linker automatisch den zweiten
Speicherbereich nutzen wenn der eine voll ist oder muss man ihm
das sagen, im Stil von progmem bei den AVR Prozessoren (wenn man
z.B. Konstanten im Flash unterbringen will)?

von m.n. (Gast)


Lesenswert?

Das RAM ab 0x20000000 ist aufgeteilt in 112K und 16K, die jeweils über 
unterschiedliche Busse gleichzeitig (überlappend) angesprochen werden 
können. Sofern dies nicht benötigt wird, kann man sie als 128K RAM 
verwenden und auch per DMA darauf zugreifen.

Die 64K CCM-RAM ab 0x10000000 werden über einen weiteren Bus 
angesprochen und sind für den D-Bus des Prozessors direkt zugreifbar. 
Dafür entfällt die Möglichkeit, per DMA darauf zuzugreifen.
Geschickterweise nutzt man diesen Bereich für Stack, Heap oder auch für 
'normale' Variablen.

STMApprentice schrieb:
> Wird der Linker automatisch den zweiten
> Speicherbereich nutzen wenn der eine voll ist oder muss man ihm
> das sagen, im Stil von progmem bei den AVR Prozessoren (wenn man
> z.B. Konstanten im Flash unterbringen will)?

Der Linker nutzt den Speicher, den man ihm vorgibt.

Stichwort für die Suche im Datenblatt: Multi-AHB bus matrix

von STMApprentice (Gast)


Lesenswert?

m.n. schrieb:
> Der Linker nutzt den Speicher, den man ihm vorgibt.

Danke auch für deinen Beitrag zu meiner Erleuchtung.

Hmmmm, naja, wenn man Variablen (normal, ohne section)
deklariert dann gibt man ja dem Linker nicht vor wo sie
angelegt werden sollen, daher meine Frage ....

von Jim M. (turboj)


Lesenswert?

STMApprentice schrieb:
> Hmmmm, naja, wenn man Variablen (normal, ohne section)
> deklariert dann gibt man ja dem Linker nicht vor wo sie
> angelegt werden sollen, daher meine Frage ....

Falsch. Er tut sie dahin, wo im Linker Skript das Datensegment oder BSS 
(zero-initialized) liegt. Der Hinweis auf die Handbücher war ernst 
gemeint.

von Nop (Gast)


Lesenswert?

STMApprentice schrieb:

> Hmmmm, naja, wenn man Variablen (normal, ohne section)
> deklariert dann gibt man ja dem Linker nicht vor wo sie
> angelegt werden sollen, daher meine Frage ....

Doch, das tut man im Linkerscript. Üblicherweise legt der Linker 
const-Variablen im Flash ab.

Die Bereiche für Stack, Heap und globale Variablen sind im Linkerfile 
deklariert. Das 0815-Standard-Linkerfile aus dem Netz legt alles 
implizit in den 128K-Bereich rein und benutzt die 64K des CCM gar nicht.

Will man diese 64K auch nutzen, muß man dem Linker per attribute bei den 
Variablen explizit mitteilen, daß sie dort landen sollen. Wenn ein 
Segment überläuft, weil man zuviel reingepackt hat, sollte der Linker 
sich beschweren, weil im Linkerfile ja ganz oben angegeben ist, wie groß 
die einzelnen Bereiche denn sind.

Die Entscheidung, welche Variablen in welchen RAM-Bereich gehen, liegt 
allein beim Programmierer. Im Allgemeinen ist es sinnvoll, einen der 
beiden Bereiche möglichst voll zu packen, anstatt beide gleichäßig 
auszunutzen. Der verbleibende freie Gesamtspeicher ist dann nämlich "am 
Stück".

Da das CCM weder für Codeausführung noch für DMA geht und somit 
eingeschränkter ist, empfehle ich, das CCM möglichst vollzupacken mit 
den Variablen, die dafür geeignet sind. Insbesondere dem Stack.

von STMApprentice (Gast)


Lesenswert?

Jim M. schrieb:
> Der Hinweis auf die Handbücher war ernst gemeint.

Etwas Verständnis wird man doch bitte für mich aufbringen
können, meine Fragen beziehen sich ja nicht darauf wie ich
ein Bit am Port A auf 1 setze. Zudem ist es nicht jedermanns
Sache ein LDF zu schreiben, auch nicht es gleich vollständig
zu verstehen.

Da ich bisher nur AVR gemacht habe ist für mich manche Sache
beim STM32 einfach anders. Z.B. jetzt gerade dies:

Nop schrieb:
> Üblicherweise legt der Linker const-Variablen im Flash ab.

... was beim AVR nicht automatisch funktioniert ....

Daher vielen Dank besonders auch an Nop für die kurzen
Erklärungen. Für jeden der die STM-Materie kennt sind meine
Fragen offensichtlich "dumme" Fragen. Das selbe könnte ich
aus meiner Sicht sagen wenn jemand beim AVR es nicht schafft
einen Timer richtig in Betrieb zu nehmen.... alles relativ ...

Zum Abschluss dieses Beitrags noch die Feststellung das meine
"dummen" Fragen hier wohl noch kein anderer gestellt hat.

Also wer es unbedingt braucht: macht weiter so mit "RTFM".

von Ruediger A. (Firma: keine) (rac)


Lesenswert?

Vorsicht Eigenwerbung:

Ich diskutiere die Details von Linker Command Files recht ausführlich in 
meinem Buch am Beispiel von Cortex Prozessoren (die meisten Beispiele 
sind für STM Eval Boards geschrieben).

http://www.springer.com/de/book/9783658148492

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.