LCD C-Code so groß?

OP #2479099
Lesenswert?

Servus, also entweder steh ich grad auf dem Schlauch oder die Sache ist 
einfach so.

Also, ich hab mir eine LCD Ansteuerung in C geschrieben, der Code ist 
ziemlich an dem auf dem Tutorial angelehnt (leichte Veränderungen hab 
ich vorgenommen).

In der Main.c hab ich einfach mal versuch eine A auf das LCD zu 
schreiben, was auch Prima funktioniert, so wie auch alle anderen 
Funktionen die ich eingebaut hab.

Meine Frage ist nun, wieso ist der Code über 6.5kB groß?
Überseh ich grad irgendwelche Funktionen die den Code aufblasen oder was 
ist da los?

Ich hab hier einen Atmega 8 dort würde ja das Programm noch drauf 
passen, jedoch geht da dann nicht mehr viel mehr drauf.


Das AVR-Studio gibt mir folgendes nach dem compilieren aus:

    AVR Memory Usage
    ----------------
    Device: atmega8
    Program:    6514 bytes (79.5% Full)
    (.text + .data + .bootloader)
    Data:          8 bytes (0.8% Full)
    (.data + .bss + .noinit)


Schon mal danke für eure Hilfe.
Angehängte Dateien:
#2479111
Lesenswert?

Andy Andy schrieb:

> Wusste gar nicht das dass so einen großen Unterschied macht.
> Kann das sein?


Natürlich.

_delay_ms und _delay_us berechnen die Anzahl der notwendigen 
Schleifendurchläufe mittels Floating Point Arithmetik. Macht ja auch 
Sinn, denn ich will ja auch mal 2.5 Millisekunden warten können und dazu 
braucht man Floating Point.

Aber: Ist der Optimizer nicht eingeschaltet, dann bleibt die komplette 
Berechnung inklusive dazu notwendiger Floating Point Arithmetik 
Funktionen im Code erhalten und wird zur Laufzeit ausgeführt.
Ist der Optimizer abe reingeschaltet, dann 'optimiert' der Compiler das 
alles weg, weil dann er selber die Berechnung macht und nur noch das 
Ergebnis weiterbenutzt.
Die Differenz sind dann eben die rund 6kB Code bzw. Wartezeiten die dann 
auch tatsächlich mit den angeforderten übereinstimmen. Denn wenn der µC 
die Berechnung zur Laufzeit machen muss, dann dauert alleine das 
Berechnen der notwendigen Anzahl an Schleifenwiederholungen schon länger 
als zb mittels _delay_us(10.0) angeforderte 10µs.

Fazit:
* bei Benutzung der _delay_xx Funktionen IMMER den Optimizer einschalten
* nur Konstante beim Aufruf angeben, damit der Compiler die
  Berechnung zur Compilezeit machen kann.

All das ist aber im delay.h dokumentiert, ist im AVR-GCC-Tutorial 
dokumentiert und wird hier im Forum jede Woche mindestens 15 mal 
diskutiert.
OP #2479116
Lesenswert?

Super danke für die ausführliche erklärung.

Normal hab ich die Optimierung ja immer an.
Das Tutorial zur delay.h werd ich mir nun mal genauer ansehen, wusste 
gar nicht das es hier sowas gibt.

Jetzt versteh ich das auch mal, warum immer die Rede davon ist, das man 
nur Konstanten beim Aufruf einer delay Funktionen nehmen soll :-))

Besten dank, ich seit großartig :-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren