@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!
|