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.
disassemblieren->befehle zählen->kucken wieviele MIPS dein µC schafft-> Zeit ausrechnen So würde ich das mal versuchen. Gruß CaH
>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.
Vorher und nachher Portpin toggeln, Code in Endlosschleife packen. Frequenz am Portpin mit Oszi messen.
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
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
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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.