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?
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
@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
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.
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
> 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
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!
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.
Ich habe verwendet: AVR Studio 4.15, Build 623 und winavr vom 10.6.2008 -lm stand nicht automatisch mit drin.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.