Forum: Mikrocontroller und Digitale Elektronik ARM/STM32: Profiling


von Walter T. (nicolas)


Lesenswert?

Hallo zusammen,

in einem anderen Thread ist mal wieder das Thema "blos nicht optimieren, 
wo kein Bottleneck ist" dran.

Da drängt sich natürlich die Frage auf: Wie identifiziert ihr 
Bottlenecks? Wenn ich den Verdacht habe, eine Funktion könnte 
zeitkritisch sein, zähle ich manchmal die Takte mit dem 
DWT_CYCCNT-Taktzähler. Manchmal wird auch ein freier Pin vor der 
Funktion gesetzt, nach der Funktion zurückgesetzt und mit dem 
Oszilloskop der Tastgrad betrachtet.

Das funktioniert natürlich nur an den Stellen, wo man schon vorher weiß, 
wo man suchen muss. ISRs sind da oft der heiße Kandidat.

Bei den meisten Sachen ist es eher ein: "Wird schon so passen. Ich gebe 
mir jetzt bei dieser neuen Funktion keine wahnsinnige Mühe der perfekten 
Optimierung, aber ich achte schon ein bischen darauf, einen möglichst 
kleinen Fußabdruck ohne große Verrenkungen hinzubekommen."

Wie siet es bei euch aus? Habt ihr edle Werkzeuge wie Lauterbach & Co. 
für diesen Zweck zur Verfügung, oder behelft ihr euch anderweitig?

von Peter (Gast)


Lesenswert?

Wenn es sein muss lass ich einen Timer laufen der mir die Mikrosekunden 
zählt. Das genügt für meine Zwecke - jedenfalls bisher.

Und um welches Timing gehts bei Dir ?

Gruß Peter

von Walter T. (nicolas)


Lesenswert?

Peter schrieb:
> Und um welches Timing gehts bei Dir ?

Es geht um Profiling - wissen, welche Funktion/Funktionalität optimiert 
gehört und welche in Ruhe gelassen werden kann (und sollte).

: Bearbeitet durch User
von Andreas M. (amesser)


Lesenswert?

Walter T. schrieb:
> Wie siet es bei euch aus? Habt ihr edle Werkzeuge wie Lauterbach & Co.
> für diesen Zweck zur Verfügung, oder behelft ihr euch anderweitig?

Ja :-). Allerdings benutze ich auch gerne den DWT_CYCCNT, für einfache 
Sachen reicht das locker aus, in ISRs auch. Wenn man ein Betriebssystem 
hat, dann muss man aber aufpassen, wenn der Scheduler einen Taskwechsel 
macht oder eine ISR dazwischenfunkt dann ist der Zykluszähler hinfällig. 
Bei dynamischen Prozessorclocks wirds auch ekelig. Manche Debugger 
spielen auch selbst am DWT_CYCCNT rum. Da muss man aufpassen.

Der ETM/SWD Trace ist schon eine geniale Sache wenn man es zur Verfügung 
hat. Prinzipiell kann das wohl sogar der OpenOCD, stehen zumindest 
Stichworte im Manual dazu. Allerdings steht und fällt das Ganze mit der 
Aufbereitung der Daten. Und da macht Lauterbach einen sehr guten Job, 
die grafische Ansicht ist gut gemacht. Performancemessung ist aber eher 
ein Nebenschauplatz. Gerade wenn Ursache und Wirkung im Programmablauf 
weit auseinander liegen, dann ist so ein Trace extrem hilfreich.

Eine weitere Möglichkeit Zeiten zu messen, ist es Hardwaretimer zu 
benutzen. Diese haben den Vorteil, das man die oft unabhängig vom 
Prozessorclock laufen lassen kann. Sowas verwenden wir teilweise auch in 
der Finalen Software um zur Laufzeit Performancedaten zu sammeln.

von Uwe B. (Firma: TU Darmstadt) (uwebonnes)


Lesenswert?


von Klaus W. (mfgkw)


Lesenswert?

Wennn man einen Pin frei hat, kann man auch einfach am Anfang einer 
Rechnererei eine LED anschalten und am Ende wieder aus. Da sieht man 
sehr schön, ob sich was tut oder der Teil eh kaum Zeit kostet (dunkel).

Ein Oszi geht natürlich auch.

von Random .. (thorstendb) Benutzerseite


Lesenswert?

Ich mache das ganze gerne grafisch im MDK-ARM SystemAnalyzer (bzw. 
vorher im Logic Analyzer und Event Viewer), dafür brauchts aber nen 
schnellen SWO sampler. Besonders interessant für Interrupt-Laufzeiten.
Auf die Weise hab ich bei einem Projekt mit Ethernet und Showlaser die 
Engstellen > 100kpps sowie gelegentliche HickUps finden können, wenn man 
verschiedene Events und eigene Instrumentierungen (Variablen im Code, 
zur Darstellung via SWO) in Zusammenhang bringt.
Ausmessen einzelner Routinen via Timer oder DWT funktioniert immer 
prima, bei größeren Zusammenhängen zwischen Threads und Interrupts ist 
eine grafische Darstellung manchmal hilfreich.

: Bearbeitet durch User
von PittyJ (Gast)


Lesenswert?

Ich nehme meistens die Timer. Das reicht oft aus.
Bei Interrupt-Funktionen habe ich auch schon mal Pins gesetzt, damit man 
mit dem Scope schauen konnte.
Auf meinen aktuellen Plattformen habe ich genug Reserve, so dass ich das 
nicht oft machen muss.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.