www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik C und Zeitverbrauch


Autor: johnjoe (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes Slotta (johanness)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: johnjoe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also den Inline Assembler verwenden und dann wie gehabt die 
Verzögerungen aufbauen.

Danke

Gruss

Autor: Joerg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: johnjoe (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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.