Forum: Mikrocontroller und Digitale Elektronik Die minimale und maximale Durchlaufzeit einer Funktion


von Maxi (Gast)


Lesenswert?

Hallo, liebe Elektroniker!


Ich schreibe gerade an einer Funktion, die in einer oder mehreren 
IRQ-Routinen aufgerufen werden soll. Da das ganze zeitkritisch ist, 
würde ich gerne im Vorhinein wissen, wie viel Zeit die Funktion maximal 
benötigt. Es kommen auch ein paar IF-Verzweigungen vor, die die Laufzeit 
entsprechend beeinflussen können.

Ich verwende Codevision und programmiere einen ATXMEGA128A1.
Gibt es im AVR-Studio die Möglichkeit, die maximale und minimale 
Durchlaufzeit einer Funktion berechnen zu lassen?


Vielen Dank im Voraus.


LG

Maxi

von Klaus W. (mfgkw)


Lesenswert?

Da wirst du schon selber rechnen müssen, fürchte ich.

von hui buh (Gast)


Lesenswert?

Würde es gehen, wenn man zu Beginn der Funktion einen Timer startet, der 
eine Variable inkrementiert und am Ende der Funktion den Timer stoppt 
und die Variable ausliest. Wird diese z.B. alle 100µS inkrementiert 
hätte man doch teheoretisch eine Annäherung. Oder würde das selber zu 
viel Zeit kosten?
Ist jetzt eine Idee, würde gerne zur Diskussion stellen wie brauchbar 
sie ist...

von fluxbesen (Gast)


Lesenswert?

Das mit dem Timer sehe ich kritisch. Da der ja auch alle 100µS dann 
einen Interupt feuert, derauch wieder Zeit kostet, in dem die Variable 
inkrementiert wird.

von Markus (Gast)


Lesenswert?

Warum muss der Interrupt die ganze Zeit feuern? Nachdem die Funktion 
fertig ist, Timer auslesen und gut is.

von Peter R. (pnu)


Lesenswert?

Da ist doch ein Timer das Passende: Zu Beginn der Funktion den Timer 
starten oder auf Null setzen und am Ende der Funktion den erreichten 
Timerstand lesen. Es gibt ja sogar 16-Bit-Timer. (Also nix Timer-Int)

Dann eben die Parameter der Funktion solange variieren bis die größte 
Lauflänge festgestellt ist. Bei etwas Kenntnis der Vorgänge in der 
Funktion oder deren Algorithmus ließe sich das schon machen. Dabei fühlt 
man sich aber nur wohl, wenn das ganze in Assembler geschrieben ist. 
Wenn da erst einmal irgendwelche Bibliotheken oder gar Compiler 
mitmischen wirds Lotteriespiel.

von holger (Gast)


Lesenswert?

>Ich schreibe gerade an einer Funktion, die in einer oder mehreren
>IRQ-Routinen aufgerufen werden soll.

Au weia falls nested Interrupts erlaubt sind.

Die einfachste Debug Methode der Welt:
Am Anfang der Routine einen IO Pin setzen.
Am Ende der Routine den IO Pin löschen.
Osci dran und Zeit messen. Dann hast du ungefähr
die Zeit die deine Routine braucht.

>Es kommen auch ein paar IF-Verzweigungen vor, die die Laufzeit
>entsprechend beeinflussen können.

Viel Spass dabei alle Möglichkeiten durchzuprobieren;)

von Chris L. (kingkernel)


Lesenswert?

Steppe deine Funktion mit allen möglichen Parameterkombinationen (hehe, 
viel Spaß, das können bei manchen Funktionen schon mal gern über 10000 
sein) im Simulator durch! dann kannste am Cycle-Counter die genaue 
Anzahl der Prozessortakte/Instruktionen ablesen und mit Hilfe der 
Taktfrequenz in die entsprechende Zeit umrechnen.
Oder muss es unbedingt an der zielhardware sein, weil unter umständen 
noch auf was anderes gewartet werden muss (Was schlecht ist, da eine IRQ 
möglichst kurz sein soll. Einfach nur Variablen setzen und den Rest dann 
in der Mainloop!)

von Maxi (Gast)


Lesenswert?

Ach, warum muss man nur immer so kompliziert denken.
Die Idee mit dem Portpin ist absolut genial.

Danke Leute.
Maxi

von MaWin (Gast)


Lesenswert?

> Durchlaufzeit einer Funktion berechnen zu lassen?

Allgemein ist das natürlich nicht möglich,
Gundkurs Informatik Halteproblem.

Aber wenn du nur if's hast, also keine Schleifen,
solltest du ein Assembler-Listing ausgeben lassen,
neben den Instruktionen die Maschinenzyklen hinschreiben,
und min/max der verschiedenen Wege bilden.

Je nach Compilereinstellungen kommt was vercshiedenes
raus.

Das geht bei so einfachen Prozessoren ohne cache und
anderen Schweinerein noch recht gut, aber nicht
automatisiert.


Ein Messen von Beispielen kann natürlich immer mal
unvollständig sein, auserdem muss man den code erst
in seiner Umgebung ablaufen lassen.

von Alexander S. (esko) Benutzerseite


Lesenswert?

MaWin schrieb:
>> Durchlaufzeit einer Funktion berechnen zu lassen?
> Allgemein ist das natürlich nicht möglich,
> Gundkurs Informatik Halteproblem.

Natürlich ist das allgemein möglich!

Das Halteproblem sagt nur aus, dass diese Berechnung der Laufzeit genau 
solange dauern kann wie die Ausführung des Programms selbst.

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.