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
Da wirst du schon selber rechnen müssen, fürchte ich.
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...
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.
Warum muss der Interrupt die ganze Zeit feuern? Nachdem die Funktion fertig ist, Timer auslesen und gut is.
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.
>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;)
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!)
Ach, warum muss man nur immer so kompliziert denken. Die Idee mit dem Portpin ist absolut genial. Danke Leute. Maxi
> 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.