Forum: Compiler & IDEs 44 % Speicher voll - _delay_ms()??


von M@cFreak (Gast)


Lesenswert?

Hallo liebe Leute!

Mal eine Verständnisfrage zu der _delay_ms()-Funktion. Warum ist 44 % 
meines Speichers vom µC voll, wenn ich die Funktion verwende. Muss ich 
da noch was beachten, oder mache ich was falsch???


Danke!

von Marco S (Gast)


Lesenswert?

Hallo.

Das Argument muss zur Kompilierzeit vorliegen. Ein Aufruf von 
_delay_ms(2.5); wird zu einer Schleife optimiert. Rufst du die Funktion 
mit einer Variablen auf, z.B. float time=PINB/10.0; _delay_ms(time); 
werden dementsprechend float-Berechnungen durchgeführt. Aber das steht 
auch in der Doku dazu.

Gruß
Marco

von M@cFreak (Gast)


Lesenswert?

ja, mag sein, aber warum ist dann der Speicher voll? Das kanns doch 
nicht sein, dass ich mit 3mal aufrufen von der Funktion meinen Speicher 
voll habe?!Es muss doch eine Platzsparende Alternative geben, um nicht 
umständlich die Timer zu setzen oder?!

von johnny.m (Gast)


Lesenswert?

Hast Du die Optimierung eingeschaltet? Wenn nicht, dann hol das bitte 
nach. Und wie von Marco schon angedeutet: Das ganze funktioniert nur 
dann, wenn das Argument konstant und zur Compilerlaufzeit bekannt ist. 
Die Funktion arbeitet ansonsten im Programm mit double-Werten und das 
zieht automatisch die Einbindung der float-Bibliothek nach sich. Und die 
braucht richtig viel Speicher.

von M@cFreak (Gast)


Lesenswert?

Aber wie soll ich dann konkret vorgehen, wenn ich doch einfach nur eine 
Verzögerung von beispielsweise 50 ms in meinem Programm haben möchte.?!

von johnny.m (Gast)


Lesenswert?

> Aber wie soll ich dann konkret vorgehen...
Die Optimierung einschalten (sinnvollerweise -Os) und im Programm 
_delay_ms(50) schreiben. Das geht allerdings so nur bei CPU-Frequenzen 
unter ca. 5 MHz. Bei höheren Frequenzen musst Du Dir mit 
mehrfach-Aufrufen behelfen, da die _delay_xx-Funktionen in Abhängigkeit 
von der CPU-Frequenz begrenzt sind (also bei 8 MHz z.B. 2 mal 
hintereinander _delay_ms(25) aufrufen). Die maximale Verzögerung mit 
_delay_ms() ist
also z.B. ca. 32,76 ms bei 8 MHz

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Oder doch gleich 'nen Timer nehmen...

von M@cFreak (Gast)


Lesenswert?

Ja vom speicher wird wohl der Timer am wenigsten brauchen, aber mir ist 
das zu umständlich mit dem Prescaler und daraus dann z.b. eine Sekunde 
zu errechnen, zumindest bei kleineren Programmen.

Und diese Optimierung reduziert den Speicherbedarf? Was ist die 
Optimierung eigentlich?

von Stefan (Gast)


Lesenswert?


von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

M@cFreak wrote:

> Ja vom speicher wird wohl der Timer am wenigsten brauchen, aber mir
> ist das zu umständlich mit dem Prescaler und daraus dann z.b. eine
> Sekunde zu errechnen, zumindest bei kleineren Programmen.

Du solltest dir vermutlich einen anderen Job suchen, als Controller zu
programmieren.  Wenn dir schon die paar Befehle zum Anwerfen eines
Timers zu viel sind, was willst du dann je mehr als einen LED-Blinker
damit bauen können?

Der gängige Weg für sowas ist übrigens eine Art `heartbeat'-Timer, der
via Interrupt in regelmäßigen Intervallen zuschlägt (1 ms, 10 ms, was
auch immer man braucht).  An den hängt man dann alle seine
zeitbezogenen Ereignisse dran: LED-Blinken, Tastenentprellung, ...
Das schreibt man sich ein einziges Mal und benutzt es dann mehr oder
weniger modifiziert in jedem seiner Projekte wieder.

Hat ganz nebenbei den Effekt, dass man in den Pausen den Prozessor
schlafen legen kann, statt dass der umständlich irgendwelche Register
zählen darf, nur weil sein Programmierer ein bisschen denkfaul war.

> Und diese Optimierung reduziert den Speicherbedarf?

Ja.

> Was ist die Optimierung eigentlich?

Bitte frage Wikipedia oder ein gutes Lexikon, wenn du wirklich nicht
weißt, was Optimierung bedeutet.

[edit]Stefan war schneller...[/edit]

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.