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


von Sascha K. (quad2000)


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.

von CaH (Gast)


Lesenswert?

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

So würde ich das mal versuchen.

Gruß

CaH

von holger (Gast)


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.

von hump (Gast)


Lesenswert?

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

von pastscho (Gast)


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

von assembler (Gast)


Lesenswert?

zyklen, assembler!

von pastscho (Gast)


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

von Gast (Gast)


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

von Gast (Gast)


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.

von Peter D. (peda)


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

von Jadeclaw D. (jadeclaw)


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.

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.