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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.