Forum: Compiler & IDEs Linker Script .bss automatisch aufteilen lassen


von Andreas F. (afrueh)


Lesenswert?

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

von ./. (Gast)


Lesenswert?

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.

von Andreas F. (afrueh)


Lesenswert?

Ja, beide Bereich sind gleichwertig zu behandeln.
Es handelt sich beim µC um einen FM3 (Spansion MB9BF506R).

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

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?

von Andreas F. (afrueh)


Lesenswert?

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.

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

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

von Little B. (lil-b)


Lesenswert?

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...

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

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
von Andreas F. (afrueh)


Lesenswert?

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
Noch kein Account? Hier anmelden.