44 % Speicher voll - _delay_ms()??

Gast #544085
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
Gast #544091
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?!
Gast #544106
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.
Gast #544194
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
Gast #544231
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?
Moderator Persönliche Seite #544288
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]

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