C und Zeitverbrauch

Gast #551117
Lesenswert?
• ▲
▼
Hallo,

wie kann man eigentlich in C die Zeit ermitteln, die man pro 
Befehlabarbeitung braucht. In ASM kann man ja die Zyklen zusammenzählen. 
Konkretes Bsp. ist eine Verzögerung mit z.B. einer For-Schleife. Kann 
man das nur durch ausprobieren oder debuggen ermitteln, oder gibt es 
Berechnungsmethoden, um die Zeit während des Programmierens zu 
ermitteln.

Gruss

Johnjoe
#551125
Lesenswert?
• ▲
▼
Lässt sich nicht pauschal sagen, da der Compiler optimiert kommt da 
unter Umständen jedes mal etwas ganz anderes raus. Für 
Verzögerungsschleifen legt man eine Schleife an und verhindert mittels 
einer Inline-Assembler-Anweisung (Kommentar reicht glaub` ich schon) die 
Wegoptimierung der leeren Schleife.
Gast #551131
Lesenswert?
• ▲
▼
für Warteschleifen die mitgelieferten Funktionen nehmen 
(<util/delay.h>), ansonsten im Simulator "mitstoppen", es gibt sowohl 
einen Zyklenzähler als auch 'ne Stoppuhr - und natürlich alle Rechnungen 
dem Compiler überlassen
Gast #551156
Lesenswert?
• ▲
▼
> und verhindert mittels einer Inline-Assembler-Anweisung (Kommentar
> reicht glaub` ich schon) die Wegoptimierung der leeren Schleife.

Wenn man sie 'asm volatile' macht, sollte es reichen.
#551162
Lesenswert?
• ▲
▼
johnjoe wrote:

> wie kann man eigentlich in C die Zeit ermitteln, die man pro
> Befehlabarbeitung braucht.

Wenn man Assembler kann, kann man in das Assemblerlisting schauen.
Mit den entsprechenden Einstellungen (compilerabhängig) kann man die 
C-Zeilen als Kommentar mit einfügen lassen.


> Konkretes Bsp. ist eine Verzögerung mit z.B. einer For-Schleife.

Das ist nun genau ein Fehler, den man immer wieder bei Anfängern sieht 
und der unter Fortgeschrittenen verpönt ist.

Grund ist, daß solche Delays nie stabil arbeiten (compilerabhängig, 
werteabhängig, optimierungsabhängig).

Man nimmt entweder Delayfunktionen aus der Bibliothek oder macht sie mit 
Hilfe eines Timers.

Wenn der Complier keine passende Delayfunktion bereitstellt, schreibt 
man eine, ermittelt deren Laufzeit und ruft sie dann an den benötigten 
Stellen in einer Schleife auf.
Beim AVR-GCC 4.1.1 muß man diese aber in ein separates Objekt packen, 
sonst kann sie seinem Optimierungswahn zum Opfer fallen (unerwünschtes 
Inlining, Reordering).


Peter

Antwort schreiben

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.

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.