www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik for schleife


Autor: Robert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
bis heute bin ich davon ausgegangen das ich hiermit:

for(x=0;x<=500;x++){
 for(x=0;x<=30000;x++){
 }
}

bei einem ATMEGA mit 16 MHz Taktfrequenz ca 1 Sekunde Verzögerung habe.
Es sind aber ca 6 Sekunden.
Bitte klärt mich auf ;-)

Robert

Autor: Robert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ups in der inneren schleife muss natürlich y oder so statt x stehen.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Bitte klärt mich auf ;-)"

Es kann schlichtweg alles passieren, völlig abhängig von Variablentyp,
Compilerversion und Optimierungslevel.

Daher ist sowas einfach nur sauschlechter Programmierstil (nicht
portabel, nicht reproduzierbar).

Entweder man nimmt die Delay-Funktion oder einen Timer, alles andere
ist reiner Zufall.


Peter

Autor: ---- (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, weil die "Verwaltung" der Schleife auch Zeit braucht
(Sprungbefehl, Vergleiche und Inkrementieren der Wortvariable x und y)

----, (QuadDash).

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das liegt weniger an der Verwaltung der Schleife (aber auch).
Du steckst einfach nicht dahinter, wie der Compiler das umsetzt. Geht
damit los, wo die Variablen abgelegt werden (liegen sie in Registern,
ist der Kram deutlich schneller als im RAM), ein anderer Compiler (oder
auch nur eine neuere Version des selben Conmpilers) bringen völlig
andere Ergebnisse, ebenso die Optimierungseinstellungen.
Fazit: Finger weg von solchem Krimskrams.
In Assembler kann man es in der Art machen, in einer Hochsprache nicht.

Autor: pücksen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nunja, also mit 16MHz macht man 16 millionen Cycles.
Das was du machst, sind 15 millionen schleifendurchgänge einer
For-Schleife in C.
Und das Abarbeiten einer C-Instruktion dieser Gattung dauert mehr als
nur einen Takt.

Was ein wenig mehr deine Rechnung aufgehen lassen würde, wär folgender
asm code:
(natürlich müsstest du den code noch an deine Umgebung anpassen)

mov reg1, 16000000 ;(24 bits sind da ausreichend)
loop0:
inc reg1
xor reg1, x  ;setzt zero-flag, wenn reg1 und x gleich sind
jnz loop0    ;springt zu loop0, wenn zero-flag nicht gesetzt ist

Nun addierst du die Anzahl der benötigten Taktzyklen der einzelnen
Instruktionen
inc [reg]
xor [reg], const
jnz (bedingter Sprungbefehl)
zusammen.
16000000 geteilt durch diese Zahl ist x.

Wenn das ganze nun 5 Taktzyklen braucht, läuft die Schleife 3200000 mal
durch. Und das in ziemlich genau einer Sekunde.
sorry für den schlechten code, hab noch nie einen atmel programmiert :)

Autor: pücksen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
naah, sorry, reg1 muss natürlich auf 0 initalisiert werden ;)

Autor: Robert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
war dann wohl ein denkfehler dass von asm zu übertragen.

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.