Verzögerung in C

Gast #72339
Lesenswert?

Hallo!
Kann mir mal jemand einen Tip geben wie man eine ganz einfache
Verzögerung in C programmiert, nur ein paar Takte, braucht nicht
großartig präzise zu sein. Da müsste doch eine einfache Schleife wie

for(i=0;i=100;i++
{}
reichen, oder? Irgendwie funktioniert das aber nicht.
Wird das ev. wegoptimiert vom Compiler?

Danke Jörg
Gast #72340
Lesenswert?

wenn schon, dann müsste das so heissen:
for(i=0;i<100;i++)
{}

Da solch eine Sache an sich keine Wirkung hat (ausser Zeit zu
verbrauchen) könnte es schon sein, dass ein Compiler die
"wegoptimiert", glaube ich aber nicht.
Gast #72341
Lesenswert?

lass ihn was machen, also:

for(i=0;i<100;i++)
 asm volatile (" nop");

Aber einen Durchlauf macht er im Mikrosekundenbereich, wennst lange
Zeiten brauchst musst halt verschachteln:
for(j=0;j<10000;j++)
for(i=0;i<10000;i++)
 asm volatile (" nop");

i und j müssen aber 16bit Integer sein.
Gast #72342
Lesenswert?

Doch doch, avr-gcc ist bekannt dafür, diese zumindest
,,kleinzuoptimieren''.  Wenigstens sollte man also

for (i = 0; i < XXX; i++)
  asm volatile ("nop");

schreiben.

Besser ist es, Schleifen mit genau bekannten Zyklenzahlen zu benutzen.
Bei der avr-libc gibt's sowas in <avr/delay.h>, andere Compiler
bieten
sicher etwas ähnliches an.

Für alles, was mehr als ein paar 100 µs ist, nimmt man dann sowieso
besser einen Hardware-Timer.  Dafür sind sie ja da.
Gast #72346
Lesenswert?

> asm volatile (" nop");

> Was bedeutet das genau?

asm -- eine Ausflucht zum Assembler (auch `inline assembler' genannt)
volatile -- der Compiler darf die Lage der Anweisung nicht optimieren
"nop" -- der eigentliche Assemblerbefehl, ein Null-Befehl

Das Ganze ist GCC-Syntax, andere Compiler machen das geringfügig
anders, z. B. mittels #pragma asm, oder sie haben einen Makro _NOP()
dafür.

Der Sinn der Sache ist, daß im Body der Schleife eine Anweisung steht,
die der Compiler nicht wegoptimieren darf.

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