Hallo, bin eigentlich aus ASM Ecke. Habe mir aus Spaß das neueste AVR-Studio und WinAvr gezogen un habe ein bissl programmiert( siehe Anhang). Erstaunlicherweise verbraucht das bissl Code 45% Flash und 33% Ram ??? Nun ist mir aufgefallen, das wenn ich die Funktion von der PQ-Formel (PQ.h und PQ.c), in die "int main()" packe, der Code nur noch 7% Flash und 4% Ram verbraucht. Was mach ich denn falsch? Vielen Dank im voraus, fubu.
Oder könnte Jemand mal den Code auf seinem Avr Studio compilieren und schauen wie groß der Code ist?
Bei mir siehts so aus: AVR Memory Usage ---------------- Device: atmega8 Program: 3546 bytes (43.3% Full) (.text + .data + .bootloader) Data: 324 bytes (31.6% Full) (.data + .bss + .noinit)
Der Grund für den hohen Speicherverbrauch liegt in der sqrt()-Funktion in PQ.c. Wegen dieser Funktion muss ein Großteil der Floating-Point-Bibliothek gelinkt werden, und diese ist nun mal nicht ganz klein.
Program: 3530 bytes (43.1% Full) (.text + .data + .bootloader) Data: 68 bytes (6.6% Full) (.data + .bss + .noinit) WinAVR 4.1.2 >in die "int main()" packe, der Code nur noch 7% Flash >und 4% Ram verbraucht. >Was mach ich denn falsch? Nichts. Vermutlich machst du dann mit Ergebnis1,2 nichts mehr. Der Compiler erkennt das und streicht die Funktionen komplett weg, weil überflüssig. Mach Ergebnis1,2 doch mal static oder sogar volatile.
Floats bauchen halt viel Code. Da kommt eine Warnung zu sqrt(), es fehlt #include <math.h> Dann hat das Studio die Macke, daß die Mathelib nicht automatisch hinzugelinkt wird. Wenn du die libm.a unter projects/configurations hinzufügst, wird es gleich kleiner. Da kannst du da auch noch die Taktfrequenz eintragen, damit werden die defines von F_CPU in den einzelnen Dateien überflüssig. (das ändert natürlich nichts an der Größe des Compilats). Ergebnis: Device: atmega8 Program: 1668 bytes (20.4% Full) (.text + .data + .bootloader) Data: 60 bytes (5.9% Full) (.data + .bss + .noinit) Die floatingpoint-lib braucht halt Platz. Oliver
Hallo, erstmal danke für die Hilfe. Dachte schon ich bin total bescheuert^^. Also wenn ich wie gesagt die Funktion PQ mir spare und es direkt in der main() reinschreibe, ist der Code nur 7% groß. Und das Ergebnis erscheint auch richtig auf dem Display, das ist ja das seltsame? Also muss das Wurzel ziehen und so ja durchgeführt worden sein. Kann mir Jemand erklären, warum das so ist. Im Anhang mal das Projekt mit der Pq-Formel im main(), welche wie gesagt auf dem Display die richtigen Ergebnisse liefert? Könnt ihr ja mal compilieren, Flash 7,9%, Ram 4,6%. Vielen Dank, fubu.
>Also muss das Wurzel ziehen und so ja durchgeführt worden sein. >Kann mir Jemand erklären, warum das so ist. Das hat der Compiler schon ausgerechnet weil alle Werte bekannt sind: lcd_data(Ergebnis1); 74: 86 e3 ldi r24, 0x36 ; 54 76: 33 d0 rcall .+102 ; 0xde <lcd_data> Das Ergebnis wird als Konstante ausgegeben.
> Also muss das Wurzel ziehen und so ja durchgeführt worden sein. Kann > mir Jemand erklären, warum das so ist. Da jetzt sowohl die Formeln als auch die enzusetzenden Variablenwerte in einer Datei stehen, kann der Compiler die Berechnung bereits während des Kompilierens durchführen. Sind Formeln und Werte auf mehrere .c-Dateien verteilt, geht das nicht, weil der Compiler immer nur eine Datei auf einmal zu Gesicht bekommt.
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.