Hallo, mein µC (ARM Cortex-M3) verfügt über 2 getrennte RAM Bänke, die sich leider nicht zu einer großen Bank zusammenfassen lassen. Mein Problem ist nun, dass mein benötigter Speicherplatz in der .bss-Section so groß ist, dass es nicht mehr in eine Bank alleine passt und Teile in die zweite Bank ausgelagert werden müssen. Für dieses Problem suche ich nach einer praxistauglichen Lösung. Vom Linker der IAR-EWARM kenne ich die Möglichkeit, im Linker-Script die beiden Bereiche getrennt zu definieren und zu einem großen Bereich zusammenzufassen. Der Linker passt dann auf, dass er die Bereichsgrenzen der einzelnen Teilbereiche nicht verletzt und ordnet automatisch alles entsprechend an. Gibt es beim Linker der GNU ARM Toolchain eine ähnliche Option? Vielen Dank und viele Grüße, Andreas
Sind beide Bereiche wirklich funktionell gleichwertig? Der CCM bei einem STM32F4 kann z.b. nicht als DMA-Quelle/Ziel dienen. Das kann Dir auch der IAR-Linker nicht automatisch verhackstuecken. Da helfen dann nur Region-Pragmas.
Ja, beide Bereich sind gleichwertig zu behandeln. Es handelt sich beim µC um einen FM3 (Spansion MB9BF506R).
Kannst doch im Linkerscript angeben welche Objektdatei wohin gelinkt werden soll, da dann noch die .bss Section rausfischen und gut is:
1 | . = RAMBANK1; |
2 | .bss : { |
3 | kekse.o(.bss) |
4 | sys/kuchen.o(.bss) |
5 | } |
6 | . = RAMBANK2; |
7 | .bss : { |
8 | tomate.o(.bss) |
9 | mm/kirsche.o(.bss) |
10 | } |
Da fleucht doch sicherlich nur nen Großer Buffer rum oder?
Vielen Dank für die Antwort. Leider bin ich erst heute dazu gekommen den Vorschlag auszuprobieren. Grundsätzlich funktioniert der Ansatz soweit. Allerdings hätte ich mir gewünscht, dass der Linker mir die Aufgabe des Speichermanagements abnehmen würde. Denn der entscheidende Nachteil dieser manuellen Methode ist, dass man bei einer Änderung der Firmware immer kontrollieren muss, ob das Speicherlayout noch passt oder ob es zu einem Überlauf gekommen ist. Würde der Linker die Aufgabe des Verteilens für mich übernehmen, bräuchte ich mich um die Speicherausnutzung nicht mehr zu kümmern. Mit der Vermutung um einen großen Speicher hast du übrigens recht. Allerdings wird dieser Speicher in der Anwendung (leider) komplett benötigt.
Hast Du schon mal auf einer einer passenden Mailingliste gefragt. Ansonsten ist dass, was Du suchst ja wirklich so, dass man sich da Unterstützung im Linker wünschen würde. Vielleicht ist das einbauen des Features in den Linker ja auch eine Lösung. mfg Torsten
Ich hab mir das Memory mapping mal angeschaut. Ich verstehe deine Aussage nicht, dass sich diese zwei RAM Bänke nicht zusammenfassen lassen. SRAM2 befindet sich direkt hinter SRAM1, die Core sollte also durchgehend addressieren können. Solang du keinen unaligned Zugriff auf die Speichergrenze versuchst, sollte sich der Speicher wie ein einziger großer SRAM-Block verhalten. Mit dem STM32F437 hatte ich jedenfalls noch nie Probleme mit der Grenze zwischen SRAM1 und SRAM2. Könnte aber auch daran liegen, dass ich noch nie bis dort hin gekommen bin. Bitte berichtigt mich, wenn ich Blödsinn erzähle...
Wies automatisch geht weis ich ja leider auch nicht, da würd mich auch mal interessieren wie das geht. Aber ich kann dir Linkerrerrors anbieten wenns zu groß wird ;) Erspart dann zumindest das Nachgucken. Linkerscript:
1 | . = RAMBANK1; |
2 | _bss1_start = .; |
3 | .bss : { |
4 | kekse.o(.bss) |
5 | sys/kuchen.o(.bss) |
6 | } |
7 | _bss1_end = .; |
8 | _bss1_size = _bss1_end - _bss1_start; |
9 | . = RAMBANK2; |
10 | _bss2_start = .; |
11 | .bss : { |
12 | tomate.o(.bss) |
13 | mm/kirsche.o(.bss) |
14 | } |
15 | _bss2_end = .; |
16 | _bss2_size = _bss2_end - _bss2_start; |
17 | |
18 | ASSERT(_bss1_size <= deine_ramgrosse, "bss1 too big"); |
19 | ASSERT(_bss2_size <= deine_ramgrosse, "bss2 too big"); |
:
Bearbeitet durch User
Vielen Dank für die reichlichen Antworten! @Torsten Robitzki: Ich verwende die GNU Toolchain von ARM. Dort habe ich mich auch im Forum eingetragen. Leider herrscht dort deutlich mehr Stille als hier. @Little Basdart: Grundsätzlich hast du recht, dass ich die beiden Bänke zu einer zusammenfassen kann. Ich kann in meiner Anwendung aber nicht sicherstellen, dass der Zugriff immer 4-Byte-Aligned ist, da ich teilweise mit gepackten Strukturen arbeiten muss. Hatte mit dieser Methode auch schon "schlechte Erfahrungen" gemacht. @Martin Wende: Ein Linkererror wäre schon mal ein nützliches Feature in dieser Hinsicht. Dennoch beharre ich auf dem Versuch es den Linker automatisch machen zu lassen! :) Falls ich jemals meine gewünschte Antwort bekomme, werde ich sie hier posten! - Befürchte allerdings, dass ich meine "gewünschte Antwort" nicht bekommen werde, da der Linker das vermutlich nicht hergibt?!?
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.