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
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.
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
Nein. Nicht jeder Befehl benötigt 1 Takt. Und nicht jeder Befehl wird ausgeführt, wenn sich darunter auch Sprungbefehle befinden sollten.
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.
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
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...
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. :-)
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.
> 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...
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
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
Wenn die ISR bei 8MHz 123 Takte braucht, dann braucht sie auch bei 4MHz 123 Takte.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.