Cortex M3/M4: ISR overhead
Hallo zusammen,
ich arbeite mich gerade durch das ARM-Assembler-Tutorial, was mal wieder
ein paar grundsätzliche Fragen auf den Tisch geworfen hat.
Wie groß ist eigentlich der Overhead durch den Aufruf einer ISR? So
ziemlich alles, was ich dazu finde, beschäftigt sich nur mit der Latenz
beim Aufruf der ISR (Stacking und Prefetch). Da wird allgemein von 12 *
w Takten bis zum Laden der ersten Instruktion der ISR ausgegangen (mit w
der Anzahl der wait states des Speichers).
(Zum Stacking und Wait States hier:
https://community.arm.com/developer/ip-products/processors/b/processors-ip-blog/posts/beginner-guide-on-interrupt-latency-and-interrupt-latency-of-the-arm-cortex-m-processors
)
Ich finde allerdings keine Informationen zum Verlassen der ISR. (Die
Information, die zu finden ist, bezieht sich hauptsächlich auf das
Aneinanderreihen unterschiedlicher ISRs.) Das unstacking wird wohl
mindestens noch einmal 12 Takte benötigen. Oder mehr?
Wenn ich auf einem STM32F446 mit 168 MHz eine ISR mit 1 MHz und einer
NOP-Instruktion aufrufe - welche Auslastung habe ich dann?
1 | Stacking + Prefetch: 12 Takte * 5 Waitstates
|
2 | NOP: 1 Takt
|
3 | Unstacking: 12(?) Takte * 5 Waitstates
|
4 | ---
|
5 | Summe: 121 Takte
|
6 |
|
7 | 121 Takte * 1 MHz/168 MHz = 72% Auslastung durch die NOP-ISR?
|
Der Wert muss falsch sein - sonst würde gar nichts mehr gehen, wenn ich
eine ISR mit 44 Takten mit 1 MHz aufrufe (und das habe ich getestet).
Also berücksichtige ich zumindest schon die Wait States falsch. Aber wie
geht es richtig?