www.mikrocontroller.net

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


Autor: Maxi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da wirst du schon selber rechnen müssen, fürchte ich.

Autor: hui buh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: fluxbesen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Markus (Gast)
Datum:

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

Autor: Peter R. (pnu)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;)

Autor: Chris L. (kingkernel)
Datum:

Bewertung
0 lesenswert
nicht 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!)

Autor: Maxi (Gast)
Datum:

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

Danke Leute.
Maxi

Autor: MaWin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Alexander Schmidt (esko) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.