Latenzzeit verkürzen - MSP430 - aber wie??

#1022559
Lesenswert?

Aus den LPM oder aus dem Active Mode? 500ns wären gerade mal 8 Takte, 
das wird schon aus dem Active Mode knapp. Sind ja mehrere Pushs und erst 
mal den aktuellen alten Befehl abarbeiten. Ein Interrupt-Einsprung 
benötigt mindestens 6 MCLK Zyklen, wenn noch irgendwelche Variablen auf 
den Stack wandern, noch mehr. Die Abarbeitung des aktuellen Befehls kann 
ebenfalls bis zu 6 MCLK Zyklen dauern...
Gast #1023155
Lesenswert?

@Christian
>Die Abarbeitung des aktuellen Befehls kann
>ebenfalls bis zu 6 MCLK Zyklen dauern...
Das klingt zwar logisch, da ein Befehl max. 6TZ dauern kann.
Auf der anderen Seite sagt der User-Guide (Kap.2.2.3), dass in den 6TZ 
Latenzzeit die Abarbeitung des aktuellen Befehls schon mit drin sei.
Was stimmt denn nun ?

@U.Nauber
Wie schon gesagt wurde, steigt die Latenzzeit mit der Anzahl der 
Register, die vor dem Aufruf der ISR noch gesichert werden müssen.
Eine Möglichkeit das etwas einzudämmen, wäre vielleicht die Benutzung 
von globalen Variablen in der ISR, da lokale Variablen oft in Registern 
gehalten werden, die dann eben, um in der ISR "frei" zu sein, vorher 
gesichert werden müssen.
Das Ergebnis kannst Du Dir im Ausgabelisting deiner ISR-Funktion 
anschauen.
Ein schlechtes (Zeit-) verhalten wäre dann z.B.:
1
          __interrupt void TMRA_CCR1_CCR2_Interrupt (void)   
2
   \                     TMRA_CCR1_CCR2_Interrupt:
3
   \   000000   0A12         PUSH.W  R10
4
   \   000002   0B12         PUSH.W  R11
5
   \   000004   0D12         PUSH.W  R13
6
   \   000006   0C12         PUSH.W  R12
7
   \   000008   0F12         PUSH.W  R15
8
   \   00000A   0E12         PUSH.W  R14  
9
// Kostet 6x3TZ = 18TZ extra Zeit!
#1023232
Lesenswert?

Stefan wrote:
> @Christian
>>Die Abarbeitung des aktuellen Befehls kann
>>ebenfalls bis zu 6 MCLK Zyklen dauern...
> Das klingt zwar logisch, da ein Befehl max. 6TZ dauern kann.
> Auf der anderen Seite sagt der User-Guide (Kap.2.2.3), dass in den 6TZ
> Latenzzeit die Abarbeitung des aktuellen Befehls schon mit drin sei.
> Was stimmt denn nun ?


Nur 6 Zyklen kann ja nicht sein, denn 6 Zyklen braucht es schon, um das 
Statusregister und den Stack zu sichern. Dazu kommt auf jeden Fall die 
Abarbeitung des letzten Befehls, im günstigsten Fall 0 Zyklen, im 
ungünstigsten halt noch 6 Zyklen. Der Rücksprung dauert ebenfalls 
mindestens 5 Zyklen. Meist noch viel länger, da wie gesagt meist noch 
einige Register gesichert und wiederhergestellt werden.

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