Interrupt Laenge bestimmen

Gast #1040456
Lesenswert?

Hallo Leute,
bin gerade an meinem ersten MC Projekt, es geht um
Software PWM. Meine Frage bezieht sich aber auf folgendes:
Kann ich beim AVR Studio bestimmen wie lang mein Interrupt dauert?
Mit Breakpoints ist klar, aber wenn ich wissen will, was die laengste 
Abarbeitungszeit ueber eine Gewisse Simulationszeit war. Kann ich das
irgendwo nachvollziehen? Waere auch interessant fuer andere Funktionen,
aber hier muss ich wissen wie lange der max ISR dauert um den Timer
entsprechend anzupassen.
z.B. die max Taktzahl zum abarbeiten folgender Routine:
(Atmega8515, 8MHz, AVRStudio)
Danke schonmal und schenes Wochenende

ISR(TIMER1_COMPA_vect) {
    static uint8_t pwm_cnt=0;
    uint8_t tmp=0, i=0, j=1;
    OCR1A += (uint16_t)T_PWM;  //Compare Register erhoehen

    for (; i<3; i++) {
      if (pwm_setting[i] > pwm_cnt){
         tmp |= j;
                     j<<=1;
    }
       else {
       j<<=1;
    }
  }

    PWM_PORT = tmp;      // PWMs aktualisieren

    if (pwm_cnt>=(uint8_t)(PWM_STEPS-1)){
        pwm_cnt=0;
  pwm_sine_step++;
  }
    else
        pwm_cnt++;

}
#1040462
Lesenswert?

Also erstmal sieht man das am C Code gar nicht. Dazu musst du dir den 
entsprechenden Assembler-Code anschauen, den dein Compiler daraus macht. 
Und dann einfach nachzählen ;-)

Ansonsten simulierste das halt mit AVRStudio und schaust auf den Cycle 
Counter vor der ISR und danach.

MfG
Marius
Persönliche Seite #1045515
Lesenswert?

tobias wrote:

> Kann ich beim AVR Studio bestimmen wie lang mein Interrupt dauert?

Nein.

Wie gesagt: HEX-Code oder asm anschauen und das Maximum über alle Pfade 
bilden. Bei Neucompilierung kannst aber prinzipiell alles neu 
durchzählen (andere Optionen, Compiler-Version, Makros, etc.)

Denkbar wäre, daß ein Compiler für spezielle Fälle ne WCET, also ne 
statische Laufzeitanalyse macht. GCC zumindest kann das jedoch nicht.

Oder man hat das nötige Kleingeld für Tools wie

http://www.absint.de/ait/
Persönliche Seite #1045585
Lesenswert?

Falk Brunner wrote:
> @ Johann L. (gjlayde) Benutzerseite
>
>>> Kann ich beim AVR Studio bestimmen wie lang mein Interrupt dauert?
>
>>Nein.
>
> Blödsinn. Das kann man wunderbar und auf den Takt genau simulieren und
> messen. Im AVR-Studio. Been tere, done that. Siehe Interrupt.

Vielleicht für einen Spezielfall.

Was machst Du bei Abhängigkeit von globalen Variablen/SFRs, Schleifen 
und Verzweigungen die evtl davon abhängen? In diesem Fall musst Du alle 
Pfade statisch abschätzen/analysieren.

Die vorliegende ISR ist einfach, aber schon wenn du Flags abtestest, ist 
einfach ne Zeit stoppen naiv.

Von daher: AVR Studio kann Zeiten stoppen aber keine statischen Analysen 
ausführen. Beides mögen in Spezialfällen wie hier gleich sein, im 
allgemeinen Fall sind sie es nicht. D.h du hast hier mit dem Blick auf 
den Code erkannt, daß beide übereinstimmen.
#1045766
Lesenswert?

@Johann L. (gjlayde)

>Vielleicht für einen Spezielfall.

Man kann den Worst Case simulieren, das reicht in fast allen Fällen.

>Die vorliegende ISR ist einfach, aber schon wenn du Flags abtestest, ist
>einfach ne Zeit stoppen naiv.

Nöö, man muss halt den längsten Pfad durchlaufen. Einmal mit und einmal 
ohne gesetztes Flag und dann vergleichen.

>Von daher: AVR Studio kann Zeiten stoppen aber keine statischen Analysen
>ausführen.

Das war gar nicht die Frage.

MFG
Falk
Persönliche Seite #1046160
Lesenswert?

Falk Brunner wrote:
> @Johann L. (gjlayde)
>
>>Vielleicht für einen Spezielfall.
>
> Man kann den Worst Case simulieren, das reicht in fast allen Fällen.

Das Problem ist nicht, den worst case zu simulieren, sondern ihn zu 
finden (im Sinne der Variablen, des Maschinenzustandes, die ihn 
erzeugen).

> Nöö, man muss halt den längsten Pfad durchlaufen. Einmal mit und einmal
> ohne gesetztes Flag und dann vergleichen.

Konkret ist die Zeit abhängig von den Werten von pwm_setting[] und von 
pwm_cnt und T_PWM.

>>Von daher: AVR Studio kann Zeiten stoppen aber keine statischen Analysen
>>ausführen.
>
> Das war gar nicht die Frage.

>> die max Taktzahl zum abarbeiten folgender Routine:

Was ist das anderes als eine statische Abschätzung? Woher bist du 
sicher, daß eine Simulation die max Anzahl liefern, wenn nicht 
dadurch, dich per Blick in den Code darüber zu versichern?

AStudio übernimmt hier die Schweißarbeit des Taktzählens für einen 
bestimmten Zustand der Maschine. Mehr nicht.

Anhand des obigen C-Codes siehtst du noch nichtmal, ob T_PWM ein Makro 
ist, das zu einer Compilerzeit-Konstanten auflöst, oder nicht.
#1046452
Lesenswert?

@ Johann L. (gjlayde) Benutzerseite

>Das Problem ist nicht, den worst case zu simulieren, sondern ihn zu
>finden (im Sinne der Variablen, des Maschinenzustandes, die ihn
>erzeugen).

Bei dem Beispiel des OPs? Hust, nicht wirklich.

>Konkret ist die Zeit abhängig von den Werten von pwm_setting[] und von
>pwm_cnt und T_PWM.

Im Beispiel durchaus überschaubar. ;-)

>AStudio übernimmt hier die Schweißarbeit des Taktzählens für einen
>bestimmten Zustand der Maschine. Mehr nicht.

Na das ist schon mal Einiges.

>Anhand des obigen C-Codes siehtst du noch nichtmal, ob T_PWM ein Makro
>ist, das zu einer Compilerzeit-Konstanten auflöst, oder nicht.

Tja, aber der OP wird  mit den Superanlaysetools auch ein wenig 
überfordert sein. Und da er was lernen will, ist Hand-, respektive 
Kopfarbeit der beste Lösungsweg hier.

MFG
Falk
#1047222
Lesenswert?

Soetwas mache ich immer so, daß ich mir einen freien Pin nehme, der zu 
Beginn auf low steht; bei Eintritt in die ISR setze ich ihn auf high, 
beim Ende wieder auf low. Mittels Oszilloskop oder Digitalzähler kann 
man dann sehr leicht die Interruptlänge messen (bis auf einige us wegen 
des ISR-Overheads). Man kann auch zählen, wie oft der Interrupt eintrat.

Diese Methode ist auch gut geeignet, um innerhalb eines beliebigen 
Programmablaufs Zeiten zu 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