www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik my_delay Funktion(Artikel LED-Fading) : Wofür?


Autor: Peter (Gast)
Datum:

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

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

Bewertung
0 lesenswert
nicht lesenswert
Peter schrieb:

> man kann doch direkt
> _delay_ms(Zeit); benutzen ?!

Nein, kann man nicht.  Zumindest nicht sinnvoll.

Autor: Edi (Gast)
Datum:

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

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

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

Autor: Peter (Gast)
Datum:

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

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du mit WinAVR arbeitest bau mal folgendes zusammen:

1:
#include <util/delay.h>

int main (void)
{
 _delay_ms(5);
}

2:
#include <util/delay.h>

int main (void)
{
 int i=5;
 _delay_ms(i);
}

Und guck dir dann die Belgung des Flash an (zeigt avrstudio am ende der 
Bauens (die Prozentzahlen)

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

Bewertung
0 lesenswert
nicht lesenswert
... ... 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:
#define F_CPU 1E+6
#include <util/delay.h>

void
delay_ms(uint8_t ms)
{
        do
                _delay_ms(1);
        while (--ms != 0);
}

void
delay_something(uint8_t ms)
{
        _delay_ms(ms);
}

Das Compilat wäre dann:
        .file   "foo.c"
__SREG__ = 0x3f
__SP_H__ = 0x3e
__SP_L__ = 0x3d
__tmp_reg__ = 0
__zero_reg__ = 1
        .global __do_copy_data
        .global __do_clear_bss
        .text
.global delay_something
        .type   delay_something, @function
delay_something:
/* prologue: frame size=0 */
        push r10
        push r11
        push r12
        push r13
        push r14
        push r15
        push r16
        push r17
/* prologue end (size=8) */
        clr r25
        clr r26
        clr r27
        movw r22,r24
        movw r24,r26
        call __floatunsisf
        movw r10,r22
        movw r12,r24
        ldi r18,lo8(0x437a0000)
        ldi r19,hi8(0x437a0000)
        ldi r20,hlo8(0x437a0000)
        ldi r21,hhi8(0x437a0000)
        call __mulsf3
        movw r14,r22
        movw r16,r24
        ldi r18,lo8(0x3f800000)
        ldi r19,hi8(0x3f800000)
        ldi r20,hlo8(0x3f800000)
        ldi r21,hhi8(0x3f800000)
        call __ltsf2
        tst r24
        brge .L2
        ldi r24,lo8(1)
        ldi r25,hi8(1)
        rjmp .L5
.L2:
        ldi r18,lo8(0x477fff00)
        ldi r19,hi8(0x477fff00)
        ldi r20,hlo8(0x477fff00)
        ldi r21,hhi8(0x477fff00)
        movw r24,r16
        movw r22,r14
        call __gtsf2
        cp __zero_reg__,r24
        brge .L6
        ldi r18,lo8(0x41200000)
        ldi r19,hi8(0x41200000)
        ldi r20,hlo8(0x41200000)
        ldi r21,hhi8(0x41200000)
        movw r24,r12
        movw r22,r10
        call __mulsf3
        call __fixunssfsi
        rjmp .L9
.L10:
        ldi r24,lo8(25)
        ldi r25,hi8(25)
/* #APP */
        1: sbiw r24,1
        brne 1b
/* #NOAPP */
        subi r22,lo8(-(-1))
        sbci r23,hi8(-(-1))
.L9:
        cp r22,__zero_reg__
        cpc r23,__zero_reg__
        brne .L10
        rjmp .L12
.L6:
        movw r24,r16
        movw r22,r14
        call __fixunssfsi
        movw r24,r22
.L5:
/* #APP */
        1: sbiw r24,1
        brne 1b
/* #NOAPP */
.L12:
/* epilogue: frame size=0 */
        pop r17
        pop r16
        pop r15
        pop r14
        pop r13
        pop r12
        pop r11
        pop r10
        ret
/* epilogue end (size=9) */
/* function delay_something size 89 (72) */
        .size   delay_something, .-delay_something
.global delay_ms
        .type   delay_ms, @function
delay_ms:
/* prologue: frame size=0 */
/* prologue end (size=0) */
        mov r18,r24
.L15:
        ldi r24,lo8(250)
        ldi r25,hi8(250)
/* #APP */
        1: sbiw r24,1
        brne 1b
/* #NOAPP */
        subi r18,lo8(-(-1))
        brne .L15
/* epilogue: frame size=0 */
        ret
/* epilogue end (size=1) */
/* function delay_ms size 11 (10) */
        .size   delay_ms, .-delay_ms
/* File "foo.c": code  100 = 0x0064 (  82), prologues   8, epilogues  10 */

Ich glaube, der Unterschied ist augenfällig...

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.