mikrocontroller.net

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


Autor: Gabi Hoffmann (Gast)
Datum:

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

Autor: Unbekannter (Gast)
Datum:

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

Autor: Christian (Gast)
Datum:

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

Autor: Gabi Hoffmann (Gast)
Datum:

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

Autor: Hannes Lux (hannes)
Datum:

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

...

Autor: Rahul (Gast)
Datum:

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

Autor: Hotzplotz (Gast)
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

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

Autor: Stefan (Gast)
Datum:

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

Autor: Stefan (Gast)
Datum:

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

Autor: Marco (Gast)
Datum:

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

Autor: anm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Disassembler müsste helfen....

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

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.