Wie lange läuft diese Schleife?

Gast #318318
Lesenswert?

Benutze in meinem Programm öfters eine Warteschleife um Vorgänge
zeitlich zu versetzten. Hierzu verwende ich folgende Funktion

void warte (unint16_t t)
{      unit16_t i,j;
       for (i=1,i<t;i++)
             {
             for (j=1,j<200;j++)
             {asm volatile ("nop");
             }
             }
}

Jetzt mal angenommen, ich rufe die Funktion folgendermassen auf:
warte (1);
zu meinem Fragen?

ist es richtig, das bei t=1 die Schleife 200 Zyklen brauch?
Bei einer Frequenz von 8Mhz ergibt sich dann eine wartezeit von:

1/8.000.000 * 200 ????????

aus irgendwelchen gründen messe ich bei einer Frequenz von 8Mhz einem
t=10 eine Wartezeit von 0,5 ms herraus(mit Oszi) .....Woher kann der
Faktor kommen!


hoffe Irgend jemand kann mir bei diesem peinlichen Problem helfen!

Gabi
Gast #318319
Lesenswert?

> ist es richtig, das bei t=1 die Schleife 200 Zyklen brauch?

Kommt auf den Compiler drauf an...

Aber vermutlich wolltest Du wissen, ob die innere Schleife einmal
durchlaufen wird?

Aber hier gilt: Nein. Die innere Schleife wird mit t=1 kein einziges
mal ausgeführt.

  for(i=1; i<t; i++)

mit t=1 wird zu:

  for(i=1; i<1; i++)

Und da wird der innere Teil nie ausgeführt. "i" ist ja nicht kleiner
als Eins...
Gast #318320
Lesenswert?

Wenn der Compiler die innere Schleife nicht "entrollt" (das heißt auf
Englisch "unroll loops") dann werden ja bereits dort nicht nur 200
NOPs sondern auch die Befehle zum Inkrementieren von j, Vergleichen und
bedingten Springen an den Schleifenanfang ausgeführt. Klarheit schafft
da nur die Listing-Datei des Compiler, denn dann siehst Du, welche
Befehle der uC ausführt und kannst die Zyklen zusammenzählen.
#318322
Lesenswert?

Sorry, ich habe keine Ahnung von C.
Was ist damit gemeint?

> Klarheit schafft
> da nur die Listing-Datei des Compiler, denn dann siehst Du, welche
> Befehle der uC ausführt und kannst die Zyklen zusammenzählen.

Was steht in dieser 'Listing-Datei'? Ist das etwa Assemblercode?

...
Gast #318324
Lesenswert?

Würde solche Schleifen überhaupt vermeiden. Schade um die vergeudete
Zeit, weil der Processor außer Interupts nichts mehr machen kann.
Wird die Schleife dazu noch mit falschen Parametern aufgerufen, kann
er in einer Endlosschleife stecken bleiben. Kein guter Programmierstil
!

SG Hotzplotz
Gast #318325
Lesenswert?

Und wenn ich schon in einer Schleife warte, dann verwende ich dafür die
Funktionen aus der avr-libc. Wenn man die Schleife nicht in Assembler
implementiert, hat man eh keine definierte Anzahl an Zyklen pro
Schleifendurchlauf.

PS @ Hotzplotz: Prima Beispiel dafür, warum man nicht plenken soll :-)
Gast #318326
Lesenswert?

1x 1 an j zuweisen
199x NOP ausführen
200x j um eins erhöhen
200x j mit 200 vergleichen
199x zum NOP in die Schleife springen

Das alles in 0,5 ms ist doch schon einiges an Arbeit für so einen
kleinen Mikrocontroller ;-)

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