Hallo zusammen,
ich mache mich in meinen ersten Gehversuche mit Assembler. Ich habe eine
kleine ISR geschrieben und wundere mich, wie sich die Ausfuehrungsdauer
unterscheidet.
Die Funktion sieht so aus:
Man sieht: Die Funktion ist extrem kurz und ist eine Timer-ISR. Jetzt
der merkwürdige Teil: Ist der Wert "v" = 0, variiert die Ausführungszeit
(der Wert in "min" und "max") schon um 17...22 Takte. Das finde ich
schon sehr merkwürdig, weil in diesem Fall nichts bedingt ausgeführt
wird.
Sobald "v" größer als Null ist, wird die Bandbreite noch größer mit
einem Maximum von 36 Takten.
Ich habe mal versucht, die Takte zu zählen (wie in
https://developer.arm.com/documentation/ddi0439/b/CHDDIGAC ). Ich komme
auf 12+P Takte. Also 5 bis 10 Takte für den Pipeline-Refill nach dem
Branch? (In der Doku steht "3-stage-Pipeline", also hätte ich mit 3 oder
4 Takten gerechnet.)
14 Takte innerhalb [bcc 1f...1:] scheint ja zu passen (wobei da der
Pipeline-Flush fehlt).
Kurzum: Wo verzähle ich mich?
Du hast glaube ich vergessen des der Einsprung und der Aussprung auch
etliche Tackte benötigt.
https://interrupt.memfault.com/blog/arm-cortex-m-exceptions-and-nvic#tail-chaining
Dazu kommt noch der Zeitpunkt wo das Interrupt auftritt und was die CPU
gerade macht und wann sie beschließt auf dem Interrupt zu reagieren usw.
Meistens ist das mit dem Tackte zählen bei den derzeit gängigen
Prozessoren nicht mehr wirklich in allen Fällen sauber möglich.
Da kommen einfach zu viele Faktoren mit rein die man gar nicht mehr
Tackt genau berechnen kann.
- Die Piplines und wenn welche Stufe davon gültig bleiben oder nicht
- Die Caches was diese beinhalten bzw. wann das Ding meint diese seinen
ungültig
- Zugriff auf den Speicher mit Wartezyklen (die aber teilweise durch
abwechselnden Zugriff auf zwei bänke kaschiert werden) und auch
Wartezeiten, weil gerade irgend ein anderer Hardwareteil den Bus belegt
usw.
- und noch einiges mehr...
Irgend W. schrieb:> Du hast glaube ich vergessen des der Einsprung und der Aussprung auch> etliche Tackte benötigt.
Der Teil ist ja alles außerhalb dessen was im Profiling berücksicht
wird. Leider wird es auch wohl mit meinem Werkzeug nicht möglich sein,
ein- und Aussprung aus ISRs zu berücksichtigen.
Berücksichtigt ist ja nur der Bereich zwischen den Zeilen 40 und 72,
wobei der Bereich der Zeilen 56 bis 69 nicht durchlaufen wird. Und da
finde ich nichts, was eine unterschiedliche Anzahl an Prozessorzyklen
verbrauchen könnte.
Bei diesen CPUs bringt Taktzählen nicht mehr viel. Jenachdem in welchem
Speicher das Programm liegt (CCM, RAM, Flash), variiert die Laufzeit.
Wenn Zugriffe (auch I/O-Zugriffe) dann noch über die Busmatrix gehen
oder gar auf asynchronen Bussen (z.B. APB) landen, kannst du gleich
Würfeln ...