Hallo,
ich hab im Artikel "http://www.mikrocontroller.net/articles/LED-Fading"
diese Funktion gefunden :
void my_delay(uint16_t milliseconds) {
for(; milliseconds>0; milliseconds--) _delay_ms(1);
verstehe ich nicht. Wofür hat er dort my_delay angelegt???
man kann doch direkt
_delay_ms(Zeit); benutzen ?!
Als Argument von _delay_ms() kann nicht jeder beliebige Wert angegeben
werden, sondern es gibt eine Höchstgrenze, die von der CPU-Taktfrequenz
abhängt. Mit der Funktion my_delay() wird diese Einschränkung beseitigt.
Edi schrieb:
> Als Argument von _delay_ms() kann nicht jeder beliebige Wert angegeben> werden, sondern es gibt eine Höchstgrenze, die von der CPU-Taktfrequenz> abhängt.
Das war mal und ist seit der 2008er Version anders (ok, das
Beispielprogramm wird alt sein), aber es gibt noch einen anderen Grund:
Für die Berechnung wird Fließkomma verwendet. Ist der Wert konstant,
optimiert der Compiler die Berechnungen weg da er das Ergebnis direkt
ausrechnet. Übergibt man _delay_ms dagegen eine Variable werden die
Fließkommaoperationen zur Lauftzeit ausgeführt was viel Zeit und vor
allem Speicher verbraucht.
Längere Wartezeiten müssen dann über einen mehrfachen Aufruf in einer
Schleife gelöst werden. :-) alles klar. Sonst hat das keinen Grund?
Interupts können auch bei _delay_ms(ZEIT); unterbrochen werden?
... ... schrieb:
> Und guck dir dann die Belgung des Flash an (zeigt avrstudio am ende der> Bauens (die Prozentzahlen)
Never try using over-simplified test cases.
Das bringt rein gar nichts. Bedingung für sinnvolle Benutzung von
_delay_ms/_delay_us ist, dass die Optimierung aktiviert ist. Wenn
aber die Optimierung aktiviert ist, dann wird sie deine völlig
überflüssig angebrachte Variable i als Konstante erkennen und
entsprechend eliminieren, womit du identischen Code zu Fall 1
bekommst.
Nein, du musst das i schon zum Funktionsparameter machen und diese
Funktion dann am besten in einer eigenen Datei separat compilieren: