mikrocontroller.net

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


Autor: M@cFreak (Gast)
Datum:

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

Autor: Marco S (Gast)
Datum:

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

Autor: M@cFreak (Gast)
Datum:

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

Autor: johnny.m (Gast)
Datum:

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

Autor: M@cFreak (Gast)
Datum:

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

Autor: johnny.m (Gast)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder doch gleich 'nen Timer nehmen...

Autor: M@cFreak (Gast)
Datum:

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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

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.