Forum: Compiler & IDEs Dauer der ISR-Funktionen


von Owen S. (senmeis)


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

von Karl H. (kbuchegg)


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.

von Owen S. (senmeis)


Lesenswert?

Vielen Dank.

Ich habe das List File mit dem AVR Stuido generieren lassen. In diesem 
File gibt es 130 Befehle, also wie folgt:
1
ISR(ADC_vect) 
2
{
3
  bc78:  1f 92         push  r1
4
  ...
5
  bd7c:  1f 90         pop  r1
6
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

von (prx) A. K. (prx)


Lesenswert?

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

von 900ss (900ss)


Lesenswert?

Falls du ein Scope und einen freien Portpin hast...
1
ISR(xyz)
2
{
3
  Portpin=On;
4
  Tu sonst was.....
5
  Portpin=Off;
6
}

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.

von Owen S. (senmeis)


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

von Justus S. (jussa)


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...

von P. S. (Gast)


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. :-)

von (prx) A. K. (prx)


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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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...

von Thomas K. (tomk)


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

von Owen S. (senmeis)


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

von (prx) A. K. (prx)


Lesenswert?

Wenn die ISR bei 8MHz 123 Takte braucht, dann braucht sie auch bei 4MHz 
123 Takte.

von Karl H. (kbuchegg)


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.

von Gast (Gast)


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.

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.