Forum: Mikrocontroller und Digitale Elektronik AVR-GCC section .text verringern


von Hans M. (hansinger)


Lesenswert?

Hallo,
ich möchte mit Studio5.1 den nutzbaren Flashbereich (ATMega16U4) so 
verringern, das der Bootloaderbereich (0x3000...) geschütz bleibt. 
Bedingt durch den Bootloader verringert sich der nutzbare Flashbereich 
auf 12k. Der Compiler/Linker warnt jedoch erst, wenn der gesamtbereich 
(16k) überschritten wird.
Der Code(Flash) wird soweit ich das sehe über die section .text 
definiert. Kann man z.B. section .text=0..0x2FFF für den Linker 
definieren?

Besten Dank

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Hans M. schrieb:
> Kann man z.B. section .text=0..0x2FFF für den Linker
> definieren?

Könnte man, indem man einen eigenen Linkerscript benutzt.

Es genügt aber auch völlig, wenn du nach dem Compilieren hin und wieder
mal manuell auf die Zahlen guckst. ;-)

von Krapao (Gast)


Lesenswert?

Beitrag "Re: AVRStudio: Anzeige verbrauchter Speicher"

Deine Variante mit Verändern der .text section size (=Manipulieren der 
Linker Control Scripts) wäre mir zu heiss/aufwändig. Ich versuche unter 
allen Umständen Dateien der Toolchain im Originalzustand zu lassen.

von Hans M. (hansinger)


Lesenswert?

> Könnte man, indem man einen eigenen Linkerscript benutzt.
Wo und wie könnte dies dann gemacht werden, ich habe verschiedene 
Scripts schon gefunden, aber ich möchte dies Projekt abhängig gestalten.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Krapao schrieb:
> Ich versuche unter
> allen Umständen Dateien der Toolchain im Originalzustand zu lassen.

Ich würde sie ja auch nicht in der Toolchain ändern.

Hans M. schrieb:
> Wo und wie könnte dies dann gemacht werden,

Ist eine Option, die man dem Linker mitgibt.

> ich habe verschiedene
> Scripts schon gefunden, aber ich möchte dies Projekt abhängig gestalten.

Das wiederum geht nicht (bzw. nicht sinnvoll).  Du willst schließlich
nicht, dass das nächste Projekt, das dann für einen ATmega1281 ist,
auch auf 12 KiB für .text limitiert wird. ;-)  Die Linkerscripts
gibt's nur einmal pro (toolchain-interner) Architekturvariante.  Selbst,
wenn sie pro MCU-Typ wären, hätte es aber keinen Sinn, das global und
projektunabhängig ändern zu wollen: weder ist von vornherein sicher,
dass der Bootloader im nächsten Projekt mit einem ATmega16U4 auch
wieder 4 KiB benötigt (vielleicht willst du ihn dort lieber auf 2 KiB
runterzwängen, um fürs eigentliche Projekt 14 KiB zu haben?), noch
ist sicher, ob das nächste Projekt denn überhaupt einen Bootloader
hat.

von Hans M. (hansinger)


Lesenswert?

> Ist eine Option, die man dem Linker mitgibt.

wäre dies dann über -Wl section .text=?????
möglich und wie würde die Anweisung aussehen?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Hans M. schrieb:
>> Ist eine Option, die man dem Linker mitgibt.
>
> wäre dies dann über -Wl section .text=?????

Nein, das legt die Startadresse der section fest (die Option heißt
ja --section-start).

-Wl ist aber erstmal richtig, das weist den Compiler an, die
nachfolgende Option an den Linker durchzuschieben.

> möglich und wie würde die Anweisung aussehen?

http://sourceware.org/binutils/docs/ld/Scripts.html#Scripts

von Hans M. (hansinger)


Lesenswert?

vielen Dank für die schnellen Hinweise, ich schaue mir den Link jetzt 
mal in Ruhe an.

von Krapao (Gast)


Lesenswert?

@ Jörg

> Ich würde sie ja auch nicht in der Toolchain ändern.

Meine Antwort war nicht auf deine bezogen. Ich hatte nur zu lange 
getrödelt und die Threadanzeige vorm Absenden nicht aktualisiert. So ist 
dein Beitrag dazwischen gerutscht.

von Roland H. (batchman)


Lesenswert?

Gemäß http://www.nongnu.org/avr-libc/user-manual/using_tools.html wird 
für atmega16u4 die "Emulation" avr5 verwendet.

Der folgender Befehl
1
avr-ld -m avr5

zeigt dann das zugehörige "linker script" an.

Die Ausgabe in eine Datei umleiten, und dort im "memory layout" die 
Größe der "Flash/ROM/text"-Region anpassen:
1
MEMORY
2
{
3
  text   (rx)   : ORIGIN = 0, LENGTH = 12K
4
...

Das neue "linker script" dann mittels -T projektspezifisch bei den 
LDFLAGS angeben. Dann bricht der Linker ab, wenn der Code nicht mehr in 
die "text section" passt:
1
/usr/lib/gcc/avr/4.3.5/../../../avr/bin/ld: build/demo-gpio-atmega8-4.3.5.elf section `.text' will not fit in region `text'
2
/usr/lib/gcc/avr/4.3.5/../../../avr/bin/ld: region `text' overflowed by 7330 bytes

So müsste es gehen, getestet habe ich das nicht, denn es ist ziemlich 
sinnvoll, den Linker nicht abbrechen zu lassen. Das "wertlose" weil zu 
große Kompilat hilft bei der Minimierung des Speicherbedarfs, da es sich 
mit avr-nm analysieren lässt.

Insofern bestünde die andere Möglichkeit darin, ein Skript zu bauen, 
welches die Ausgabe von avr-size auswertet. Das Skript kann dann z. B. 
in einem Makefile ggf. den Build-Vorgang abbrechen.

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.