Hallo Zusammen, habe ein Porblem mit folgendem Quellcode (hier die wichtigsten Schnipsel): ... int f_high = 40; //float T_high = 500/f_high; // 500/40 = 12.5 zwert = 0b00010011; float teiler = 6.8; float timeloop; timeloop = 12.5 + zwert/teiler; ... Problem ist folgendes, wenn ich die 12.5 aus "timeloop =..." durch T_High ersetze, also "timeloop = T_high + zwert/teiler;" so ist meine Codegröße mit einem Schlag von 200Byte auf über 4000Byte angestiegen! Hat jemand eine Idee woran das liegt, bin (als Neuling) total überfragt... Hintergrund: Ich muss aus einigen global definierten Variablen wichtige Werte ermitteln, so dass bei einer späteren Änderung von Variablen nicht der ganze Quellcode noch einmal überarbeitet werden muss. Verwende AVR Studio mit GNU-Compiler, ATMega8 und das Funk-Evaluationsboard von Pollin. Danke für eure Hilfe. Zander
gcc ist wohl nicht mehr in der Lage, den Ausdruck zur Compilezeit auszuwerten, d.h. die Konstante zu falten und zieht die komplette float-libs rein. Hilfreich wäre es zu wissen, was den Platz belegt. Blicks ins Disassemble des elf bringt Klarheit.
Es könnte evtl. auch schon die "-lm" Option im Linker Kommando helfen.
also zuerst einmal: müssen es floats sein? eigentlich schafft man fast jedes AVR Problem mit ein wenig Nachdenken auch mit Festkomma Arithmetik außerdem solltest du dir mal überlegen was da jetzt konstanten sind und was variablen. werte die eigentlich konstant sind in variablen zu schreiben verwirrt etwas (evtl auch den compiler) gruß sebba
GCC ist normalerweise recht gut darin, Variablen bekannten Inhalts in eine spätere Rechnung durchzuschieben. Allerdings gibt es dabei entsprechend der Sprachdefinition und dem zulässigen Aliasing Grenzen: beispielsweise ist Schluss wenn ein Pointer auf den gleichen Datentyp irgendwo rumlungert.
@sebba: wie genau soll das mit der "Festkomma Arithmetik" laufen? bzw. wie könnte es anders aussehen, damit ich Variablen mit zwei Nachkommastellen hab? die einzige globale Variable ist "f_high = 40", "teiler" muss auch noch über eine Funktion verknüpft werden.
Wenn f_high global ist, muss gerechnet werden! Auch wenn es const ist. Falls es also eine globale Konstante ist, nimm #define und nicht const int.
... oder C++, denn das ist einer der subtileren Unterschiede.
Wenn ichs richtig in erinnerung hab stand beim nuesten GCC bzw vor nem Monat oder so dabei, dass es einen bekannten aber noch nicht gefixten bug mit den Fließkommalibs gibt und man sie deshalb mit dem neusten nicht verwenden kann / soll. Kann aber sein das ich mich irre =/ is etwas her. Gruß ErgoProxy Eddie hat grade das gefunden (ganz unten): http://www.mikrocontroller.net/articles/WinAVR#Hilfe.21_Habe_neues_WinAVR_und_das_Datensegement_ist_jetzt_riesig.21_.28WinAVR-20071221.29
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.