Dauer der ISR-Funktionen

OP #1406799
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
OP #1407755
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
#1409291
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.
OP #1410342
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
#1410351
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...
#1410382
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.
#1410516
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
OP #1411986
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
#1412051
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.
Gast #1415080
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren