Verzögerung in C

Gast #72339
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
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
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
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
> 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.
Gast
Aha!

Ok, danke dir für die infos!
Hab mal wieder was dazugelernt, und außerdem scheint auch jetzt meine
Zeitverzögerung zu funktionieren!

Jörg

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.