Linker Script .bss automatisch aufteilen lassen

#4464022
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
Gast #4464144
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.
(Firma: fritzler-avr.de) #4465910
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?
#4471304
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.
#4471397
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...
(Firma: fritzler-avr.de) #4471598
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");
#4472143
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?!?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren