Berechnung der Zeit, die eine Funktion in Mikrocontroller-Anwendungen benötigt

Ich möchte einen einfachen Profiler für meinen Mikrocontroller STM32F100VE schreiben. Ich habe gesehen, dass ich time.h einbinden kann und basierend auf den c-Standardfunktionen kann ich es verwenden, aber ich war verwirrt über _CLOCKS_PER_SEC_ 1000. Ich bin mir nicht sicher, ob dieser Ansatz funktionieren wird oder nicht.

Wie würde man versuchen, die Zeit zu messen, die eine Funktion in einer Mikrocontroller-Anwendung benötigt?

Müssen Sie wissen, wie viel Zeit die Funktion benötigt, um ausgeführt zu werden, oder müssen Sie wissen, wie viel Zeit die mcu in der Funktion verbringt, dh wie oft sie aufgerufen wird?
@VladimirCravero Ich möchte wissen, wie viel Zeit die MCU in dieser Funktion verbringt. Grundsätzlich führe ich eine Spielschleife aus und würde gerne wissen, wie viel diese Funktion von dieser Spielschleife "gegessen" hat, die mit 30 FPS synchronisiert ist.
Eine Methode, die ich zur Überprüfung des Designs verwendet habe, besteht darin, einen Port-Pin umzuschalten. Sie können ihn dann auf einem Oszilloskop betrachten. Normalerweise weiß ich, was es sein soll, aus der Simulation.
Die Spehro-Idee ist super, das habe ich früher auch gemacht. Bestätigen Sie einfach eine PIN, wenn Sie die Funktion aufrufen, und deaktivieren Sie sie, wenn Sie sie verlassen. Sie können überprüfen, wie oft es angerufen wird, wie lange es dauert, bis es zurückkommt, und so weiter. Beachten Sie: Ist die Funktion unterbrechbar?
@VladimirCravero Gute Idee. aber wie würden Sie die Delta-Zeit zwischen den beiden Pin-Triggern berechnen, wenn sie in Einheiten von Millisekunden angegeben werden soll.
Ähm... Du schaust dir nur das Zielfernrohr an und misst es? Ich gehe davon aus, dass Sie ein Zielfernrohr verwenden können ... Ich glaube nicht, dass ich die letzte Frage verstanden habe.
@VladimirCravero Wenn ich ein Zielfernrohr hätte, würde ich diese Frage nicht stellen ^__^. Ich kann es mir nicht leisten, nicht einmal einen ICD, deshalb suche ich nach einer äquivalenten time.h-Funktion, die mit dem stmf32 funktionieren kann.
Schauen Sie sich diese Frage an: electronic.stackexchange.com/questions/21941/…
Wenn Sie kein Oszilloskop haben, können Sie einen RC-Filter auf den Kippstift setzen und mit einem Multimeter sehen, was die (gemittelte) Ausgabe ist. Wenn Sie die Schleifenfrequenz kennen, können Sie auf die (durchschnittliche!) Zeit zurückrechnen, die Sie in der Routine verbringen.
@WoutervanOoijen Gute Idee. Viel besser als nichts.

Antworten (3)

Das grundlegendste Manöver für komplizierte Funktionen besteht darin, die integrierten Timer zu verwenden.

Je nachdem, wie Sie sie einrichten, können Sie sie dazu bringen, genau die Anzahl der Taktzyklen zu zählen, die für die Ausführung einer bestimmten Funktion erforderlich sind. Lesen Sie einfach den Timer vor dem Funktionsaufruf und dann wieder nach dem Funktionsaufruf aus.

Sie müssen den Assemblercode durchsehen, um zu wissen, wie viel Zeit Sie benötigen, um den Timer für die Leseaufrufe zu deaktivieren, aber wenn es sich um eine langwierige Funktion handelt oder es Ihnen nichts ausmacht, ein paar Taktzyklen zu erreichen, ist dies in Ordnung.

Der einzige Fehler bei der Umwandlung von Taktzyklen zurück in Zeit ist der mögliche Fehler in der Oszillationsfrequenz der Systemuhr. Auch dies ist für Funktionen, deren Ausführung viel Zeit in Anspruch nimmt, vernachlässigbar.

Es hört sich so an, als ob Sie in Ihrem Fall etwas um 30 Hz (30 FPS) wollen, was im Vergleich zum Zeitzyklus der Prozessoruhr eine sehr lange Zeit ist.

Gute Antwort, ich möchte nur hinzufügen, dass die genaue Taktfrequenz in diesem Fall wahrscheinlich keine Rolle spielt, wenn der gesamte Code von derselben Systemuhr ausgeführt wird. Normalerweise ist es die Anzahl der Taktzyklen, die erforderlich ist, um eine Funktion auszuführen, die am interessantesten ist.
@MathEE, können Sie den Ansatz zum Starten und Stoppen des Timers erklären? Ich würde den Timer zum Zählen starten, dann meine Funktion aufrufen und dann stoppen, der Wert des Timers wäre proportional zur in der Funktion verbrachten Zeit? aber wie würde ich den Wert vom Timer in Millisekunden umwandeln, die ausgegeben werden?
Sie können es entweder starten und stoppen oder Sie können es einfach laufen lassen und dann die Werte ablesen (sofern es nicht überläuft). Der Systemtakt hat eine Frequenz F C Y und nehmen wir an, Sie stellen Ihren Timer so ein, dass er bei jedem Tick der Systemuhr erhöht wird, dann ist die verstrichene Zeit (  Änderung des Timers ) / F C Y .

Wenn es eine kleine Funktion ist, könntest du dir einfach die Demontage ansehen und die Anweisungen zählen.

Leider habe ich keinen ICD.
Sie können den generierten Assembler ohne ICD betrachten. Welche Tools verwendest du? Ist es auch eine kleine Funktion?
Es ist eine Dreiecks-Rasterisierungsfunktion mit Aufrufen an den LCD-Framebuffer, um dort Pixel zu schreiben.
@Will Ihre kurze Antwort hat wertvolle Einblicke, würde aber als Kommentar besser funktionieren. Sie haben genug Ansehen, um Kommentare zu posten.
Einige preiswerte Handmessgeräte können Frequenz und Arbeitszyklus messen. Bsp.: TekPower TP4000ZC . (Beachten Sie, dass ein Benutzer behauptete, die Impedanz sei nicht sehr hoch. Ich bin mit meiner zufrieden genug ...)

Müssen Sie diese Informationen auch in Ihrer Software verwenden oder benötigen Sie sie nur für Debugging-/Entwicklungszwecke? Wenn es der zweite ist (ich nehme an, da Ihr Hauptziel die Profilerstellung ist), ist das Umschalten einer Ausgabe am Anfang und am Ende der Funktion und das Messen der Zeit mit einem Oszilloskop möglicherweise die schnellste, einfachste und genaueste Messung .

Das mache ich die ganze Zeit. Viel einfacher als das Einrichten eines anderen Timers.
Während die Verwendung eines Zielfernrohrs am schnellsten und einfachsten sein könnte, glaube ich nicht, dass es am genauesten ist. Die Verwendung der On-Chip-Timer ermöglicht es Ihnen, die Funktion über einen breiten Satz von Eingangsbedingungen über einen langen Zeitraum hinweg auszuüben. Sie können dann die maximale Ausführungszeit in tatsächlichen Taktzyklen finden. Bei Code mit erheblicher Variabilität wäre es schwierig, dies in einem Bereich zu erfassen.
@JoeHass: Viele moderne Oszilloskope verfügen über eine Funktion namens "Persistenzmodus", bei der aufeinanderfolgende Signale überlagert werden.