Forum: Mikrocontroller und Digitale Elektronik codegröße plötzlich ver-20-facht!?


von zander (Gast)


Lesenswert?

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

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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.

von Werner B. (werner-b)


Lesenswert?

Es könnte evtl. auch schon die "-lm" Option im Linker Kommando helfen.

von sebba (Gast)


Lesenswert?

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

von (prx) A. K. (prx)


Lesenswert?

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.

von zander (Gast)


Lesenswert?

@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.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

... oder C++, denn das ist einer der subtileren Unterschiede.

von Markus (Gast)


Lesenswert?


von Andreas K. (ergoproxy)


Lesenswert?

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
Noch kein Account? Hier anmelden.