STM32-Ausführungszeit

Ich arbeite mit einem STM32F4 Discovery Board und möchte berechnen, wie viel Zeit für einige Aufgaben benötigt wird. Ich verwende Atollic mit einem SW4STM32-Debugger. Ich kann nicht herausfinden, wie es geht.

Ich habe etwas über das Senden von Nachrichten an die Konsole und das anschließende Messen dieser Zeit gelesen, weiß aber nicht, wie ich Nachrichten an die Konsole senden soll. Kannst du mir helfen? Danke!

Normalerweise verwende ich ein Oszilloskop, aber die DWT-Einheit im Cortex-Kern ist dafür großartig: embeddedb.blogspot.com/2013/10/… ... Ich benutze es oft, um die maximalen und minimalen Ausführungszeiten meiner Hauptschleife dabei zu protokollieren meine Firmware-Timing-Analyse. Es ist auch praktisch, diese schrecklichen festen Verzögerungen zu erzeugen, die so oft überstrapaziert werden.
Du fragst zwei verschiedene Dinge. Bei welchem ​​Teil brauchst du eigentlich Hilfe? Zeit messen oder auf die Konsole drucken?
Probieren Sie den Systick- oder DWT-Timer aus. Vermeiden Sie Hal-Bibliotheken, wenn Sie die Messung durchführen. Sie fügen der Messung Unbekannte hinzu. Verwenden Sie Nops im Bootstrap, um die Abrufausrichtung anzupassen und sich einem Min/Max der Zeit anzunähern. Probieren Sie Ram vs. Rom aus, wenn Sie mehr Leistung benötigen, das Rom ist oft der erste Engpass für die Leistung, mit einem STM32, obwohl sie Caching haben, können Sie es nicht abschalten (mit einem Marketingbegriff), wodurch das Rom schneller erscheint, als es ist. würde empfehlen, im ram zu testen, dann diese zahl um einen faktor zu verringern und dann im rom laufen zu lassen.
Die Leistung ist auf diesen Geräten nicht unbedingt linear, insbesondere wenn Sie einen HAL verwenden. Probieren Sie Ihre Kandidatenfrequenzeinstellungen aus. Wenn Sie sie ändern, testen Sie sie erneut.
Wie beim Timer, wenn Sie ein Oszilloskop auf einem GPIO verwenden, ist die Verwendung der HAL zum Einrichten des GPIO in Ordnung (obwohl es viel einfacher ist, dies nicht zu tun), aber der Speicher, um den GPIO-Status zu ändern, für den Sie kein Hal verwenden möchten, um zu reduzieren, wie viel es wirkt sich auf die Leistung aus.

Antworten (3)

Zusätzlich zu anderen Antworten können Sie ein Oszilloskop verwenden, wenn Sie eines haben.

Stellen Sie zu Beginn Ihrer Aufgabe einen unbenutzten Pin (oder eine LED usw.) hoch. Setzen Sie es dann direkt nach Abschluss der Aufgabe auf niedrig. Das O-Scope kann Ihnen die Dauer anzeigen.

Denken Sie daran, dass Sie, wenn Sie über die HAL oder über eine Funktion auf die Pin-Funktionen zugreifen, ein paar Stunden Zeit haben, um alle Anweisungen zu erhalten, die beim Ein- und Aussteigen aus der Funktion erforderlich sind. (falls das Sinn macht)
Sehr wahr, @laptop2d! Ich weiß nicht, ob er Nanosekunden oder Millisekunden zählt :) Oder ganze Sekunden, nehme ich an ...
Das ist eine gute Idee! Ich möchte nur wissen, wie lange es dauert, einen Prozess durchzuführen. Ich denke, die einfachste Idee ist, einen Timer auf 0 zu setzen, den Prozess auszuführen und dann den Wert meines Timers zu lesen. Danke für deinen Rat!

1) Verwenden Sie den in Ihrem Compiler enthaltenen Profiler (falls vorhanden)
2) Verwenden Sie einen der Timer, starten Sie den Timer direkt vor und nach dem Code, den Sie zeitlich festlegen möchten.
3) Sehen Sie sich den Assemblercode an und beginnen Sie mit dem Zählen der Taktzyklen , indem Sie sie im Programmierhandbuch finden und herausfinden, wie viele Taktzyklen verwendet werden, erhalten Sie die Gesamtzahl der Taktzyklen und multiplizieren Sie sie mit der Kernfrequenz.

Seien Sie vorsichtig mit der Taktzykluszählung auf Cortex-Chips. Sie müssen Wartezustände in Ihren Bussen und in einigen Situationen Verzögerungen in der Befehlspipeline überprüfen. Es kann aber getan werden.
Das Zählen funktioniert nicht, da sich die Anweisungen in der Warteschlange befinden und sich in einer anderen Decodierungs- / Ausführungsstufe befinden.
@PeterJ Wenn der Codepfad Verzweigungen oder Anweisungen enthält, die mehrere Taktzyklen benötigen, müssen Sie dies berücksichtigen.
@laptop2d es gibt noch mehr zu beachten - jedes ausgelöste Ereignis (wie Interrupt) leert den Cache usw. usw. Das Zählen von Taktzyklen funktioniert nicht auf ARM-Geräten !!
Schalten Sie also Interrupts in dem Abschnitt aus, in dem Sie zählen, und lassen Sie sie aus
Es ist trivial zu zeigen, dass Zählanweisungen nicht funktionieren. Abrufausrichtung, Caching, Laden/Speichern vs. Nicht-Laden/Speichern, Ram vs. Rom usw. Wenn Sie dasselbe Maschinencodesegment verwenden, können Sie sehen, dass es mit unterschiedlichen Geschwindigkeiten auf derselben CPU ausgeführt wird, ohne Interrupts oder andere ähnliche Störungen, die nur weniger konsequent machen.
interne Timer, brauchen kein dwt, der Systick ist in Ordnung oder andere, und die Verwendung eines Oszilloskops, wenn Sie eines haben, und eines gpio kann helfen, aber gleichzeitig beeinflussen Sie die Leistung, indem Sie die Leistung messen.
Ja, ein Oszilloskop ist eine externe Zeitreferenz, muss die Leistung durch die Genauigkeit des Quarzes verschlechtern oder viele Teile ausprobieren und das Schlechteste finden usw. Sobald Sie eine Messung in Einheiten von Takten erhalten, müssen Sie immer noch basierend darauf anpassen Genauigkeit der Uhrenreferenz zur Wanduhrzeit.

Normalerweise schalte ich einen Stift um und messe die Zeit mit einem Oszilloskop. Dies ist die am wenigsten fehleranfällige Methode. Wenn Sie dies im Code tun möchten, würde ich vorschlagen, den Systick-Timer auf Mikrosekunden-Präzision einzustellen (SystemCoreClock / 1000000). Dies hat jedoch immer eine Drift, abhängig von der Hauptkristallpräzision, so dass Sie rtc verwenden möchten, um genau zu zählen, wie viele Zyklen Sie in 1s erhalten, und dann Ihre Ergebnisse entsprechend zu skalieren.

Die Systick-Timer-Drift oder nicht läuft mit derselben Uhr wie die Kern-CPU, ist also am genauesten (die DWT ist nur ein weiterer Timer mit derselben Uhr, kann also auch funktionieren). Zugegeben, wenn es andere Taktdomänen auf anderen Taktreferenzen gibt, müssen Sie sich damit befassen.
Der System-Tick-Timer ist nur so genau wie Ihr LSE-Quarz, der um mehrere % von der Spezifikation abweichen kann. Sie können leicht Szenarien haben, in denen Sie 1100000 us in einer Sekunde erhalten. Sie müssen diese Ungenauigkeit also unbedingt kompensieren, indem Sie den Mikrosekundenzähler auf die Anzahl der in einer Sekunde gemessenen Mikrosekunden entsprechend dem Echtzeituhr-Peripheriegerät skalieren, das von dem 32768-kHz-Quarz läuft, der speziell für Genauigkeit entwickelt wurde, Ihnen aber keine Mikrosekundenpräzision bietet .
Die CPU kann nicht mehr Befehle ausführen, weil die Uhr langsam ist. Drift in der Uhr ist nicht relevant für Taktzyklen, die erforderlich sind, um eine bestimmte Aufgabe auszuführen (alle anderen Faktoren werden konstant gehalten). Die Wanduhrzeit misst also nur Nuancen eines Chips, nicht wie lange es dauert, etwas zu tun. Später, wenn Sie die Anzahl der Anweisungen optimieren, können Sie Jitter in der Uhr oder die Genauigkeit des Kristalls kompensieren. Abhängig von der Uhr können Sie im Laufe eines Tages oder einer Stunde Abweichungen haben, die keine Zyklen pro Aufgabe sehen.
intern und extern gleichzeitig ist in Ordnung, vernachlässigen Sie nur nicht das Innere. schlechte Messungen sind leider bei allen Messmethoden weit verbreitet und führen zu schlechten Annahmen und Experimenten.
Eine RTC ist nur so genau wie die verwendete Uhr. Sie können nicht allgemein sagen, dass eine RTC genauer ist als ein MCU-Timer, da beide nur dumme Timer sind, die von einer Uhr angetrieben werden. Beachten Sie, dass einige (STM32 und andere) MCU RTCs haben, sodass Sie das OP möglicherweise verwirren, wenn sie eine HAL verwenden, und die interne RTC ist möglicherweise nicht besser dran, abhängig von den Uhren. Wenn sie den genaueren Kristall angeschlossen haben, können sie diesen manchmal einfach verwenden, ohne die zusätzliche Arbeit für die Verwendung des RTC. Grundsätzlich ist ein RTC nicht automatisch genauer als ein Oszilloskop oder eine andere Messung.