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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.