www.mikrocontroller.net

Forum: Compiler & IDEs Dauer der ISR-Funktionen


Autor: Owen Senmeis (senmeis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Servus,

ich schreibe gerade Programme für den Atmega128 mit dem AVR Studio. Nun 
möchte ich wissen, wie lange eine ISR-Funktion dauert. Muss man diese 
Dauer mit dem generierten Code selber rechnen oder gibt's bessere 
Lösungen? Wie lässt sich der generierte Code im AVR Studio darstellen?

MfG
Senmeis

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im AVR-Studio, im Debugger, hast du im Prozessorfenster eine Stopuhr und 
einen Zyklenzähler. Damit kannst du ziemlich gut abschätzen, wie lange 
ein ISR Aufruf benötigt. Wenns noch genauer sein soll: Vom Compiler ein 
Listing anfordern und die exakten Zyklen mit der Hand ausrechnen.

Autor: Owen Senmeis (senmeis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank.

Ich habe das List File mit dem AVR Stuido generieren lassen. In diesem 
File gibt es 130 Befehle, also wie folgt:
ISR(ADC_vect) 
{
  bc78:  1f 92         push  r1
  ...
  bd7c:  1f 90         pop  r1
bd7e:  18 95         reti
Kann man damit ausrechnen, dass die Bearbeitungszeit dieser ISR

130/8MHz = 16,25us

beträgt, wobei 8MHz meine Taktfrequenz ist?

MfG
Senmeis

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein. Nicht jeder Befehl benötigt 1 Takt. Und nicht jeder Befehl wird 
ausgeführt, wenn sich darunter auch Sprungbefehle befinden sollten.

Autor: 900ss D. (900ss)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falls du ein Scope und einen freien Portpin hast...
ISR(xyz)
{
  Portpin=On;
  Tu sonst was.....
  Portpin=Off;
}

Und dann mit dem Scope die Zeit messen, die der Portpin auf 1 ist.
Allerdings berücksichtigt das natürlich nicht unterschiedlich lange 
Laufzeiten, falls du "if" o.ä. in der ISR hast. Wenn alle Wege 
durchlaufen werden siehst du auf dem Scope eben einen Jitter und kannst 
auch die längste Laufzeit erkennen.

Autor: Owen Senmeis (senmeis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich gehe davon aus, dass meiste Befehle einen Takt benötigen (Zitat aus 
dem Handbuch: “133 powerful instructions – most single clock cycle 
execution”). In dieser ISR-Funktion gibt es keine weitere Aufrufe auf 
andere Funktionen. Ist meine Aussage guelgit mit diesen Voraussetzungen?

Senmeis

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Owen Senmeis schrieb:
> Ich gehe davon aus, dass meiste Befehle einen Takt benötigen (Zitat aus
> dem Handbuch: “133 powerful instructions – most single clock cycle
> execution”). In dieser ISR-Funktion gibt es keine weitere Aufrufe auf
> andere Funktionen. Ist meine Aussage guelgit mit diesen Voraussetzungen?

nö..ein Blick ins Instruction Set Summary würde helfen...push und pop 
brauchen z.B. beide 2 Takte...

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Owen Senmeis schrieb:
> Ist meine Aussage guelgit mit diesen Voraussetzungen?

Klar. Nur fragt man sich, was du davon hast eine Aussage aufgrund von 
unrealistischen Voraussetzungen zu treffen. :-)

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Owen Senmeis schrieb:

> andere Funktionen. Ist meine Aussage guelgit mit diesen Voraussetzungen?

Nach dem Motto: Wenn 10 Befehle von 100 in der CPU-Dokumentation 2 Takte 
braucht ist die Laufzeit 10% grösser? Unsinn, diese statische 
Befehlsverteilung interessiert nur die Verkäufer.

Die Maschine interessiert sich eher für die dynamische 
Befehlsverteilung. Und da spielen die 2-Takt Befehle eine nicht 
unwesentliche Rolle.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Und nicht jeder Befehl wird ausgeführt,
> wenn sich darunter auch Sprungbefehle befinden sollten.
Und die Allerbesten programmieren noch (Warte-)Schleifen in die ISR  :-o

> Nun möchte ich wissen, wie lange eine ISR-Funktion dauert.
Nimm den Simulator und dessen Stoppuhr...

Autor: Thomas K. (tomk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

> Nimm den Simulator und dessen Stoppuhr...

das ist meiner Kenntnis nach der sinnvollste Weg. Außer Du willst jeden 
Befehl zählen und das in jeder Sprungvariante ... :-)

(ein bischen Schleichwerbung :-)) ) Für den Simulavr gibt es eine 
(allerdings noch nicht ganz offizielle) Entwicklung, wo Du Dir mit 
gtkwave nach der Simulation anschauen kannst, wann und wie lange Deine 
ISR gelaufen ist. Allerdings gibt's das eben noch nicht offiziell und 
auch nur für eine handvoll Prozessoren (M128, und die Mx8-Serie)

Schönen Tag noch, Thomas

Autor: Owen Senmeis (senmeis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Inzwischen habe ich mir doch den Simulator im AVR Studio angeschaut. 
Leider finde ich wenig praktische Informationen zu diesem Thema.

1. Was ist die Frequenz im Prozessorfenster im Debugger ("The frequency 
in megahertz read from the debug platform.  Usually selected by the 
user."). Ist diese die Taktfrequenz?

2. Soweit ich verstehe, müssen ISR-Funktionen hardwaremäßig getriggert 
werden, um überhaupt zu laufen. Wie werden z.B. analoge Werte im 
Simulator geändert?

3. Gibt's ausführliche Gebrauchsanweisungen darüber?

MfG
Senmeis

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn die ISR bei 8MHz 123 Takte braucht, dann braucht sie auch bei 4MHz 
123 Takte.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Owen Senmeis schrieb:

> 1. Was ist die Frequenz im Prozessorfenster im Debugger ("The frequency
> in megahertz read from the debug platform.  Usually selected by the
> user."). Ist diese die Taktfrequenz?

Ja.
(Was soll es auch sonst sein?)

> 2. Soweit ich verstehe, müssen ISR-Funktionen hardwaremäßig getriggert
> werden, um überhaupt zu laufen. Wie werden z.B. analoge Werte im
> Simulator geändert?

Den analogen Wert selbst kann man meines Wissens nicht so einfach 
verändern. Aber es hindert dich nichts und niemand, das Interrupt Flag 
im entsprechenden Register händisch zu setzen und in der ISR dann den 
Wert nach dem Auslesen aus dem betreffenden Register mit einem dir 
genehmen zu überschreiben.

> 3. Gibt's ausführliche Gebrauchsanweisungen darüber?

Nicht das ich wüsste (aber das heißt nicht viel. Irgendwo gibt es sicher 
eine Doku dazu). Aber es explodiert nichts, wenn man einfach mal Werte 
verändert, Menüpunkte aus dem Debug-Menü auswählt und ein wenig 
rumprobiert.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Ideee mit dem Scope ist schon ganz richtig, dabei aber bitte 
beachten das man die Zeit für das Port toggeln wieder abziehen muss. 
Genaus wird nicht mit einberechnet, was vor dem C Teil der 
Interruptfunktion passiert. Ich kenn mich jetzt mit der CPU nicht aus, 
aber da wird ja wohl auch schon was von der Hardware auf den Stack 
geschoben, sowas wie PC und Status Word.

Mann kann sich auch einen zweiten schnellen Timer als High Precision 
Timer benutzen, damit könnte man auch gleich Interrupt Latenzzeiten 
messen.

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.