Forum: Compiler & IDEs Arithmetikfunktionen in AVR GCC


von dls (Gast)


Lesenswert?

Hallo zusammen,

ich bin dabei, ein älteres C-Programm vom AT90S8515 auf den ATmega8515 
umzusetzen, welches einige Gleitpunktarithmetik-Operationen enthält. Das 
alte Programm wurde mit dem alten IAR C-Compiler unter Embedded 
Workbench geschrieben, jetzt verwende ich AVR Studio und GCC. Dabei 
musste ich feststellen, dass der Maschinencode, welcher damals etwa 80% 
des Programmspeichers beanspruchte, jetzt nicht mehr reinpasst.

Bei genauerer Analyse der Speicherbelegung ist erkennbar, dass der 
ICC-Compiler Arithmetik-Funktionen im Umfang von 1033 Bytes eingebaut 
hat, der GCC-Compiler hingegen 3292 Bytes. Als Optimierung ist -Os 
eingestellt, andere Einstellungen liefern noch mehr Code. Die 
Linker-Option -lm , welche in einem anderen Beitrag vorgeschlagen wurde, 
bringt keine Änderungen.

Gibt es eine Möglichkeit, die Größe des Arithmetikpakets zu verringern 
oder den Compiler dazu zu bringen, dass er nur die Funktionen einbaut, 
die er wirklich braucht?

von (prx) A. K. (prx)


Lesenswert?

Mapfile vom Linker analysieren.

von dls (Gast)


Lesenswert?

Das Mapfile und das Listfile habe ich analysiert. Dort habe ich doch 
gesehen, welche Routinen in welchem Umfang eingebaut werden.

Die Frage ist, gibt es Möglichkeiten, mit ähnlich wenig Maschinencode 
auszukommen wie der IAR-Compiler.

Es werden übrigens nur die Grundrechenarten und Konvertierungen 
verwendet, höhere mathematische Funktionen nicht. Der GCC-Compiler baut 
dafür Library-Funktionen aus der "libgcc.a" im Umfang von mehr als 
3KBytes ein.

Viele Grüße

von Falk B. (falk)


Lesenswert?

@dls (Gast)

>Linker-Option -lm , welche in einem anderen Beitrag vorgeschlagen wurde,
>bringt keine Änderungen.

Sicher? Hast du die auch in Linker angegeben, nicht aus Versehen beim 
Compiler. Ist mir auch schon passiert.

>oder den Compiler dazu zu bringen, dass er nur die Funktionen einbaut,
>die er wirklich braucht?

Macht er sowieso.

MFG
Falk

von (prx) A. K. (prx)


Lesenswert?

Welche Version von WinAVR/avr-gcc? Die von Dezember 2007 hatte einen 
Bug, der bei Fliesskommafunktionen die falsche Arithmetik reinzog, 
nämlich die aus libgcc. Erkennbar an einer seltsamen 256 Bytes grossen 
Datentabelle im RAM. Aktuelle Version von Juni 2008 verwenden.

von dls (Gast)


Lesenswert?

Ich verwende:
 AVR Studio 4.15, Build 623
 und winavr vom 10.6.2008

Aufgefallen ist mit eine Datentabelle von 265 (nicht 256!) Bytes im 
Programmspeicher ganz am Ende mit Werten wie 0000 0001 0202 0303 ...

Die Option -lm habe ich unter [Linker Options] angegeben.

mfg

von (prx) A. K. (prx)


Lesenswert?

Häng mal das Mapfile hier rein.

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


Lesenswert?

Häng auch nochmal das Makefile mit rein.

von Jörg G. (joergderxte)


Lesenswert?

> Die Option -lm habe ich unter [Linker Options] angegeben.
Die "libm" (oder war das libm.so) unter "Libraries" hinzuzufügen, wäre 
wahrscheinlich der "richtigere" Weg im AVR-Studio

hth, Jörg

von dls (Gast)


Lesenswert?

Danke Jörg,

das mit der "libm.a" war wohl der entscheidende Tipp. Das reduziert hier 
den Code um 40% und den verbrauchten RAM um 70%. Ich bin begeistert!

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


Lesenswert?

dls wrote:

> das mit der "libm.a" war wohl der entscheidende Tipp.

Das ist zwar im Prinzip dasselbe wie das Hinzufügen von -lm, jedoch
werden die Linkeroptionen auf der Kommandozeile zu weit vorn
eingetragen.  Dadurch hat dort das Angeben von -lm nicht die
gewünschte Wirkung.

Ist das eigentlich mit der neuesten Version von AVR Studio?  Die
sollte eigentlich -lm immer mit hinzufügen.

von dls (Gast)


Lesenswert?

Ich habe verwendet:
 AVR Studio 4.15, Build 623
 und winavr vom 10.6.2008

-lm stand nicht automatisch mit drin.

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


Lesenswert?

dls wrote:
> Ich habe verwendet:
>  AVR Studio 4.15, Build 623
>  und winavr vom 10.6.2008
>
> -lm stand nicht automatisch mit drin.

Mist, das hätte der Fall sein sollen, so wurde mir zumindest mal
versichert.

von bastler (Gast)


Lesenswert?

Ich möchte mit dem Atmega32 mal einen ganz einfachen Sinuswert 
"sin(45)"als Float ausgeben mit Winavr in einem String. Die LCDAusgabe 
habe ich schon.

Danke.

mfg

von hans (Gast)


Lesenswert?

lcd_string("0.707106781");

(Routinen aus dem Tutorial)

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.