Die minimale und maximale Durchlaufzeit einer Funktion

Gast #1947253
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
Gast #1947282
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...
Gast #1947286
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.
#1947295
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.
Gast #1947296
>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;)
#1947313
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!)
Gast #1947988
> 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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.