Forum: Mikrocontroller und Digitale Elektronik C und Zeitverbrauch


von johnjoe (Gast)


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

von Johannes S. (johanness)


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.

von johnjoe (Gast)


Lesenswert?

Also den Inline Assembler verwenden und dann wie gehabt die 
Verzögerungen aufbauen.

Danke

Gruss

von Joerg X. (Gast)


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

von Rolf Magnus (Gast)


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.

von Peter D. (peda)


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

von johnjoe (Gast)


Lesenswert?

Danke, mit dem Timer hab ich mir dann auch überlegt. Ist wahrscheinlich 
das  Beste und universell. Konkret ist es für einen MSP430.

Gruss

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.