Linker Script .bss automatisch aufteilen lassen

OP #4464022
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
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
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?
OP #4471304
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.
(Firma: Torrox.de) #4471392
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
#4471397
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
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");
OP #4472143
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

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.