Forum: Mikrocontroller und Digitale Elektronik unbenutze funktionen entfernen


von Tino K. (blumengiesser)


Angehängte Dateien:

Lesenswert?

ich habe den artikel in der kategorie compiler: GCC: unbenutzte 
Funktionen entfernen gelesen aber das scheint nicht zu klappen. ich habe 
die version 4.18 von AVR Studio, standartinstallation ohne änderungen 
und Winavr 20100110. Eingetragen ist im AVR Studio unter Custom Compiler 
Option alles siehe bild (standard?). trage ich jetzt die dinge

-ffunction-sections
-fdata-sections

und

--gc-sections

ein ändert sich zwar das aussehen des compilerergebnisses aber die 
programmspeichergröße bleibt die gleiche. kommentiere ich befehle aus, 
die ich nicht brauche dann wir das programm wie erwartet kleiner.

Habe ich etwas nicht beachtet?

von Guru (Gast)


Lesenswert?

Ich denke Du hast das: "Wird der Linker nicht direkt aufgerufen, sondern 
über das Compiler-Frontend (avr-gcc/arm-*-gcc) gelinkt, ist die Option 
per -Wl,--gc-sections zu übergeben." nicht beachtet.
Der Linker wird nicht in dem Dialog eingetragen, also wird er wohl über 
das gcc-frontend aufgerufen, oder was meinst Du?

von Tino K. (blumengiesser)


Lesenswert?

wenn ich diese beiden funktionen in der linker zeile eintrage ist auch 
nix anders als zuvor...

von Guru (Gast)


Lesenswert?

Bei mir funktioniert es.

Kontrolliere mal die Meldungen beim kompilieren. Da muss was wie

avr-gcc -mmcu=atmega32 -Wl,--gc-sections -Wl,-Map=xxx.map xxx.o -o 
xxx.elf

stehen.

Der Dialog zum setzen der Option ist unbedingt mit dem Button "Add" zu 
bestätigen. Man könnte dazu neigen, einfach auf "OK" zu drücken, nachdem 
man die Option in das Feld eingegeben hat. Falls das nicht geklappt hat 
fehlt die Option in der Meldungsausgabe.

von Guru (Gast)


Lesenswert?

Ergänzung:

Kontrolliere auch die eigentliche Meldung vom compilieren:

avr-gcc  -mmcu=atmega32 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char 
-funsigned-bitfields -fpack-struct -fshort-enums -ffunction-sections 
-fdata-sections  -MD -MP -MT xxx.o -MF dep/xxx.o.d  -c  ../xxx.c

von Guru (Gast)


Lesenswert?

>wenn ich diese beiden funktionen in der linker zeile eintrage ist auch
nix anders als zuvor...

Vorsicht! Abgesehen davon das es sich hier nicht um "Funktionen" sondern 
um "Optionen" handelt, sind es nicht "zwei" sondern eine. Das muss als 
ein Eintrag in das Feld eingegeben und mit Add bestätigt werden. Es 
darf also kein Leerzeichen in der Meldungsausgabe zwischen "-W1" und 
"--gc-sections" stehen sondern ein Komma ohne jedes Leerzeichen. Gib 
direkt "-Wl,--gc-sections" als einen Eintrag in das Dialogfeld ein.

von Tino K. (blumengiesser)


Lesenswert?

OK, ich habe das jetzt als ein feld eingetragen. hier die compiler 
meldung mit dem Eintrag:


Build started 20.3.2011 at 09:29:50
avr-gcc -I"E:\TinoKuehn\AVR\myAlphaSteuerungv3\."  -mmcu=atmega8 -Wall 
-gdwarf-2 -std=gnu99 -Os -funsigned-char -funsigned-bitfields 
-fpack-struct -fshort-enums -MD -MP -MT dog_m163.o -MF dep/dog_m163.o.d 
-c  ../dog_m163.c
avr-gcc -mmcu=atmega8 -Wl,--gc-sections  -Wl,-Map=interrupt.map 
interrupt.o atmega8Timer.o dog_m163.o myAlphaFunctions.o    -lc  -o 
interrupt.elf
avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature 
interrupt.elf interrupt.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" 
--change-section-lma .eeprom=0 --no-change-warnings -O ihex 
interrupt.elf interrupt.eep || exit 0
avr-objdump -h -S interrupt.elf > interrupt.lss


hier ohne:

rm -rf interrupt.o atmega8Timer.o dog_m163.o myAlphaFunctions.o 
interrupt.elf dep/* interrupt.hex interrupt.eep interrupt.lss 
interrupt.map
Build succeeded with 0 Warnings...
avr-gcc -I"E:\TinoKuehn\AVR\myAlphaSteuerungv3\."  -mmcu=atmega8 -Wall 
-gdwarf-2 -std=gnu99 -Os -funsigned-char -funsigned-bitfields 
-fpack-struct -fshort-enums -MD -MP -MT interrupt.o -MF 
dep/interrupt.o.d  -c  ../interrupt.c
avr-gcc -I"E:\TinoKuehn\AVR\myAlphaSteuerungv3\."  -mmcu=atmega8 -Wall 
-gdwarf-2 -std=gnu99 -Os -funsigned-char -funsigned-bitfields 
-fpack-struct -fshort-enums -MD -MP -MT atmega8Timer.o -MF 
dep/atmega8Timer.o.d  -c  ../atmega8Timer.c
avr-gcc -I"E:\TinoKuehn\AVR\myAlphaSteuerungv3\."  -mmcu=atmega8 -Wall 
-gdwarf-2 -std=gnu99 -Os -funsigned-char -funsigned-bitfields 
-fpack-struct -fshort-enums -MD -MP -MT dog_m163.o -MF dep/dog_m163.o.d 
-c  ../dog_m163.c
avr-gcc -I"E:\TinoKuehn\AVR\myAlphaSteuerungv3\."  -mmcu=atmega8 -Wall 
-gdwarf-2 -std=gnu99 -Os -funsigned-char -funsigned-bitfields 
-fpack-struct -fshort-enums -MD -MP -MT myAlphaFunctions.o -MF 
dep/myAlphaFunctions.o.d  -c  ../myAlphaFunctions.c
avr-gcc -mmcu=atmega8 -Wl,-Map=interrupt.map interrupt.o atmega8Timer.o 
dog_m163.o myAlphaFunctions.o    -lc  -o interrupt.elf
avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature 
interrupt.elf interrupt.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" 
--change-section-lma .eeprom=0 --no-change-warnings -O ihex 
interrupt.elf interrupt.eep || exit 0
avr-objdump -h -S interrupt.elf > interrupt.lss

das ohne ist deutlich mehr. aber die % des programmspeicherverbrauchs 
sind komplett gleich...

von Guru (Gast)


Lesenswert?

Jetzt fehlen die Optionen

-ffunction-sections
-fdata-sections

für den Compiler bei der Compilation der einzelnen Files.

Das beim zweiten Mal mehr Dateien kompiliert wurden, ignoriere erstmal.
Das muss eine andere Ursache haben.

von Tino K. (blumengiesser)


Lesenswert?

Ja wenn man weiß was man machen muss, doch recht einfach. Jetzt geht es. 
Vielen Dank!

von Guru (Gast)


Lesenswert?

Genau: Kaum macht man's richtig, geht's. ;-)

Gern geschehen.

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.