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.
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.
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)?
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
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 ....
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.
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.
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".
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.