mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Wie finde ich die Zeit herraus, die ein Befehl in C in meinem µC benötigt?


Autor: Sascha K. (quad2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo an alle,

ich muss ein Projekt verwirklichen, bei dem Zeiten eine grosse Rolle 
spielen. Nun sollte ich herausfinden, wie lange einzelne Schritte 
benötigen.
Als µC verwende ich ein Atmel 89C51CC03 (8051 Architektur).
Ich Programmiere in C und C++.

Ich habe Grundwissen in Assembler, das man meines Wissens nach benötigt, 
um die Zeiten zu ermitteln. Aber mein Wissen ist nicht sehr weitreichend 
da das letzte mal als ich mit Assembler zu tun hatte schon viele Jahre 
zurückliegt.

Kann mir jemand dabei Helfen?
Ich sollte für folgende Programmteile die Zeit wissen, die sie benötgen, 
um 1 mal durchzulaufen:

    while (i!=10)
          {
          if (test[i] > max)
              {
                  max = test[i];
              }
          i++;
          }

Danke für die Hilfe.

Autor: CaH (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
disassemblieren->befehle zählen->kucken wieviele MIPS dein µC schafft-> 
Zeit ausrechnen

So würde ich das mal versuchen.

Gruß

CaH

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ich Programmiere in C und C++.

C++, na danke schön.
Es gibt keine festen Zeiten für einen C Befehl.
Der Compiler macht dir irgendwas aus deinem Code.
Und zwar so wie er es für richtig hält.
Eine Zeile Code mehr und das Verhalten des Compilers
kann sich vollständig ändern.

Mit Optimizer wirds dann richtig wild.

Die einzige Chance die du hast ist ins ASM Listing
zu schauen, oder den erzeugten ASM Code evtl. durch
einen Simulator laufen zu lassen.

Autor: hump (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vorher und nachher Portpin toggeln, Code in Endlosschleife packen.
Frequenz am Portpin mit Oszi messen.

Autor: pastscho (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder wie wäre es gleich statt die schleife in C zu schreiben in 
Assambler!

geht ja ohne probleme das man Assambler in ein C-Programm packt da müste 
der Compiler den Code eigentlich so stehn lassen!

Das heist du must einfach den inhalt von der while schleife als 
Assamblerprogramm schreiben.

Und wenn du mal mit Assambler gearbeitet hast auch wenns schon länger 
her is müste das mach kurzem lesen des Befehlssatzes gehen!

Hoffe dir hilfts

ps: dann kannste ja über befehlszücklen die zeit eines 
schleifendurchlaufs errechnen.


MFG
pastscho

Autor: assembler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
zyklen, assembler!

Autor: pastscho (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Z.b. ein nop befehl braucht 1 Zyklus (Maschienenzyklen)
beim 8051 wäre das zeit eines Taktzykluss mal 12
d.h.
10MHz = 0,1µs
das mal 12 = 1,2µs

das heist insgesamt das der nop Befehl 1,2µs brauch um vom µC 
abgearbeitet zu verden!

Und so hat jeder befehl seine eigenen zyklen die bei einer Befehlsliste 
meist dabeistehen!

hoffe hilft

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meines Erachtens kann man hier sowieso keine Feste Zeit angeben, weil ja 
nicht bekannt ist, wie oft denn der innere Teil ueberhaupt abgearbeitet 
wird.
Man kann also eventuell in Assembler berechnen wie lange mindestens(wenn 
die Zuweisung gar nicht abgearbeitet wird)
oder maximal (wenn   if (test[i] > max) immer zutrifft) der Teil 
braucht.
  while (i!=10)
          {
          if (test[i] > max)
              {
                  max = test[i];
              }
          i++;
          }

Gast

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meines Erachtens kann man hier sowieso keine Feste Zeit angeben, weil ja 
nicht bekannt ist, wie oft denn der innere Teil ueberhaupt abgearbeitet 
wird.
Man kann also eventuell in Assembler berechnen wie lange mindestens(wenn 
die Zuweisung gar nicht abgearbeitet wird)
oder maximal (wenn   if (test[i] > max) immer zutrifft) der Teil 
braucht.
  while (i!=10)
          {
          if (test[i] > max)
              {
                  max = test[i];
              }
          i++;
          }

Gast


PS. "... bei dem Zeiten eine grosse Rolle spielen."
Falscher Ansatz, hier hilft - nach Betrachtung, wie eng es denn nun 
wirklich ist - nur Assembler.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sascha K. wrote:

> Ich sollte für folgende Programmteile die Zeit wissen, die sie benötgen,
> um 1 mal durchzulaufen:

Wenn Die Variablen float sind und das Speichermodell Large und 
Optimierung -O0, dann dauerts länger, als bei unsigned char, Small und 
-Os.


Genauer kann man das bei so wenig Informationen nicht sagen.


Peter

Autor: Jadeclaw Dinosaur (jadeclaw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Allgemein betrachtet sollte man Zeitkonstanten, vorallem wenn sie 
absolut exakt sein müseen, wie z.B. für Uhren und Frequenzzähler, nicht 
per Programmcode realisieren, sondern einen Timer benutzen, da diese 
elektrisch fest am Quarz hängen. Der sorgfältig ausgepegelte Code kann 
sich nämlich nach einem Lib/Compiler-Update völlig anders verhalten. 
Reiner Assembler ist zwar unkritischer, einfach wartbarer und 
wiederverwendbarer Code ist aber auf diese Weise schlecht realisierbar.

Gruß
Jadeclaw.

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.