Forum: Mikrocontroller und Digitale Elektronik Wie lange läuft diese Schleife?


von Gabi Hoffmann (Gast)


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

von Unbekannter (Gast)


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...

von Christian (Gast)


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.

von Gabi Hoffmann (Gast)


Lesenswert?

Ja ok ....mit t=1 das leuchtet mir ein.!
Arbeite mit dem AVRSTUDIO4 und WINAVR

von Hannes L. (hannes)


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?

...

von Rahul (Gast)


Lesenswert?

@Hannes: Da steht beides drin: Der Programmcode (C) und das, was der
Compiler daraus gemacht hat.

von Hotzplotz (Gast)


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

von Rolf Magnus (Gast)


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 :-)

von Stefan (Gast)


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 ;-)

von Stefan (Gast)


Lesenswert?

Ähm, ich bin blöd! Bei t=10 macht der µC die innerste Schleife mit dem
ganzen Bertel sogar 9 Mal.

von Marco (Gast)


Lesenswert?

Hotzplotz: Wie kann man das denn deiner Meinung nach besser lösen?
Interessiert mich wirklich, da ich meinen Controller auch gerade mit so
einem Notbehelf die Zeit totschlagen lasse...

von anm (Gast)


Lesenswert?

Disassembler müsste helfen....

einfach das cof-file mit avr studio öffnen...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.