mikrocontroller.net

Forum: Compiler & IDEs Arithmetikfunktionen in AVR GCC


Autor: dls (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mapfile vom Linker analysieren.

Autor: dls (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: dls (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Häng mal das Mapfile hier rein.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Häng auch nochmal das Makefile mit rein.

Autor: Jörg G. (joergderxte)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: dls (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: dls (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe verwendet:
 AVR Studio 4.15, Build 623
 und winavr vom 10.6.2008

-lm stand nicht automatisch mit drin.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: bastler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
lcd_string("0.707106781");

(Routinen aus dem Tutorial)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.