www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik WinAvr + AvrStudio


Autor: fubu (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: fubu (Gast)
Datum:

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

Autor: Artur Lauk (arser05)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: fubu (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: fubu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aha, super Danke.
Vielen Dank an alle und Gruss.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.