Forum: Mikrocontroller und Digitale Elektronik WinAvr + AvrStudio


von fubu (Gast)


Angehängte Dateien:

Lesenswert?

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.

von fubu (Gast)


Lesenswert?

Oder könnte Jemand mal den Code auf seinem Avr Studio compilieren und 
schauen wie groß der Code ist?

von Artur L. (arser05)


Lesenswert?

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)

von yalu (Gast)


Lesenswert?

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.

von holger (Gast)


Lesenswert?

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.

von Oliver (Gast)


Lesenswert?

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

von fubu (Gast)


Angehängte Dateien:

Lesenswert?

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.

von holger (Gast)


Lesenswert?

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

von yalu (Gast)


Lesenswert?

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

von fubu (Gast)


Lesenswert?

Aha, super Danke.
Vielen Dank an alle und Gruss.

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.